这张图大致说明了继承的结构关系。矩形代表属性,圆角矩形代表方法。
在继承中,子类完全继承了父类的属性和方法,同时可能又增加了自己的属性和方法(扩充Extends),同时又可能对父类的方法进行了重写或覆盖(Override,完全一样的方法和参数),或者进行了重载(Overload,完全一样的方法名,不一样的参数)。
在创建一个子类对象时,会首先逐层从子类到父类传递参数给上一层以实现各方法能够有必要的参数执行,之后会逐层依次创建从Object原始类开始直到本子类的所有对象,只不过之前的对象皆为匿名,只有最终的子类对象可以实名访问。
如上例所示,创建一个Child类的对象C:
Child C = new Child();
-
Parent (P) = new Parent();Grandparent (G) = new GrandParent();
会被隐式调用以分别创建两个匿名父类对象(P),(G)已完成对最终对象的初始化。
(G)在Grandparent()构造函数调用后先被创建出来并占用一定的存储空间,同时具有了它的属性和方法;
(P)在(G)的空间和逻辑基础上在Parent()构造函数调用下被创建出来,并具有了Parent类的其他独有属性和方法,同时将Grandparent类中需要重写或重载的方法变更,占用多出来的空间;
-
C在(P)的空间和逻辑基础上在Child()构造函数调用下被创建出来,并具有了Child类的其他独有属性和方法,同时将Parent类中需要重写或重载的方法变更,继续占用多出来的空间。
class Grandparent { public String str; public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { str = string; System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { super("Hello.Grandparent."); System.out.println("Parent Created"); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class Test { public static void main(String args[]) { Child c = new Child(); System.out.println(c.str); } }