个人理解:
1,实例化子类不会去自动实例化父类,因为父类有可能是抽象类,抽象类是不能被实例化的
2,不是获得父类的变量,而是子类自己的变量了,你可以创两个不一样的子类,父类的字段给不一样的值都可以,说明这个字段实在子类中单独实例化
3,子类继承父类,就表示子类具有了父类中的成员属性和方法。当成员属性子类属性名与父类属性名相同的时候,父类的属性被隐藏,但还是存在的,我们可以通过super.XXX访问。
4,在子类与父类中:方法存在重写,而属性不存在。
方法重写代码实例:
public class OldParent {
public String name = "OldParent";
public OldParent(){
print();
}
public void print(){
System.out.println("OldParent"+this);
}
}
public class Parent extends OldParent{
public String name = "parent";
public Parent(){
super();
print();
}
public void print(){
System.out.println("parent"+this);
}
}
public class Child extends Parent{
public String name = "child";
public static void main(String[] args) {
Child child = new Child();
}
public Child(){
super();
print();
}
public void print(){
System.out.println("Child"+this);
}
}
结果:
Childcom.zhangjunling.Child@2a139a55
Childcom.zhangjunling.Child@2a139a55
Childcom.zhangjunling.Child@2a139a55
此时我们会发现Child 的父类与间接父类中的this都为:@2a139a55。而且,它们的print()都为child的print()方法。因此,我们会得出实例化子类的时候内存并没有实例化父类对象,依旧是子类。
属性覆盖实例
public class OldParent {
public String name = "OldParent";
public OldParent(){
print3();
}
public void print3(){
System.out.println(name);
}
}
public class Parent extends OldParent{
public String name = "Parent";
public Parent(){
super();
print2();
}
public void print2(){
System.out.println(name);
}
}
public class Child extends Parent{
public String name = "child";
public static void main(String[] args) {
Child child = new Child();
}
public Child(){
super();
print1();
}
public void print1(){
System.out.println(name);
}
}
结果:
OldParent
Parent
child
可能我们都能想到运行结果,此时这3个结果全是Child child = new Child();全是child的属性,并没有父类对象的属性。
再看下面的代码,结果是否与你想的一样?
public class OldParent {
public String name = "OldParent";
public OldParent(){
print();
}
public void print(){
System.out.println(name);
}
}
public class Parent extends OldParent{
public String name = "Parent";
public Parent(){
super();
print();
}
public void print(){
System.out.println(name);
}
}
public class Child extends Parent{
public String name = "child";
public static void main(String[] args) {
Child child = new Child();
}
public Child(){
super();
print();
}
public void print(){
System.out.println(name);
}
}
结果:
null
null
child
此时,我们把方法的重写与属性的覆盖写在一起,又会产生什么结果呢?
结果就是上面的现象!为什么会出现这种结果。
原因是:当我们重写父类的方法时,如果通过子类对象调用父类中重写的方法,结果是全调用的是子类的方法。
那为什么前两个结果全是null?上面已经说的很清楚了,因为调用的是子类的方法,同样属性也是子类的属性。所以在父类中调用name,因为不能访问到子类的name,所以为null。
进一步理解就是:
在child中:我们可以访问的属性有 3 个name:一个是child的,一个是Parent的,一个是OldParent的。我们在child中可以访问这三个name;
在Paren中:我们可以访问的属性有 2 个name:一个是Parent的,一个是OldParent的;
在OldParent中:我们可以访问的属性有 1 个name:就是自己的;
所以,我们可以知道结果为什么是null,null,Child了吧!