cha*_*ged 2 java variables methods inheritance resolution
根据java,实例方法解析基于参数的运行时类型.
但是在解析实例变量时,它使用不同的方法,如下所示.
节目输出是......
Child
Parent
ParentNonStatic
Run Code Online (Sandbox Code Playgroud)
这里第一个输出基于参数的运行时类型,但第三个输出不是.
任何人都可以解释一下吗?
public class Child extends Parent {
public static String foo = "Child";
public String hoo = "ChildNonStatic";
private Child() {
super(1);
}
@Override
String please() {
return "Child";
}
public static void main(String[] args) {
Parent p = new Parent();
Child c = new Child();
//Resolving method
System.out.println(((Parent) c).please());
//Resolving Static Variable
System.out.println(((Parent) c).foo);
//Resolving Instance Variable
System.out.println(((Parent) c).hoo);
}
}
class Parent {
public static String foo = "Parent";
public String hoo = "ParentNonStatic";
public Parent(int a) {
}
public Parent() {
}
String please() {
return "Tree";
}
}
Run Code Online (Sandbox Code Playgroud)
当您向上转换对象时,您实际上并未更改所引用项目的内容,只是您对待它的方式.因此,当你向父母转发c并调用please()时,你在Parent上调用please(),但是动态类型仍然是子类,所以真正调用的是子文件中的重写版本,并打印"Child".
当你向上转换c并引用foo时,你没有进行函数调用.编译器可以在编译时确定您所指的内容.在这种情况下,具有父类型的对象的字段foo.字段和静态字段不会被覆盖.相反,它们是隐藏的.你实际上最终用这个upcast做的是帮助Java挑选隐藏版本(来自Parent的版本)而不是来自child的版本.同样,你可以得到父版本.
以下是JAva教程的一些信息:http://java.sun.com/docs/books/tutorial/java/IandI/hidevariables.html
| 归档时间: |
|
| 查看次数: |
1030 次 |
| 最近记录: |