对Java的继承的深度理解
对Java的继承的深度理解
大家都知道,在Java中子类继承父类后子类就能获得除private权限以外的所有属性和方法。当子类给与自身属性变量不同名的父类属性赋值时,此时的赋值是直接给继承父类的属性赋值。那么问题来了,当两个子类同时继承并分别操作这个父类的属性时,他们的继承的父类属性会如何变化? 具体测试如下代码:
public abstract class adstrect {
public String name;
public int age;
public abstract void stu();
}
class ab1 extends adstrect {
public ab1() {
System.out.println("父类属性:"+super.name);
this.name = "00000";
System.out.println("ab1: "+this.name);
System.out.println("父类属性:"+super.name);
}
@Override
public void stu() {
name = "sjlf";
System.out.println("ab1: "+this.name);
System.out.println("父类属性:"+super.name);
}
}
class ab2 extends adstrect {
public ab2() {
System.out.println("父类属性:"+super.name);
System.out.println("子类属性:"+this.name);
System.out.println("父类属性:"+super.name);
}
@Override
public void stu() {
}
}
public class abstracttest {
public static void main(String[] args) {
ab1 a = new ab1();
a.stu();
System.out.println("**********************************");
ab2 aa = new ab2();
aa.stu();
System.out.println(a.name);
}
}
运行结果如下:
由此可见,当操作的属性变量子类和父类不同名时,调用的属性就是默认操作父类同名的属性,如果操作的属性是子类和父类同名的属性,那么只有通过super关键字操作父类属性。
这两个类虽然都是调用父类的属性,但是当ab1类改变name值后在通过ab2打印name却为null,这说明虽然两个类继承同一个父类,且都是操作父类的name属性,但是第一个ab1类对父类的操作并不影响第二个类ab2获取的name值。由此可见子类继承的父类属性都和子类独立的。
