动手动脑04
1
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(); } }
super调用基类构造方法,必须子类构造方法第一句。在下一级出来之后{super("Hello.Grandparent")}然后直接将这个传到上一级里面。
2.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
构造函数主要是用来在创建对象时初始化对象,即为对象成员变量赋初值。由于子类是继承父类的,所以创建子类对象时,必须先调用父类的构造方法,这样子类才能有父类的属性和方法。不能反过来是因为父类不知道子类有什么变量,而子类也得不到父类的初始化变量。
3.在编译源码时,当遇到没有父类的类时,编译器会定义的默认的父类(一般为Object),public void println(Object x),这一方法内部调用了String类的valueOf方法。valueOf方法内部又调用Object.toString方法:
public String toString() {
return getClass().getName() +"@" +
Integer.toHexString(hashCode());
}
4.方法覆盖分别方法是根据声明类属于哪一个例如:
A a=new A();
B b=new B();
a.shu();
b.shu();
5.
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。如果子类被当作父类使用,则通过子类访问的字段是父类的。
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。