首页 > 试题广场 >

假定Base b = new Derived(); 调用执行

[单选题]
假定Base b = new Derived(); 调用执行b.methodOne()后,输出结果是什么?
public class Base
{
   public void methodOne()
   {
      System.out.print("A");
      methodTwo();
   }

   public void methodTwo()
   {
      System.out.print("B");
   }
}

public class Derived extends Base
{
   public void methodOne()
   {
      super.methodOne();
      System.out.print("C");
   }

   public void methodTwo()
   {
      super.methodTwo();
      System.out.print("D");
   }
}


  • ABDC
  • AB
  • ABCD
  • ABC
只要是被子类重写的方法,不被super调用都是调用子类方法
发表于 2019-10-11 00:41:23 回复(11)
看了上面的解析个人总结的:(有错误希望指正,谢谢*--*)
知识点:
            1.多态中成员方法使用规则  编译看左边,运行看右边。
            2..多态中,子类重写的方法,当super调用就是调用父类方法。

发表于 2020-07-24 21:22:50 回复(26)
这是一道类多态的向上转型题。
Base b = new Derived();
向上转型:父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的。
因此:
调用的顺序是:(1)、(2)、(3)、(4)、(5)、(6)、(7) ; 得到的结果是:ABDC
class Base
{ public void methodOne()  // (3)
    {
        System.out.print("A");
        methodTwo();  //执行到这里的时候调用子类的覆盖方法 (4)
    } public void methodTwo() // (7)
    {
        System.out.print("B");
    }
} 
 class Derived extends Base { public void methodOne() // (1)
    { super.methodOne();   // (2)
        System.out.print("C");
    } public void methodTwo()  //该方法为重写了父类的方法 (5)
    { super.methodTwo(); //(6)
        System.out.print("D");
    }
}

发表于 2019-08-30 16:58:06 回复(9)
关于子类继承父类中方法的调用,只要不是用super调用,调用的都是子类中覆写父类的方法。
如果将这道题目修改一下,将父类中的methodTwo()改成静态方法,代码如下:

结果为:

原因是子类无法覆盖父类中的静态方法,只能隐藏。静态方法是属于类的,不属于对象,所以在父类中使用methodTwo(),使用的父类的方法。
发表于 2020-02-05 12:34:29 回复(2)
这里先引用《疯狂Java讲义》中的一段话:
因为 Java 里的方法不能独立存在,它必须属于一个类或一个对象,因此方法也不能直接像函数那样被独立执行,执行方法时必须使用类或对象作为调用者,即所有的方法都必须使用“类.方法”或“对象.方法” 的形式来调用。这里可能产生一个问题:同一个类里不同方法之间相互调用时,不就可以直接调用吗?这里需要指出的是:同一个类的一个方法调用另一个方法时,如果被调用方法是普通方法,则默认使用 this 作为调用者;如果被调用方法时静态方法,则默认使用类作为调用者。也就是说表面上看起来某些方法可以被独立执行,但实际上还是使用 this 或类来作为调用者。
以上文字表明 methodTwo() 方法被调用的时候,会隐式的在前面加上 this 关键字,this 代表的是当前正在调用这个方法的对象,正是子类 Derived 对象,所以调用子类对象的 methodTwo() 方法。
发表于 2020-06-14 19:04:45 回复(6)
不管是methodTwo()还是this.methodTwo()都是父类类型Base 的Derived(多态),只有super才会直接使用父类的对象方法,所以父类中的methodTwo()是调用Derived对象
发表于 2019-08-21 10:28:55 回复(7)
继承关系中,用多态创建子类对象,我们在调用一个父类被子类重写的方法时,不管是在子类中调用还是在父类中调用,不被super调用都是调用子类方法,只有用super调用时才是调用父类的方法。
发表于 2019-11-28 16:13:19 回复(0)
public void methodOne()
{
System.out.print("A");
methodTwo();//调用的是子类的methodTwo方法,而子类的又有super关键字,所以先调用父类的methodtwo方法,此时先输出的是B,然后输出D
}
最后执行完print(“C”)
编辑于 2019-08-27 09:58:40 回复(0)

竟然没解析

发表于 2019-08-21 08:23:08 回复(0)
是不是只要没有用super关键字声明的,一律用子类的方法
发表于 2019-10-26 23:25:30 回复(2)
这么理解可否,重写又叫覆盖,覆盖之后,只要不加super,执行的都是子类的方法。
发表于 2019-08-21 21:02:53 回复(3)
发表于 2021-12-23 15:44:23 回复(1)
太难了。。
发表于 2019-09-30 20:35:58 回复(2)
只要是被子类重写的方法,不被super调用都是调用子类方法
发表于 2022-03-15 21:23:29 回复(0)
简单来说这样考虑:
父类是Base     子类是Derived
第一点:父类 对象=new 子类();
(super.父类中的方法)---------------调用的是父类的方法
那为什么子类中还有一个和父类中相同的方法呢?
因为fu extend zi,由此可知父类中的方法被重写了。
-----------------------------------------------------------------------
难点:BD是咋回事,为什么不是BC
在父类中method1方法中包含method2,method2又被子类重写,
所以在执行子类method1顺序如下:
1.super.method1 找到父类中的method1输出A
2.在父类method1中有method2,找到父类中method2,输出B
3.method2被子类重写,回到子类method2,输出重写后的值D
4.父类中method1真正执行完了,回到子类method1,执行super.method1 的下一句输出C

编辑于 2021-09-23 08:13:28 回复(0)
调用super.methodOne()时,内部的methodTwo()有动态绑定,执行的是对象自身的methodTwo
发表于 2022-04-17 09:53:28 回复(0)
发表于 2020-09-29 23:10:51 回复(1)
 向上转型 父类 父类对象 = 子类实例 

1.父类有的方法,都可以调用,如果被子类重写了,则会调用子类的方法。

2. 父类没有的方法,而子类存在,则不能调用。 

发表于 2020-06-25 11:20:16 回复(0)
参考评论区解答自己写一个题解,加深一下印象,有错误的话欢迎指出
预备知识:
多态向上转型命名规则:父类 父类对象 = 子类实例
具体使用方法:
1.父类有的方法都可以调用,如果该方法被子类重写,则调用子类的该方法
2.子类自己创建的方法不能调用
使用的好处:减少重复代码以及提高程序扩展性
解答:
用第一条就可以解此题,具体顺序如下:按字母顺序a~h
public class Base
{
   public void methodOne()      //c.执行此方法
   {
      System.out.print("A");       
      methodTwo();                   //d.到这里默认执行子类重写的methodTwo()方法
   }
 
   public void methodTwo()     //f.执行此方法打印“B”
   {
      System.out.print("B");        
   }                                            //执行完之后继续执行子类的methodTwo()
}
 
public class Derived extends Base
{
   public void methodOne()          //a. 从子类的methodOne() 方法进入
   {
      super.methodOne();              //b .super关键字表示调用父类的methodOne()方法
      System.out.print("C");           //h.打印“C” 结束得到结果“ABDC”
   }
 
   public void methodTwo()
   {
      super.methodTwo();             //e.调用父类的methodTwo()方法
      System.out.print("D");          
   }                                              //g.执行完之后继续执行子类的methodOne() 
}



发表于 2020-04-06 15:25:47 回复(3)
Base b=new Derived();
调用看左边,执行看右边
发表于 2020-03-20 22:41:18 回复(0)