首页 > 试题广场 >

下列代码输出结果为( ) clas...

[单选题]
下列代码输出结果为(      )
class Animal{
    public void move(){
        System.out.println("动物可以移动");
    }
}
class Dog extends Animal{
    public void move(){
        System.out.println("狗可以跑和走");
    }
    public void bark(){
        System.out.println("狗可以吠叫");
    }
}
public class TestDog{
    public static void main(String args[]){
        Animal a = new Animal();
        Animal b = new Dog(); 
        a.move();
        b.move();
        b.bark();
    }
}

  • 动物可以移动
    狗可以跑和走
    狗可以吠叫
  • 动物可以移动
    动物可以移动
    狗可以吠叫
  • 运行错误
  • 编译错误
编译看左边,运行看右边。 父类型引用指向子类型对象,无法调用只在子类型里定义的方法
编辑于 2019-11-17 18:46:33 回复(16)
编译错误:The method bark() is undefined for the type Animal。Animal中没有定义bark()方法。
Dog继承自Animal。
当用Dog对象初始化Animal类对象时,完成了对Animal对象中方法与变量的覆盖与隐藏,也就是b.move()调用的是Dog中move()方法。而Animal中本身并没有bark()方法,不存在被覆盖的情况,亦无法访问,也就是b.bark()会报错。
发表于 2019-06-24 16:52:47 回复(6)
编译看左边,运行看右边
发表于 2019-11-15 22:13:58 回复(6)
编译看左边,运行看右边。也就是是编译的时候会把它当成左边的类型,运行的时候看右边类型的方法体。这个题动物类没有另一个方法,而b调用了,所以编译器会认为b是一个动物类,所以报错。这就是多态的特性吧
发表于 2020-04-19 21:33:50 回复(3)
编译看左边,运行看右边。父类不能调用子类的独有方法。这么多人复制说但是都没说出原因,就是因为JVM在编译时期把b当做Animal类,发现没有bark方法,所以就报错了,就这么简单。所以在父类对象指向之类实例中,想调用子类的方法父类必须也存在同样的方法,因为编译时会把它当父类,如果没有这个方***报错。
发表于 2021-12-06 08:59:39 回复(3)

父类引用指向子类对象,无法使用子类中的独有方法,编译器会认为父类对象没有该方法进行报错

父类添加方法后调用父类方法,运行结果:


说明了编译看左,运行看右

发表于 2021-07-27 17:05:44 回复(1)
多态有一个特点也可以说是一个弊端:无法使用子类特有的内容(属性、方法)
发表于 2020-06-17 20:28:51 回复(2)
编译看左边,运行看右边。 父类型引用指向子类型对象,无法调用只在子类型里定义的方法
发表于 2020-05-12 22:30:46 回复(0)
向下造型,父类引用指向子类对象,不能调用父类中没有的方法。
发表于 2019-12-15 20:30:08 回复(0)
<p>多态三要素:1.父子关系。2.子类重写父类方法。3.父类引用指向子类对象。</p>
发表于 2020-06-23 10:21:12 回复(0)
成员变量,静态方法看左边;
非静态方法:编译看左边,运行看右边。
意思是:当父类变量引用子类对象时      Fu f = new Zi();        
在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致的,
他的非静态方法,在编译时是与父类一致的,运行时却与子类一致(发生了重写)。
发表于 2021-09-11 15:37:39 回复(0)
编译看左边,运行看右边
发表于 2019-12-07 04:48:27 回复(0)
((Dog)b).break()   就对了
发表于 2019-11-22 14:13:56 回复(0)
讲一大堆没用的,其实就是父类引用不能调用子类特有方法
发表于 2021-09-28 13:20:50 回复(0)
可以写成
((Dog) b).bark();
向下转型一下
发表于 2022-02-21 17:19:36 回复(0)
父类不能点用子类独有的方法。
发表于 2022-01-22 13:10:23 回复(0)
编译看左边。 运行看右边
发表于 2022-01-03 19:22:01 回复(0)
在调用成员变量以及静态方法时,使用new Dog()对animal 对象赋值,得到的还是animal对象,输出的成员变量或调用的静态方法,与animal对象一致

在调用非静态方法时,animal对象是用Dog()来实例化的,这个非静态方法在运行时会被重写,从而输出子类中方法被重写后的结构

即编译看左边,运行看右边

编辑于 2021-01-25 11:00:23 回复(1)
<p>多态中成员变量的使用特点</p><p><br></p><p> 1. 直接通过过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找;</p><p> 2. 间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则向上找;</p><p><br></p><p><br></p><p>多态中成员方法的使用特点</p><p><br></p><p>看new的是谁,就优先用谁,没有则向上找。</p><p>口诀:</p><p>成员方法:编译看左边。运行看右边。</p><p>成员变量:编译看左边,运行还是看左边。</p>
发表于 2020-10-08 16:30:44 回复(0)
Animal b= new Dog();采用了多态,父类型引用指向子类型对象。但是当父类型引用调用子类型方法时,编译期是静态绑定,会默认检查父类型中是否有bark()方法。若需要编译通过,可以使用instanceof对b引用进行判断是否属于Dog类型
发表于 2020-07-29 08:13:26 回复(0)