黑马程序员技术交流社区

标题: 一个关于继承的实例,为什么出错呢,不可以这样用吗?? [打印本页]

作者: Rockray    时间: 2013-10-14 20:33
标题: 一个关于继承的实例,为什么出错呢,不可以这样用吗??
本帖最后由 Rockray 于 2013-10-15 14:35 编辑
  1. public class ExtendsDemo {
  2.     public static void main(String[] args){
  3.         Student s = new Student("张三",23);
  4.         Teacher t = new Teacher("李四",35);
  5.         Print(s);
  6.         Print(t);
  7.     }
  8.     private static void Print(Person p){
  9.         if(p instanceof Student){
  10.             System.out.println(p.name+" "+p.age+" "+p.eat());
  11.             p.learn();
  12.         }
  13.         else if(p instanceof Teacher){
  14.             System.out.println(p.name+" "+p.age+" "+p.eat());
  15.             p.teach();
  16.         }
  17.         else{ System.out.println("error");}
  18.     }
  19. }
  20. class Person{
  21.     public String name;
  22.     public int age;
  23.     public String eat(){
  24.         return "吃饭";
  25.     }
  26. }
  27. class Student extends Person{
  28.     Student(String name,int age){
  29.         this.name = name;
  30.         this.age = age;
  31.     }
  32.     public void learn(){
  33.         System.out.println("学习");
  34.     }
  35. }
  36. class Teacher extends Person{
  37.     Teacher(String name,int age){
  38.         this.name = name;
  39.         this.age = age;
  40.     }
  41.     public void teach(){
  42.         System.out.println("教课");
  43.     }
  44. }
复制代码
出错详见:
  1.     private static void Print(Person p){
  2.         if(p instanceof Student){
  3.             System.out.println(p.name+" "+p.age+" "+p.eat());
  4.             p.learn();
  5.         }
  6.         else if(p instanceof Teacher){
  7.             System.out.println(p.name+" "+p.age+" "+p.eat());
  8.             p.teach();
  9.         }
  10.         else{ System.out.println("error");}
  11.     }
复制代码
这一部分代码为什么错了呢,难道不可以这样用吗?

作者: Rockray    时间: 2013-10-14 21:06
{:soso__8879803156314953240_4:}
求教各位大神

作者: loading……99.9    时间: 2013-10-14 21:29
  1. private static void Print(Person p)
  2.         {
  3.                 if (p instanceof Student)
  4.                 {
  5.                         Student student = (Student)p;
  6.                        
  7.                         System.out.println(student.name + " " + student.age + " " + student.eat());
  8.                         student.learn();
  9.                 }
  10.                 else if (p instanceof Teacher)
  11.                 {
  12.                        
  13.                         Teacher t = (Teacher)p;
  14.                        
  15.                         System.out.println(t.name + " " + t.age + " " + t.eat());
  16.                         t.teach();
  17.                 }
  18.                 else
  19.                 {
  20.                         System.out.println("error");
  21.                 }
  22.         }
复制代码
学习和上课都是person类的特定子类的方法,Person类没有这2个类。因此你需要强制类转换。
作者: 飘落    时间: 2013-10-14 21:32
learn()和teach()不是父类Person的方法,用p调用就会报错。
如果需要,可以把类型强制转换。改后代码如下:
  1.         private static void Print(Person p){
  2.             if(p instanceof Student){
  3.                 System.out.println(p.name+" "+p.age+" "+p.eat());
  4.                 Student s=(Student)p;
  5.                 s.learn();
  6.             }
  7.             else if(p instanceof Teacher){
  8.                 System.out.println(p.name+" "+p.age+" "+p.eat());
  9.                 Teacher t=(Teacher)p;
  10.                 t.teach();
  11.             }
  12.             else{ System.out.println("error");}
  13.         }
复制代码

作者: 王飚    时间: 2013-10-14 21:50
  1. class ExtendsDemo {
  2.     public static void main(String[] args){
  3.         Student s = new Student("张三",23);
  4.         Teacher t = new Teacher("李四",35);
  5.         Print(s);
  6.         Print(t);
  7.     }

  8.         /*
  9.         楼主的问题是由于在下面的这个打印语句中发生了类型提升(多态),
  10.         而在这个Print方法中的输出语句中又没有将类型转换回来,也就是说,
  11.         编绎出现的错误是因为你的这个Person父类中并没有learn()和teache()的方法;
  12.         我在下面注释部分已经帮楼主作了更改:
  13.         */
  14.     private static void Print(Person p)
  15.                 {
  16.         if(p instanceof Student)
  17.                 {
  18.                         Student s=(Student)p;//这里,将类型转为Student(),因为传入的是父类的类型Person;
  19.             System.out.println(s.name+" "+s.age+" "+s.eat());//这里使用的是子类Student的方法;
  20.             s.learn();
  21.         }
  22.         else if(p instanceof Teacher)
  23.                         {
  24.                         Teacher t=(Teacher)p;//这里,将类型转为Teacher(),因为传入的是父类的类型Person;
  25.             System.out.println(t.name+" "+t.age+" "+t.eat());//这里使用的是子类Teacher的方法;
  26.             t.teach();
  27.         }
  28.         else{ System.out.println("error");}
  29.     }
  30. }
  31. class Person{
  32.     public String name;
  33.     public int age;
  34.     public String eat(){
  35.         return "吃饭";
  36.     }
  37. }
  38. class Student extends Person{
  39.     Student(String name,int age){
  40.         this.name = name;
  41.         this.age = age;
  42.     }
  43.     public void learn(){
  44.         System.out.println("学习");
  45.     }
  46. }
  47. class Teacher extends Person{
  48.     Teacher(String name,int age){
  49.         this.name = name;
  50.         this.age = age;
  51.     }
  52.     public void teach(){
  53.         System.out.println("教课");
  54.     }
  55. }
复制代码

作者: hyz123456    时间: 2013-10-14 22:03
嗯 需要强制转换,或者你把父类Person类里面加上learn方法
作者: Rockray    时间: 2013-10-15 14:35
谢谢大家,我懂了{:soso__14649321626812542408_7:}




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