1,一个之类只能继承一个父类,存在单继承局限
错误程序: class A {} class B {} classC extends A,B{} // 一个子类继承了两个父类 |
正确程序: class A {} class B extends A {} classC extends B {} //这种操作称为多层继承 |
结论:Java之中只允许多层继承,不允许多重继承,Java存在单继承局限。
2,在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。
class A { private String msg ; public void setMsg(String msg) { this.msg = msg ; } public String getMsg() { return this.msg ; } } class B extends A { public void print() { System.out.println(msg) ; // 错误: msg可以在A中访问private } } public class Test { public static void main(String args[]) { B b = new B() ; b.setMsg("张三") ; System.out.println(b.getMsg()) ; } } |
3,在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。
class A { public A() { //父类无参构造 System.out.println("*************************"); } } class B extends A { public B() { //子类构造 super() ; // 调用父类构造 System.out.println("#########################"); } } public class Test { public static void main(String args[]) { B b = new B() ; //实例化子类对象 } } |
现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法。
class A { public A(String msg) { //父类构造 System.out.println("*************************"); } } class B extends A { public B() { //子类构造 super("Hello") ; //调用父类构造 System.out.println("#########################"); } } public class Test { public static void main(String args[]) { B b = new B() ; //实例化子类对象 } } |
在任何的情况下,子类都逃不出父类构造的调用,但是,既然super()可以调用父类构造,那么这个语法和this()很相似,那么很明显了,super调用父类构造的时候,一定要放在构造方法的首行上。