继承 关键词(extends)还有延伸扩展之意,表示在基础上进行扩展,基类的表示父类,扩展的表示子类。
好处:解决了代码冗余,是实现代码重用,增加了软件的扩充性。
语法格式: Java 只支持单继承。
访问修饰符 class 子类 extends 父类 { }
访问修饰符如果是public 在整个项目中可以访问,如果不写该类只能在包内可见。
子类可以从父类中继承的内容:
1、可以继承父类中public 和 protected 修饰的属性和方法,不论子类和父类是否在同一个包里
2、如果子类和父类在同一个包里,可以继承默认访问修饰符修饰的属性和方法
3、无法继承父类的构造方法,可以在子类中通过 super() 进行调用
子类调用父类方法:
1、通过super 访问父类构造方法,属性,方法
//访问父类构造方法 super(参数)
//例子 public ErHa(String name,int age,String weight) { super(name,age); //调用父类有参构造方法 this.weight =weight; }
//访问父类方法或属性 super.父类方法 //子类中的方法 public void showTest() { //父类中的方法 属性 super.showPrint1("er"); super.name = "obge"; }
2、super与this
this用于 在成员变量与局部变量名称相同的时候,通过this.成员变量进行引用。
super 用于子类中访问父类的构造方法,方法和变量,但是private 修饰的不能访问
3、实例化子类
使用继承之后,实例化子类,可以通过子类对象名访问父类方法
调用步骤:
子类实例化首先执行父类的构造方法,然后执行子类构造方法,Java虚拟机在实例化子类对象时按照从父类到子类的步骤执行
规则:
1、如果写了有参构造方法,就不会自动生成无参构造方法,所以如果父类写了有参构造方法,没有写无参构造方法,实例化子类会报错
2、如果父类没有写构造方法,这时实例化子类没事
3、如果子类通过super 显示调用父类有参构造方法,那么就不会执行父类无参构造方法
//例子 //头头 package com.obge.obj; public class Person { String name; public Person(){ System.out.println("执行Person无参"); } public Person(String name){ this.name =name; System.out.println("执行Person有参"); } } //父类 package com.obge.obj; public class Student extends Person { String school; public Student() { System.out.println("执行stu无参"); } public Student(String name,String school) { //调用父类方法 super(name); this.school =school; System.out.println("执行stu有参"); } } //最小 package com.obge.obj; public class SmallStu extends Student{ String teacher; public SmallStu() { System.out.println("执行SmallStu无参"); } public SmallStu(String name,String school,String teacher) { //调用父类方法 super(name,school); this.teacher =teacher; System.out.println("执行SmallStu有参"); } }
重要
1、Object 所有类的父类。所有的Java类都直接或间接继承了java.lang.Object
没有写extend关键字的类,Object 是这个类的直接父类,object常用重要方法
2、super与this
this用于 在成员变量与局部变量名称相同的时候,通过this.成员变量进行引用。
super 用于子类中访问父类的构造方法,方法和变量,但是private 修饰的不能访问
3、方法重写
定义:对从父类继承的方法进行重新编写,称为方法重写或方法覆盖(Overriding)
要求:
a、重写的方法名与被重写的方法名相同
b、重写的方法与被重写的方法,具有相同的参数列表
c、重写的方法的返回值类型与被重写的方法的返回值类型相同
d、重写的方法不能将被重写的方法的访问权限缩小
总结:方法重写,在父子类中,子类可重写方法名,参数列表和返回值类型相同的方法,但不能缩小父类方法的 访问权限