黑马程序员技术交流社区

标题: 为什么这个程序运行后没有结果? [打印本页]

作者: ______雨点ペ    时间: 2014-11-7 21:46
标题: 为什么这个程序运行后没有结果?

我的分析:B是A的子类,因此会继承A类中的fun1()和fun2()。当new一个B类对象时,用其引用b调用fun1(),由于
B类继承了A类中的fun1(),因此会运行fun1()进而运行fun2(),最终打印出888.当用A类引用a指向子类对象B时,A类
引用a调用了fun1(),因此运行的是A类中的fun1(),进而运行fun2(),最终打印结果为888.
但是我用eclipse运行这个程序的时候没有运行结果,是不是我对程序的分析错了啊!请高人分析一下程序。

作者: youtianlong123    时间: 2014-11-7 22:36
你的main方法都没有包含在一个类中,main方法是static的,必须由类去调用,但是你的mian方法没有自己所属的类啊,不知道我说的对不对,你可以试一试
作者: RINGARES    时间: 2014-11-7 22:46
你这有两个public 的类, 编译器应该会报错,你把class A的public修饰去掉再看看
作者: RINGARES    时间: 2014-11-7 22:55
而且结果是
999
999
因为 B b = new B();
b 是指向B的对象,而B中其实是有两个方法,分别是
  1. void fun1(){
  2.                 System.out.println(fun2());
  3.         }
复制代码
  1. int fun2(){
  2.                 return 999;
  3.         }
复制代码

所以fun1中打印的fun2的返回值是999,因为已经把父类的fun2覆盖了

接下来 A a =b;a.fun1();还是调用子类B的fun1方法,和之前相同,所以还是999
作者: zxbzxb333    时间: 2014-11-8 07:05
代码没有问题,结果应该是两个999
作者: qq8921310    时间: 2014-11-8 09:33
不是覆盖了么,你为什么会认为是888?

作者: 想成为黑马    时间: 2014-11-8 09:45
不是2个999么
作者: wf111sxwf    时间: 2014-11-8 10:50
应该是没问题啊,运行结果应该是俩999皮炎平
作者: Rain2692    时间: 2014-11-8 11:05
飘过。。。
作者: ______雨点ペ    时间: 2014-11-8 17:34
youtianlong123 发表于 2014-11-7 22:36
你的main方法都没有包含在一个类中,main方法是static的,必须由类去调用,但是你的mian方法没有自己所属的 ...

main()在B类中。它所属的类是B类
作者: ______雨点ペ    时间: 2014-11-8 17:36
RINGARES 发表于 2014-11-7 22:46
你这有两个public 的类, 编译器应该会报错,你把class A的public修饰去掉再看看 ...

哪有两个Public修饰的类?就一个类A被public修饰了!
作者: ______雨点ペ    时间: 2014-11-8 17:39
本帖最后由 ______雨点ペ 于 2014-11-8 18:24 编辑
RINGARES 发表于 2014-11-7 22:55
而且结果是
999
999

我认为A a = new B(),   a.fun1()调用的是A类中的fun1(),因为B类没有重写A类的fun1()。
作者: 郑诗博    时间: 2014-11-8 18:04
你应该是在eclipse中建立的,把A类的public去掉试试看
作者: 郑诗博    时间: 2014-11-8 18:06
你应该是在eclipse中建立的,把A类的public去掉试试看
作者: DamonZh    时间: 2014-11-8 19:16
我觉得楼主对多态这地方理解的不够,我的想法跟楼主有些相似。还得继续学习理解啊,结果是两个999,你的程序写的没问题,不可能没结果啊。
作者: ______雨点ペ    时间: 2014-11-8 19:54
DamonZh 发表于 2014-11-8 19:16
我觉得楼主对多态这地方理解的不够,我的想法跟楼主有些相似。还得继续学习理解啊,结果是两个999,你的程 ...

你看啊!B类继承了A类中的fun1(),因此B b = new B()后,用b调用fun1(),调用的是B继承过来的fun1(),然后又调用了fun2(),由于B类重写了A类中的fun2(),因此调用的是B类中的fun2(),运行结果为999.但是,A a = new B()后,即用父类引用a去调用fun1(),子类B类继承了fun1()但是没有重写fun1(),那么用父类引用a去调用fun1()时,我认为调用的是A类中的fun1().但是别人认为调用的仍是B类继承来的fun1().我就这一点不懂了。
作者: ______雨点ペ    时间: 2014-11-8 20:02
RINGARES 发表于 2014-11-7 22:55
而且结果是
999
999

你看啊!B类继承了A类中的fun1(),因此B b = new B()后,用b调用fun1(),调用的是B继承过来的fun1(),然后又调用了fun2(),由于B类重写了A类中的fun2(),因此调用的是B类中的fun2(),运行结果为999.但是,A a = new B()后,即用父类引用a去调用fun1(),子类B类继承了fun1()但是没有重写fun1(),那么用父类引用a去调用fun1()时,我认为调用的是A类中的fun1().但是别人认为调用的仍是B类继承来的fun1().我就这一点不懂了。老师说过,父类引用指向子类对象时,如果子类重写了父类中的方法后,用父类引用调用这个方法,调用的是子类重写过来的这个方法。所以我想问你:父类引用指向子类对象时,如果子类没有重写父类中的方法,仅仅是子类继承了父类中的这个方法,那么用父类引用去调用这个方法,调用的是父类中的这个方法,还是子类从父类继承过来的这个方法?为什么?
作者: RINGARES    时间: 2014-11-8 20:09
______雨点ペ 发表于 2014-11-8 17:36
哪有两个Public修饰的类?就一个类A被public修饰了!

哦,看错了,那就是声明public 的类,名称要和.java文件名一致,除此以外代码没有问题
作者: RINGARES    时间: 2014-11-8 20:14
______雨点ペ 发表于 2014-11-8 20:02
你看啊!B类继承了A类中的fun1(),因此B b = new B()后,用b调用fun1(),调用的是B继承过来的fun1(),然后 ...
父类引用指向子类对象时,如果子类没有重写父类中的方法,仅仅是子类继承了父类中的这个方法,那么用父类引用去调用这个方法,调用的是父类中的这个方法,还是子类从父类继承过来的这个方法?


实际上还是子类对象去调取这个方法,这个方法是子类从父类继承过来的,就是子类的方法了
作者: ______雨点ペ    时间: 2014-11-8 20:59
RINGARES 发表于 2014-11-8 20:14
实际上还是子类对象去调取这个方法,这个方法是子类从父类继承过来的,就是子类的方法了 ...

那你的意思是当父类引用指向子类对象时,用父类引用去调用某个方法(这个方法不是子类特有的方法),调用的是子类继承过来的方法。如果子类重写了父类中的这个方法,用父类引用调用的是子类重写过来的这个方法。这两种情况的区别就是:一种是父类引用调用的是子类继承过来的方法,一种是父类引用调用的是子类重写过来的的方法。对吗?
作者: RINGARES    时间: 2014-11-8 21:24
______雨点ペ 发表于 2014-11-8 20:59
那你的意思是当父类引用指向子类对象时,用父类引用去调用某个方法(这个方法不是子类特有的方法),调用 ...

没错的~~
作者: HelloWorld!    时间: 2014-11-8 21:57
一个java源文件中可以定义多个类,但最多只能有一个类用public修饰,也可以都不用public修饰。当有一个类被public修饰时,那么java源文件名必须和这个公共类类名一致(包括大小写);如果没有类被public修饰,那么源文件名可以随便起。因为你的A类是public修饰的类,所以如果你的源文件名不是A.java的话,编译无法通过。B b = new B( );创建了一个B类对象new B( ),内存地址赋给引用b。A a = b;是将b中存储的对象newB()的地址值赋给引用a,a指向了newB(),内存中始终只存在一个对象newB(),所以,b.fun1();a.fun1();调用的都是newB()的方法,调用fun1()方法时执行的fun2()是复写了A类的fun2()。结果两次都是999
作者: date1130    时间: 2014-11-8 22:32
哇塞,,过来学习一下哈。。。
作者: javaAndroid    时间: 2014-11-8 22:58
一个java文件中最多有一个public类
可以没有public类
如果有public类
那main方法必须放在public类中。
几个方法
1、去掉public,这个最直接
2.把main函数移到A类中。
3.把B类改为public,去掉A前面的public,并把文件名改为B.java
结果是两个999
因为子类重写了父类的fun2
并且a指向的是子类对象,所以调用的是子类的fun2





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2