继承
继承就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以访问父类中的非私有的属性和行为
好处:
1、提高代码的复用性
2、类与类之间产生了关系,是多态的前提
通过extends关键字,可以声明一个子类继承另一个父类格式如下:
class 父类{
…
}
class 子类 extends 父类{
…
}
继承后的特点–成员变量
成员变量不重名
如果子类父类中出现不重名的成员变量,这时访问是没有影响的
成员变量重名
子父类中出现了同名的成员变量时,在子类需要访问父类中非私有成员变变量时,需要使用super关键字,修饰父类成员变量,类似于之前学过的this。使用格式:super.父类成员变量名
public class Demo01Extend {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
public class Fu {
int num =5;
public void show(){
System.out.println("Fu show");
}
}
public class Zi extends Fu{
int num1 =20;
int num = 6;
public void show(){
System.out.println("Fu num ="+super.num);//访问父类中的num
System.out.println("Zi num ="+this.num);//访问子类中的num
System.out.println("Zi show");
}
}
PS:父类中的成员变量是非私有的,子类可以直接访问。若父类中的成员变量私有了,子类是不能直接访问的,通常编码时,我们遵循封装的原则,使用private修饰成员变量,那么如何访问父类的私有成员变量,可以在父类中提供公共的getXxx和SetXxx方法
继承后的特点–成员方法
成员方法不重名
如果子类父类中出现不重名的成员方法,这时是没有影响的
成员方法重名–重写(override)
方法重写:子类出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或复写。申明不变重新实现
(重载:方法名称一样,参数列表不一样)
方法覆盖重写的注意事项:
1、必须保证父子类方法的名称相同,参数列表也相同
@override写在前面,用来检测是不是有效的正确覆盖重写
这个注解就算不写,只要满足要求,也是正确的方法覆盖重写
2、子类方法的返回值必须【小于等于】父类返回值范围
小扩展提示:java.lang.object类是所有类的公共最高父类(祖宗类),java.lang.String就算Object的子类
3、子类方法权限不许【大于等于】父类方法权限修饰符
小扩展提示:public》protected>(default)>private
备注:(default)不是关键字default,而是什么都不写,留空
eg:public(权限)string(返回值范围) method(){}
继承后的特点–构造方法
继承关系中,父子类构造方法的访问特点:
1、子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造
2、子类的构造可以通过super关键字来调用父类重载构造
3、super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造
总结:子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个
class Fu {
private int n;
Fu(){
System.out.println("Fu()");
}
class Zi extends Fu {
Zi(){
super();// 调用父类构造方法
System.out.println("Zi()");
}
}
public class ExtendsDemo07{
public static void main (String args[]){
Zi zi = new Zi();
}
}
super关键字
super关键字的用法有三种:
1、在子类的成员方法中,访问父类的成员变量
2、在子类的成员方法中,访问父类的成员方法
3、在子类的构造方法中,访问父类的构造方法
pubic class Zi extends Fu{
int num = 20;
public Zi(){
super();
}
public void methodZi(){
System.out.println(super.num);
}
public void method(){
super.method;//访问父类中的method
}
}
this关键字
super关键字用来访问父类内容,而子类关键字用来访问本类内容 用法也有三种:
1、在本类方法中,访问本类成员变量
2、在本类成员方法中,访问本类的另一个成员方法
3、在本类的构造方法中,访问本类的另一个构造方法,在使用时注意:
this(…)调用也必须是构造方法的第一个语句,唯一一个
super和this两种构造调用,不能同时使用
pubic class Zi extends Fu{
int num = 20;
public Zi(){
super();//这一行不再赠送
this(123);//本类的无参构造调用本类的有参构造
}
public Zi(int n){
System.out.println(n);
}
public void methodZi(){
System.out.println(super.num);
}
}