靠,真是头疼的问题啊Hackevin(小土) withwind(柳随风) 都是对的public class One{ private void printA(){System.out.println("A");} protected void printB(){System.out.println("B");} protected void printAB(){ printA(); printB(); } public static void main(String[] args){ Two t=new Two(); t.printAB(); } }class Two extends One{ private void printA(){System.out.println("C");} protected void printB(){System.out.println("D");}
}这个是运行的版本,确实是 A D
唉~我还打算考scjp呢,看来没戏了
分析一下: 在JAVA里面,运行时调用的方法是依赖于他的实际类型的,如上程序中, public static void main(String[] args){ Two t=new Two(); --> One t = new Two(); t.printAB(); } 运行结果也一样。关于改写: 运行时可最为特殊化的那个版本被执行:所以是AD; D是肯定的,A只能够做一些猜测:java虚拟机认为printA方法不能够overwriting 所以直接就调用了,应该和具体虚拟机的实现有关 另外想要说一点: 编程序要尽量避免这样的东东,因为编程序不是想要把自己搞迷糊!:)
private(私有的)不被继承
One的printA是私有的,不会传给Two
class Two extented One{
private printA(){输出C}
//不能覆盖
}
printAB()被继承,printB()被重载
执行t.printAB()既是执行one的pintA和two的printB()
t.printAB();
即会执行ONE的
protected printAB(){
printA();
printB();
}
那在这里执行printA()时会怎样呢?ONE中的printA()它应该是不能执行的了
但Two ()中的printA()它能执行吗?
首先TWO的对象里面存在printAB方法
当用TWO的对象调用printAB方法时
它里面调用的是TWO类的printA和printB方法
当用ONE的对象调用printAB方法时
它里面调用的是ONE类的printA和printB方法
printAB方法是属于ONE对象的,那么它是不是就应该执行ONE中的printA和printB啊?(在此ONE 中的printA不能执行)
他用TWO的对象调用这个方法,然后方法里面调用printA方法
就相当于在TWO对象中调用printA方法,所以是TWO对象的printA方法我是这样理解的
private void printA(){System.out.println("A");}
protected void printB(){System.out.println("B");}
protected void printAB(){
printA();
printB();
}
public static void main(String[] args){
Two t=new Two();
t.printAB();
}
}class Two extends One{
private void printA(){System.out.println("C");}
protected void printB(){System.out.println("D");}
}这个是运行的版本,确实是 A D
在JAVA里面,运行时调用的方法是依赖于他的实际类型的,如上程序中,
public static void main(String[] args){
Two t=new Two(); --> One t = new Two();
t.printAB();
}
运行结果也一样。关于改写:
运行时可最为特殊化的那个版本被执行:所以是AD;
D是肯定的,A只能够做一些猜测:java虚拟机认为printA方法不能够overwriting 所以直接就调用了,应该和具体虚拟机的实现有关
另外想要说一点:
编程序要尽量避免这样的东东,因为编程序不是想要把自己搞迷糊!:)