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

经验分享 程序员 微信小程序 职场和发展