黑马程序员技术交流社区

标题: 编译时报错了,帮忙看看呗 [打印本页]

作者: 范晓冲    时间: 2014-1-10 10:24
标题: 编译时报错了,帮忙看看呗
本帖最后由 范晓冲 于 2014-1-10 15:50 编辑

下面的代码编译时出错了,但是我看着没问题啊,哪里有错呢?求指点。

  1. class Person{
  2.                 public void print1(){
  3.                                 System.out.println("Person print_1111");        
  4.                 }        
  5.                 public void print2(){
  6.                                 System.out.println("Person print_2222");        
  7.                 }        
  8. }
  9. class Student extends Person{
  10.                 public void print1(){
  11.                                 System.out.println("SSSsss print_1111");        
  12.                 }        
  13.                 public void print3(){
  14.                                 System.out.println("SSSs print_3333");        
  15.                 }               
  16. }
  17. public class Polymorphic{
  18.                 public static void main(String[] args){
  19.                                 
  20.                                 Person p=new Student();
  21.                                 p.print1();
  22.                                 p.print2();
  23.                                 p.print3();
  24.                 }        
  25. }
复制代码

结果如下:




Polymorphic.png (44.55 KB, 下载次数: 16)

哪有问题呢

哪有问题呢

作者: mayor125    时间: 2014-1-10 11:15
Person p = new Student();这是用子类去实例化父类对象,是多态的向上转型的表现。

但是在主函数中使用对象p调用print3方法的时候报错是因为父类中没有print3这个方法

另外:
p.print1();调用的是被子类覆写过的方法。
p.print2();调用的是父类Person中的方法,此方法没有被子类覆写过,又在父类中存在,所以调用时不会报错。

如果你想要调用print3()方法,可以按照如下代码来做,只要在主方法中做如下修改:
  1. public class Polymorphic
  2.         {
  3.                 public static void main(String[] args)
  4.                 {
  5.                                 
  6.              Person p = new Student();
  7.              Student s = (Student)p;

  8.              s.print1();
  9.              s.print2();
  10.              s.print3();
  11.          }        
  12. }
复制代码

作者: 651012160    时间: 2014-1-10 11:38
楼上讲解的很详细!
作者: 不冬眠的蚂蚁    时间: 2014-1-10 13:08
print3()是子类的新方法 父类的上转型对象p是没有权限调用子类的新方法的。p只能调用子类与父类共有的方法(子类重写父类的方法+父类未被重写的方法)。希望对你有用
作者: 范晓冲    时间: 2014-1-10 15:41
mayor125 发表于 2014-1-10 11:15
Person p = new Student();这是用子类去实例化父类对象,是多态的向上转型的表现。

但是在主函数中使用对 ...

恩,知道了,谢谢
作者: 范晓冲    时间: 2014-1-10 15:49
不冬眠的蚂蚁 发表于 2014-1-10 13:08
print3()是子类的新方法 父类的上转型对象p是没有权限调用子类的新方法的。p只能调用子类与父类共有的方法 ...

恩恩 ,明白了,谢谢啊
作者: 630681386@qq.co    时间: 2014-1-10 16:12
用 Person 类new出的对象 ,Person是 Student的父类 子类独有的方法父类是不会有的,只有父类的公有方法,子类才会继承,所以会报错




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