2 hiberatejss hiberatejss 于 2013.09.20 09:24 提问

我想知道为什么运行出来的结果和我预期的不一样?(java初学者,多多体谅)

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()*/

4个回答

th943699181
th943699181   2013.09.24 00:39

分析:
你的子类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();
}
}

hiberatejss
hiberatejss 有点难理解,表示看不懂
大约 4 年之前 回复
th943699181
th943699181 恩,是會這樣,多謝糾正
4 年多之前 回复
lucumu
lucumu 纠正一下,排除拼写错误的情况下,test3中的method1会覆盖parent中的method1。
4 年多之前 回复
lucumu
lucumu   2013.09.29 09:31

楼主是逗大家玩的吧,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

希望能帮助你理解

lucumu
lucumu 看到讨论,我又仔细看一遍代码,才发现,Parent中的method1是个私有函数,不会被子类覆写的
大约 4 年之前 回复
hiberatejss
hiberatejss 其实我本身程序里面写的也是method1(阿拉伯数字),可能是我提交问题的时候,不小心碰到了一下,绝对不是这个的问题,就算把其改成method1(阿拉伯数字),运行的结果依然是Parents method 2();Parents method 11();我想知道这是为什么嘞?
大约 4 年之前 回复
lucumu
lucumu 炒蛋,把test3中的L改成 1 ,结果是 Parent′s method 2() Parent′s method 11()。 你看清楚提问者的问题了吗? 问得问题是“为什么不是”
4 年多之前 回复
u011575463
u011575463 就算test3中的L改成一,打印的结果还是Parent′s method 2() Parent′s method 11()以后没有自己试之前就不要误导新手,他提的问题和test3实例化有关,亲
4 年多之前 回复
u012204919
u012204919   2013.09.22 17:08

打印出来的是
Parent′s method 2()
Parent′s method 11() 吗

hiberatejss
hiberatejss 就是这个结果,但是我无法理解这个结果,我觉得应该是第二行应该是Child's method 11()
大约 4 年之前 回复
th943699181
th943699181   2013.09.24 00:19

你想要的到什么样的结果?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!