对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值。由此可见子类继承的父类属性都和子类独立的。