A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范晓冲 中级黑马   /  2014-1-10 10:24  /  1181 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 范晓冲 于 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, 下载次数: 10)

哪有问题呢

哪有问题呢

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
楼上讲解的很详细!
回复 使用道具 举报
print3()是子类的新方法 父类的上转型对象p是没有权限调用子类的新方法的。p只能调用子类与父类共有的方法(子类重写父类的方法+父类未被重写的方法)。希望对你有用
回复 使用道具 举报
mayor125 发表于 2014-1-10 11:15
Person p = new Student();这是用子类去实例化父类对象,是多态的向上转型的表现。

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

恩,知道了,谢谢
回复 使用道具 举报
不冬眠的蚂蚁 发表于 2014-1-10 13:08
print3()是子类的新方法 父类的上转型对象p是没有权限调用子类的新方法的。p只能调用子类与父类共有的方法 ...

恩恩 ,明白了,谢谢啊
回复 使用道具 举报
用 Person 类new出的对象 ,Person是 Student的父类 子类独有的方法父类是不会有的,只有父类的公有方法,子类才会继承,所以会报错

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 +1鼓励分!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马