class Parent{
private void method1() {
System.out.println("Parent′s method 11()");
}
public void method2() {
System.out.println("Parent′s method 2()");
method1();
}
}
class test3 extends Parent {
public void methodl(){
System.out.println("Child′s method 11()");
}
public static void main(String args[]){ Parent p = new test3();p.method2();}
}
/*为什么在控制台打印的信息不是
Parent′s method 2()
Child′s method 11()*/
打印出来的是
Parent′s method 2()
Parent′s method 11() 吗
你想要的到什么样的结果?
分析:
你的子类test3是程序的主入口,编译,主方法进栈,test3和Parent的方法存储在方法区中,并且jvm在堆中为Parent、test3开辟堆空间存放数据,主方法是存在栈中的,而你的Parent、test3是存放在堆中的,方法则存放在方法区中,因该是访问不到吧,只是个人见解
我改了一下程序,就是不将子类设为main方法存在地,
结果就能完美运行,
class Parent {
private void method1() {
System.out.println("Parent′s method 11()");
}
public void method2() {
System.out.println("Parent′s method 2()");
method1();
}
}
class test3 extends Parent {
public void methodl() {
System.out.println("Child′s method 11()");
}
public static void main(String args[]) {
Parent p = new test3();
p.method2();
}
}
public class TempDemo{
public static void main(String args[]) {
Parent p = new test3();
p.method2();
}
}
楼主是逗大家玩的吧,test3中的medhodl 这个方法的命名会害死人的,最后那个不是数字1,而是L
public void methodl(){
System.out.println("Child′s method 11()");
}
假如这个方式是method1(阿拉伯数字),那么正确输出应该是
Parent′s method 2()
Child′s method 11
看到这么多人热心讨论,觉得很奇怪,本来挺简单的问题为什么会有这么多疑问。我有仔细看了一遍楼主的代码,发现我错了,于是做了这段补充
Parent{
private void method1();
}
Parent
中的method1是
private的,私有方法在子类中是不可见的,也是不能被
overwrite`(覆盖的)。输出是
Parent′s method 2()
Parent′s method 11
对于private方法和非private方法,编译时候生成的字节码分别是invokespecial
invokevirtual
希望能帮助你理解