关于继承的一些小总结
继承:
关键字:extends
格式:
类A extends 类B
类A为父类 类B为子类
功用:
让类之间产生关系===》》多态
提高代码的复用性
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
注意:
切勿滥用继承,必须有所属关系
简单代码举例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class C 2 { 3 void demo1(){} 4 } 5 6 class B extends C 7 { 8 void demo2(){} 9 //void demo1(){} B和A不必作此声明 10 } 11 12 class A extends C 13 { 14 //void demo1(){} 15 void demo3(){} 16 }
A,B继承C的成员demo1()
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
java语言只支持单继承,不支持多继承(即一个类可以同时继承多个类)
功用:提高了代码的安全性,当多个父类中有相同的属性,子类调用执行哪个成为问题
简单代码举例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class C 2 { 3 void show() 4 { 5 System.out.println("C");l 6 } 7 } 8 class B 9 { 10 void show() 11 { 12 System.out.println("B"); 13 } 14 } 15 class A extens B,C 16 { 17 A a = new A(); 18 a.show(); //A该执行哪个show()? 19 }
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
java语言支持多层继承即A extends B, C extends A,
则C中同时具有A和B中的所有属性,是一个继承体系。
在具体调用的时候创建子类对象,
父类可能不能创建对象,而子类中还有特有的属性
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
覆盖(重写,成员函数具有的特性)
概念:子类中的方法与父类中相同(类型,名称,参数,返回值),保留父类的功能定义
改变父类的功能内容
注意:
子类的权限必须大于父类的权限,才能覆盖
静态的方法只能覆盖静态的方法
重写可用于扩展:(简单代码)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class A 2 { 3 void show() 4 { 5 System.out.println("A"); 6 } 7 } 8 9 class B extends A 10 { 11 void show() 12 { 13 super.show(); 14 System.out.println("B"); 15 } 16 }
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
子父类的构造函数
在子类实例化时,子类的构造函数默认会调用父类的构造函数
子类必须了解父类对对象初始化做了什么,因此在生成对象的时候子类必须先调用父类的构造方法,然后再调用自己的构造方法
简单代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class A 2 { 3 A() 4 { 5 System.out.println("a"); 6 } 7 } 8 9 class B extends A 10 { 11 B() 12 { 13 super(); //此处是虚拟机默认添加 14 System.out.println("b"); 15 } 16 }
注意:
假如类B的定义如下:此时B中的构造方法B()不再访问父类构造方法,
即this与super只能存在一个
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class A 2 { 3 A() 4 { 5 System.out.println("a"); 6 } 7 8 } 9 class B extends A 10 { 11 B() 12 { 13 this(3); 14 System.out.println("b"); 15 } 16 B(int num) 17 { 18 //super(); 19 System.out.println("B"+" "+num); 20 } 21 22 public static void main(String[] args) 23 { 24 B b = new B(); 25 } 26 }
输出结果:
a
B 3
b
即因为B中有this则B不再调用父类构造方法
而是在调用B(int num)这个构造方法来调用父类的调用方法
否则输出结果为
a
B 3
a
b
结论:子类对象实例化时必然要调用父类的构造方法
注意:
若A中没有空参数列表构造函数,则此时在子类B的构造方法中必须显示的调用A的构造方法
否则编译错误