牛客刷Java记录第四天

第一题,单选题

class Car extends Vehicle
{
    public static void main (String[] args)
    {
        new  Car(). run();
    }
    private final void run()
    {
        System. out. println ("Car");
    }
}
class Vehicle
{
    private final void run()
    {
        System. out. println("Vehicle");
    }
}

下列哪些针对代码运行结果的描述是正确的?
A Car
B Vehicle
C Compiler error at line 3
D Compiler error at line 5
E Exception thrown at runtime

答案:A 首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。
此题的父类方法有private修饰,所以对子类不可见,子类不能覆盖。所以子类方法和父类是两个方法。

扩展:如果父类方法将private改为public 会怎样?

会报错,会报编译的错误,报错位置在子类方法的声明的位置。因为父类方法有final修饰,不能被覆盖。

第二题
单选,假定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");
   }
}

A ABDC
B AB
C ABCD
D ABC

解析:
因为 Java 里的方法不能独立存在,它必须属于一个类或一个对象,因此方法也不能直接像函数那样被独立执行,执行方法时必须使用类或对象作为调用者,即所有的方法都必须使用“类.方法”或“对象.方法” 的形式来调用。这里可能产生一个问题:同一个类里不同方法之间相互调用时,不就可以直接调用吗?这里需要指出的是:同一个类的一个方法调用另一个方法时,如果被调用方法是普通方法,则默认使用 this 作为调用者;如果被调用方法时静态方法,则默认使用类作为调用者。也就是说表面上看起来某些方法可以被独立执行,但实际上还是使用 this 或类来作为调用者。

扩展:
如果将Base类中的methodTwo方法改为static,那么这个方法将和子类的methodTwo方法没有任何关系,与此同时,子类的methodTwo方法如果还想用,也要改为静态的,方法体里的super,this啥的都不能用了。原因是子类无法覆盖父类中的静态方法,只能隐藏。静态方法是属于类的,不属于对象,所以在父类中使用methodTwo(),使用的是父类的方法。

答案:A

posted @ 2023-10-06 12:28  yx1024  阅读(7)  评论(0编辑  收藏  举报