首页 > 试题广场 >

下列程序执行后结果为( )

[单选题]
下列程序执行后结果为( )
 class A {
     public int func1(int a, int b) {
         return a - b;
     }
 }
 class B extends A {
     public int func1(int a, int b) {
         return a + b;
     }
 }
 public class ChildClass {
     public static void main(String[] args) {
     A a = new B();
     B b = new B();
     System.out.println("Result=" + a.func1(100, 50));
     System.out.println("Result=" + b.func1(100, 50));
     }
 }
  • Result=150
    Result=150
  • Result=100
    Result=100
  • Result=100
    Result=150
  • Result=150
    Result=100
向下转型,所以在对象a中用的还是A对象的方法
发表于 2017-05-16 22:46:41 回复(1)
更多回答
其实很简单,涉及转型的题目,分为向上或者向下转型。
关键的来了,不论向上或者向下转型,都是一句话,“编译看左边,运行看右边”。也就是编译时候,会看左边引用类型是否能正确编译通过,运行的时候是调用右边的对象的方法。
就本题来说,编译时候会发现左边满足条件所以编译通过,运行时候又会调用右边也就是 class B 的方法,所以答案都是150。
发表于 2017-05-31 12:18:51 回复(28)
“编译看左边,运行看右边”,也就是说编译的时候,会看左边的引用类型是否能够正确编译通过,运行的时候是调用右边的对象的方法。
发表于 2017-09-18 18:02:31 回复(0)
  此题考查的是多态。
  对于多态,可以总结它为:       

     一、使用父类类型的引用指向子类的对象;

    二、该引用只能调用父类中定义的方法和变量;

    三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

    四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

多态的3个必要条件:

        1.继承   2.重写   3.父类引用指向子类对象。

向上转型: Person p = new Man() ; //向上转型不需要强制类型转化
向下转型: Man man = (Man)new Person() ; //必须强制类型转化
编辑于 2017-06-04 17:06:39 回复(13)
好险,如果答案中有“50”的话我就该答错了!
发表于 2018-03-01 16:27:46 回复(18)
多态绑定机制:
  1. 实例方法与引用变量所引用的对象的方法绑定;
  2. 静态方法与引用变量所声明的类型的方法绑定;
  3. 成员变量(实例变量、静态变量)与引用变量所声明的类型的成员变量绑定。

在这道题目中,由于都是实例方法,所以与所引用的对象的方法绑定。(new 后跟引用对象)

编辑于 2017-12-28 10:08:58 回复(1)
成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边。
发表于 2017-05-30 19:53:02 回复(0)
静态方法编译看左,运行看左
成员方法编译看左,运行看右
成员变量编译看左,运行看左
发表于 2018-07-25 15:33:40 回复(2)

B类继承了A类,并重写了A类中的func1()方法,运行时根据实际类型对象调用相应的方法。

发表于 2017-05-16 22:09:04 回复(0)
非静态:编译看左,运行看右 静态成员变量:都看左
发表于 2018-01-05 10:30:15 回复(0)
深入了解JVM虚拟机,第八章第二节,了解一下。
发表于 2018-06-27 08:58:13 回复(0)
A a = new B(); 这是向上转型。 a的应用指向一个B的的对象。
B b=(B)a; 这是向下转型。 此时a还是指向一个B的对象。

A a =new A();
B b=(B)a;   
此时会报错。原因:子类引用不能指向父类对象
发表于 2017-05-30 20:55:14 回复(2)
对于非静态的方法,编译看左边运行看右边。因为func是被子类重写的方法,所以都依照子类的方法来执行
发表于 2021-12-21 18:14:14 回复(1)
编译看左边,运行看右边
发表于 2021-11-04 18:36:49 回复(0)
成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边
发表于 2021-08-24 23:43:45 回复(0)
转型:编译看左边,运行看右边
发表于 2021-02-04 10:04:21 回复(0)
在这题中,因为a和b都是new的B对象,所以就是B中的方法,所以打印输出的都是150
发表于 2020-11-28 11:41:30 回复(0)
左编译,右运行。运行时a.func1(100, 50)和b.func1(100, 50)调用的都是子类的func1方法。
发表于 2019-12-03 15:29:55 回复(0)
子类和父类存在同名的成员变量和静态变量,如何访问的口诀? 多态的解释: 一: 对于多态中的静态变量、静态方法、成员变量来讲,编译看左,运行也看左。无论右边是当前类还是当前类的子类,编译和运行期间执行的都是当前类中的方法。 二: 对于多态中的非静态方法,编译看左,运行看右。也就是在编译期间看左边的类中有无该方法/属性,而实际在运行时执行的是右边类的方法/属性。如果编译期间没有在左边的类找到该非静态域,则会报编译错误
发表于 2023-11-06 12:03:33 回复(0)
非静态变量看右边
发表于 2023-09-10 23:21:29 回复(0)