java关于属性的继承(实例变量与类变量的隐藏)

it2025-02-14  26

类变量的隐藏

public class Test extends Point { static int i = 202; public static void main(String[] args) { new Test().printX(); // 202; 101 } void printX() { System.out.println(i + "; " + super.i); } } class Point { static int i = 101; }

在Test类中的x声明隐藏了Point类中的x声明,因此Test类不能从其超类Point中继承x域。在Test类声明内,简单名x引用的是在Test类内声明的域。 在Test中的代码可以用super.x来引用Point类的x域(或者,使用Point.x )。

如果Test.x 声明被删掉了:

public class Test extends Point { // static int i = 202; public static void main(String[] args) { new Test().printX(); // 101; 101 } void printX() { System.out.println(i + "; " + super.i); } } class Point { static int i = 101; }

那么Point类的x域在Test类内就不再被隐藏了,现在简单名x引用的就是Point.x 域,而在Test类中的代码仍旧可以使用super.x来引用相同的域。

实例变量的隐藏

public class Test extends Point { int i = 202; public static void main(String[] args) { Test test = new Test(); test.printX(); // 202; 101 System.out.println(test.i); // 202 } void printX() { System.out.println(i + "; " + super.i); } } class Point { int i = 101; }

因为在Test类中的x声明隐藏了Point类中的x定义,因此Test类不能从其超类Point中继承x域。但是,必须要注意,尽管Point类的x域没有被Test类继承,但是Test类的实例还是实现了这种继承。换句话说,Test类的每个实例都包含两个域,都是是int类型的,域的名字都是x,但是在Test类的声明内,简单名x总是引用在Test类中声明的x。

如果从Test类中删除x的声明,就像下面的程序:

public class Test extends Point { // int i = 202; public static void main(String[] args) { Test test = new Test(); test.printX(); // 101; 101 System.out.println(test.i); // 101 } void printX() { System.out.println(i + "; " + super.i); } } class Point { int i = 101; }

那么Point类的x域在Test类内就不再被隐藏了。现在,在Test类的声明中的实例方法内,简单名x引用的就是在Point类内声明的域,而在Test类中的代码仍旧可以使用super.x来引用相同的域。表达式text.x仍旧引用的是Test类型内的x域,但是该域现在是一个继承而来的域,因此引用的还是Point类中声明的x域。

link

最新回复(0)