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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东城 中级黑马   /  2013-2-5 16:32  /  1322 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东城 于 2013-2-6 02:54 编辑

class A{
  public void f(){
   System.out.println("A");}
  }
class B extends A{
  public void f(){
   System.out.println("B");}
   }
class duotai{
  public static void main(String args[]){
   A p=new B();
   p.f();
  }
}
这个运行结果:B  是由于A的引用P指向了B 的实例。
class A{
  public void f(){
   System.out.println("A");}
  }
class B extends A{
  public void m(){
   System.out.println("B");}
   }
class duotai{
  public static void main(String args[]){
   A p=new B();
   
   p.m();
  }
}
这个运行时报错,不知为什么报错,求指教

5 个回复

倒序浏览
A类中没有m这个方法
编译看左边,运行看右边。
你这代码是编译错误的 !
回复 使用道具 举报
    朋友,你对多态的理解还不够充分。
    A p=new B();
    p.m();
     p.m()在编译时就会提示错误。知道为什么吗?p在声明是A类型,那么调用的方法也必须是A类所拥有的方法,否则不能被编译器所识别。
多态的实质就是编译时类型和运行时类型可以不一样。如果在实例化时确定了p的类型为A的子类,那么运行时p调用的方法将表现出子类的行为。简单一点说就是调用子类的方法。但这里有个前提,那就是这个方法必须是重写的方法,也就是说。此时调用的方法必须是复写了父类的方法。就像你第一个例子那样,B类复写了A类的f方法。在运行时就会调用B类的f方法。
回复 使用道具 举报
      还需要提醒的是,你定义类的名字实在让人眼晕,A,B都写出来了。这是非常不好的命名规范。你写成Father,Son都比这个要好。方法也最好用单词,不要随便就弄个字母就OK了。你这只有几行,还无所谓,但是其实我还是看得有点小纠结,希望能改正。
回复 使用道具 举报
多态:父类的引用指向子类的对象。你父类没有m方法,编译就不通过啊
多态,它会先去父类寻找有没有该方法?没有的话,去子类寻找
回复 使用道具 举报
A只能调用A中有的函数,不能调用那些只存在于子类的中的方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马