继承的应用

 

注意:

1.子类自动拥有父类声明为publicprotected的成员。

2.通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。

3.子类的构造方法在运行之前,必须调用父类的构造方法

4.final声明的方法不允许覆盖,以final声明的变量不允许更改,利用final,我们可以设计出一种特殊的“只读” 的“不可变类”。

 

示例代码:

class Grandparent 

{   

public Grandparent() 

{       

System.out.println("GrandParent Created.");

}

public Grandparent(String string) 

{   

System.out.println("GrandParent Created.String:" + string);

}

}

class Parent extends Grandparent 

{

    public Parent()

   {       

        super("Hello.Grandparent.");

        System.out.println("Parent Created");

        //super("Hello.Grandparent.");   

   }

}

class Child extends Parent

{

    public Child()

   {

        System.out.println("Child Created");

    }

}

public class TestInherits

{

    public static void main(String args[])

   {

        Child c = new Child();

   }

}

该代码运行的结果是:

 

附:

为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

答:

构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。构造函数用于创建类的实例,并对实例进行初始化操作,通过不同的参数传递,可进行不同的实例初始化操作。

子类可以理解为在父类下面的一个更细的划分,所以必须先调用父类的构造方法,如果要给一个对象分类,如果它的类型是子类的话,它一定也属于父类。

 

神奇代码:

public class ExplorationJDKSource {

 

/**

 * @param args

 */

public static void main(String[] args) {

System.out.println(new A());

}

 

}

 

class A{}

运行结果:

 

原因分析: 前面示例中,main方法实际上调用的是:

public void println(Object x),这一方法内部调用了String类的valueOf方法。

valueOf方法内部又调用Object.toString方法:

public String toString() {

return getClass().getName() +"@" + 

Integer.toHexString(hashCode());

}

hashCode方法是本地方法,由JVM设计者实现:

public  native int hashCode();

 

 

反编译结果:

 

 

posted @ 2015-11-06 11:20  木子金帛  阅读(242)  评论(0编辑  收藏  举报