注意:
1.子类自动拥有父类声明为public和protected的成员。
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();
反编译结果: