public class Drawing{
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
Drawing t = new Art();
t.f();
}
} class Art extends Drawing{
public void f(){
System.out.println("public f()");
}
问题:为什么运行后输出的结果是 private f()???
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
Drawing t = new Art();
t.f();
}
} class Art extends Drawing{
public void f(){
System.out.println("public f()");
}
问题:为什么运行后输出的结果是 private f()???
就是这句的内存分配情况?
因此,它在调用时是前绑定,即已经将它的对象类型隐藏
的转化为基类(Drawing) 了。
基础问题啊。private是私有,除了自己谁都不可以访问,即使是自己的子子孙孙。
只有protected以上的访问级别才可以继承。你这里,Drawing的f()方法和Art的f()方法根本就不是override的关系,完全是两个类各自独有的方法,一个是私有,一个是公有。
所以,下面这两句代码。
Drawing t = new Art();
t.f();
最后这句,实际调用的是Drawing.f()。另一个角度说,首先,你把t的类型定义为Drawing,那么就只能调用Drawing类的方法,而不可能调用出来Art独有的方法。比如你在Art里面再写一个方法public f1(),用t也是绝对调用不出来的,即使t实际上是Art的实例。上面既然说了Art.f()与Drawing.f()没有override的关系,而是各自独立的方法,那么使用Drawing类型的变量(引用)也就不可能调用Art里面的任何独立方法,包括f(),所以这里调用的只可能是Drawing.f()。你把Drawing.f()改作protected,结果就会输出public f()了。
顶,听了King_Play(程序猎人) 一席话,顿悟
因为虽然是private,但是main函数也是在Drawing里面,也就是在类中,所以也可以访问。