以下代码运行输出的是
public class Person{ private String name = "Person"; int age=0; } public class Child extends Person{ public String grade; public static void main(String[] args){ Person p = new Child(); System.out.println(p.name); } }
看上面的回答:
大多数都是这样的解释,因为p实际指向的是子类,而子类不可继承父类的私有成员,所以子类对象无法访问。
但是这说的是运行期间发的事情好吗?这个代码编译期间都过不去,
不信你改成Person p = new Person();编译期间根据p的静态类型为其标识所属的类Person,而在子类的作用域中试图访问父类的私有成员是不合法,或者说根本找不到,所以会编译出错,因为无法为其生成正确的字节码!
在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。
class Person{ public String name = "Person"; int age=0; } public class Son extends Person{ public String grade; public String name = "son"; public static void main(String[] args){ Person p = new Son(); System.out.println(p.name); } }