java基础(十)——继承
继承
继承后的特点——成员方法
成员方法不重名
如果子类父类中出现不重名的成员方法,这时的调用是没有【任何影响的】,对象调用方法是,会先在子类中查找有没有对应的方法,若子类中存在该方法,那么就执行该方法,若子类当中不存在子类中的方法,那么会执行父类当中的成员方法。
1 public class Fu{ 2 int num = 10; 3 public void show(){ 4 System.out.prontln("Fu类中的show()方法在执行!"); 5 System.out.prontln("Fu类中成员变量num: "+num); 6 } 7 } 8 public class Zi extends Fu{ 9 int num =20 10 public void show2(){ 11 System.out.println("Zi类中的show()方法在执行!") 12 System.out.prontln("Zi类中的成员变量num:"+num) 13 } 14 } 15 public class TestExtends{ 16 public static void main(String[] args){ 17 //构建子类对象 18 Zi zi = new Zi(); 19 zi.show();//调用父类当中的show方法 Fu类中的show()方法在执行! 10 20 zi.show2();//调用子类当中的show2方法 Fu类中的show()方法在执行! 20 21 } 22 }
成员方法重名——重写(Override)
如果父子类中出现重名的成员方法,这时的访问是一种特殊情况。叫做方法重写(Override)。
- 方法重写:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表),会出现覆盖效果,也称为重写或者复写,简称【声明不变,重新实现】。
实例代码:
1 public class Fu{ 2 int num = 10; 3 public void show(){ 4 System.out.println("Fu show()方法在执行") 5 System.out.prontln("Fu类中成员变量num: "+num); 6 } 7 } 8 9 public class Zi extends Fu{ 10 int num = 20; 11 public void show(){ 12 System.out.println("Zi类中的show()方法在执行!") 13 System.out.prontln("Zi类中的成员变量num:"+num) 14 } 15 } 16 17 public class TestExtendsDemo02{ 18 public static void main(String[] args){ 19 //构建子类对象 20 Zi zi = new Zi(); 21 // 调用show()方法 22 //子类中有show()方法,执行的是重写后的show() 23 zi.show();//Zi类中的show()方法在执行! 20 24 } 25 }
重写的应用
子类可以根据需要定义特定于自己的行为,既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行功能扩展。
1 public class Phone{ 2 //打电话 3 public void call(){ 4 System.out.println("打电话!"); 5 } 6 //发短信 7 public void sendMessage(){ 8 System.out.println("发短信!"); 9 } 10 //来电显示 11 public void show(){ 12 System.out.prinyln("来电显示电话号码!") 13 } 14 } 15 public class IPhone12 extends Phone{ 16 //重写父类当中的来电显示功能,并增加自己的显示姓名和显示头像功能 17 public void show(){ 18 //父类当中的功能保持不变 19 super.show(); 20 //新增新功能 21 System.out.println("显示姓名!") 22 System.out.println("显示头像!") 23 } 24 } 25 public class TestExtendsDemo03{ 26 public static void main(String[] args){ 27 //创建一个子类对象 28 Phone12 iphone = new IPhone12(); 29 //调用父类当中的打电话 30 iphone.call(); 31 //调用重写之后的来电显示功能 32 iphone.show();//显示电话号码 显示姓名 显示头像 33 } 34 }
重写:方法的名称一样,参数列表【一样】,返回值类型【也一样】,重写前提是有继承关系;
重载:方法的名称一样,参数列表【不一样】,返回值类型无要求,在本类中;
注意事项:
- 子类方法重写父类方法,必须要保证权限大于等于父类权限
- 子类方法覆盖父类方法,返回值类型、函数名称和参数列表必须要一模一样。
继承后的特点——构造方法
构造方法的定义和作用:
- 构造方法的名字和类名要保持一致,所以子类是无法继承父类当中的构造方法
- 构造方法的作用一般是用来初始化成员变量,所以子类在初始化的过程中,必须先执行父类中的初始化动作。子类的构造方法当中默认有一个super()方法,表示调用的父类的构造方法,父类的成员变量初始化之后,才可以给子类使用。
1 public class Fu{ 2 private int n; 3 public Fu(){ 4 System.out.println("Fu()"); 5 } 6 } 7 public class Zi extends Fu{ 8 public Zi(){ 9 //super()调用父类中的构造方法 隐式调用 10 System.out.println("Zi()"); 11 } 12 } 13 public class TestExtendDemo04{ 14 public static void main(String[] args){ 15 Zi zi = new zi(); 16 } 17 } 18 //输出结果 19 //Fu() 20 //Zi()
super和this
父类空间优先于子类对象产生
在每次创建子类对象的时候,先初始化父类空间,再创建子类对象。目的在于子类对象中包含了其对应的父类空间,便可以包含父类的成员,如果父类成员非私有,则子类可以随意使用父类的成员,代码体现在子类的构造方法调用时,会先调用父类的构造方法。