首页 > 试题广场 >

观察以下代码,下列哪些针对代码运行结果的描述是正确的?

[单选题]
观察以下代码:
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");
    }
}

下列哪些针对代码运行结果的描述是正确的?
  • Car
  • Vehicle
  • Compiler error at line 3
  • Compiler error at line 5
  • Exception thrown at runtime
推荐
答案:A
首先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。
编辑于 2015-01-27 21:12:36 回复(45)
此题的父类方法有private修饰,所以对子类不可见,子类不能覆盖。所以子类方法和父类是两个方法。
扩展:如果父类方法将private改为public 会怎样?
        会报错,因为父类方法有final修饰,不能被覆盖。
发表于 2016-03-08 16:27:42 回复(14)
我想知道没有 public 修饰类,,它是怎么跑起来的,虽然我也考虑到了这个可能不是考点所在,但是我就是好在意啊啊啊啊
发表于 2018-10-22 20:26:40 回复(1)
派生类修饰符范围应该不超过父类范围,所以派生类中的run()方法不是重写父类run()方法
发表于 2018-04-27 13:58:27 回复(0)
。。。。错的一塌糊涂
发表于 2018-04-14 14:09:29 回复(0)
final不能被子类覆盖,但是基类的private方法,只有非private方法才能被覆盖。子类虽然继承了基类的所有内容,但是private和构造器等对子类是不可见的,不能直接访问,但是可以调用基类的非parivate方法从而访问基类的private方法,也会引起很多问题。
class Shape {  
    private Shape wf;  
    protected Shape() {  
        wf = this;  
    }  
    private int length() {  
        return 0;  
    }  
    private int width() {  
        return 0;  
    }  
    public int getArea() {  
        return wf.length()*wf.width();  
    }  
}  
public class OverridingShape extends Shape {  
    public int length() {  
        return 10;  
    }  
    //@Override 不是覆盖,基类该方法是private,子类不可见
    public int width() {  
        return 10;  
    }   
    public static void main(String[] args) {  
        Shape s=new OverridingShape();  
        System.out.println(s.getArea());  
//结果是0而不是100 调用的是父类的方法,然后访问的是父类的private方法
    }  
}  

发表于 2015-04-13 15:55:03 回复(5)
A. 父类的私有方法对子类是不可见的。
发表于 2014-10-27 10:10:47 回复(0)
这道题选项意思有点误差,它的行号不是旁边这个数字,想考查的应该是忽略括号的行号。。
第三行: new  Car(). run();
第五行: private final void run()
错误C:误认为private方法是不能通过对象调用的;我们说的private修饰符限制的是该成员的被访问权力,private表示本类内私有可见,因此只有在本类内才能使用该成员,那么本题内在Car类内的main方法能不能用到private方法呢?由此一来肯定是可以的,因为不是静态成员,访问必然需要对象来访问new Car().run();这句话在本类内是不会报错的

错误D:一个private和final联用的问题:编译器首先看到的是private关键字,因此Vehicle类里面的run方法在Car类内是不可见的!因此Car里面的这个run方法并不是重写,而是简单的一个本类私有方法。当我们把父类里面的private改成public的时候就不一样了,这时候会出现两个错误!Car类必然会继承这一方法(final影响的是方法能否被重写而非能否被继承),Car类此时的run()方法则被视为重写,会要求private改成public与父类一致,与此同时一旦子类中出现了对继承而来的final方法的重写也会出现错误!
编辑于 2019-05-14 22:04:02 回复(1)
A.当基类方法申明为final表示该方法不能被子类重写,但是这里的final方法是私有的,子类是访问不到的,所以不会报错。子类调用run方法也就只能调用本类的run方法
发表于 2015-08-10 17:29:25 回复(0)
父类的方法是私有的 对子类不可见 子类和父类是两个独立的方法 并没有重写 如果父类是公有的 会报错 因为是final的 不能重写
发表于 2022-03-27 09:53:00 回复(0)
在本事例中:虽然final声明的父类Car中的run方法不能被子类所重写,但是并不会报错,因为父类中的run方法是private的,
意味着对子类是不可见的,子类不能直接去调用,同时子类定义有自己的private的run方法,通过子类的实例化对象(new Car())
去调用的run方法是子类自身的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。

编辑于 2018-04-21 15:48:46 回复(0)
父类私有方法无法被子类查看,不存在覆写,如果把private变成public,有final则不能被子类覆写,会编译报错。
发表于 2022-01-31 18:39:28 回复(0)
此题的父类方法有private修饰,所以对子类不可见,子类不能覆盖。所以子类方法和父类是两个方法。
扩展:如果父类方法将private改为public 会怎样?
        会报错,因为父类方法有final修饰,不能被覆盖。
会报编译的错误,报错位置在子类方法的声明的位置
发表于 2022-06-23 10:32:01 回复(0)
final修饰的方法不能被覆盖,也就是说子类没有继承父类的run方法,子类执行的是自己的run方法
发表于 2021-08-19 06:56:15 回复(0)

首先明白final修饰的方法是不能被重写的,然后private修饰的父类方法子类虽然继承了,但是是无法访问的,所以这里访问的仍然是子类的方法

发表于 2017-03-15 23:23:26 回复(0)
A:
根据
可知父类的方法是protected 或者public 才能被子类访问
什么时候使用final?答:方法体积很小并且我们不希望它被覆盖才将它声明为final。
综上,子类的run()与父类的run()无关
发表于 2015-04-13 23:43:28 回复(1)
  • 子类不能重写父类的final方法
    final
  • 对于private修饰的私有方法,子类中可以定义和父类一样的私有方法,此时该方法不是重载也不是重写,是子类新增的一个方法,可以当做子类的普通方法看待。
    private
发表于 2022-04-19 21:29:41 回复(0)

funal方法不可被继承,否则报编译错误

private方法不可见,不存在继承和重写关系

编辑于 2021-07-19 08:55:59 回复(0)
父类的方法使用private修饰的,所以子类中的同名方法并不是覆盖,两个方法没有关系,所以new  Car(). run()调用的是子类本身的run方法所以答案是A
发表于 2022-07-03 00:24:53 回复(0)
子类继承父类,只能继承父类的public和protected属性和方法。
发表于 2022-06-09 11:47:37 回复(0)
private方法对外不可见的不可以重写
发表于 2021-10-21 09:51:13 回复(0)