您好,欢迎来到图艺博知识网。
搜索
您的当前位置:首页【Java】继承练习题

【Java】继承练习题

来源:图艺博知识网

继承-练习题

01

A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明:

1. A a0=new A();

2. A a1=new B();

3. A a2=new C();

问以下哪个说法是正确的?()

A.只有第一行能通过编译

B.第1、2行能通过编译,但第3行编译出错

C.第1、2、3行能通过编译,但第2、3行运行时出错

D.第1行,第2行和第3行的声明都是正确的

答案

D

解析

本题描述的代码如下:

class A {

}
class B extends A {

}
class C extends B {

}
public class Test {

    public static void main(String[] args) {
        A a0=new A();//1

        A a1=new B();//2

        A a2=new C();//3
    }
}

主要疑问就是注释3处,此时A虽然不是C的直接父类,但是C依然间接继承了A的内容的,此时可以发生向上转型的。

所以选D


02

如下代码的 结果是什么 ?

class Base {
  Base() {
  	System.out.print("Base"); 
  }
}

public class Alpha extends Base {

  public static void main( String[] args ) {
    new Alpha();//1
    //调用父类无参的构造方法
    new Base();//2
  } 
}
答案

BaseBase

本题主要考察继承关系上的执行顺序。

当子类继承父类之后,在实例化子类对象的时候,先要调用父类的构造方法,来帮助父类初始化。上述代码相当于如下代码:

class Base {
  Base() {
  	System.out.print("Base"); 
  }
}

public class Alpha extends Base {
  Alpha() {   //<-----
     super(); //<-----看这里!
  }           //<-----
  public static void main( String[] args ) {
    new Alpha();//1
    //调用父类无参的构造方法
    new Base();//2
  } 
}

编译器会默认提供如上的子类的构造方法。

所以,注释1处输出的结果为Base,注释2处输出的结果为:Base

最终结果是BaseBase.


03

以下程序的输出结果为

class Base{
  public Base(String s){
    System.out.print("B");
  }
}

public class Derived extends Base{
  public Derived (String s) {
    System.out.print("D");
  }
  public static void main(String[] args){
    new Derived("C");
  }
}
答案

无法编译

当子类继承父类需要先初始化继承过来的父类的成员,此时需要通过super来完成。很明显在子类的构造方法当中,并没有通过super调用父类的构造方法。正确写法应该是:

class Base{
  public Base(String s){
    System.out.print("B");
  }
}

public class Derived extends Base{
  public Derived (String s) {
    super(s);
    System.out.print("D");
  }
  public static void main(String[] args){
    new Derived("C");
  }
}

04

以下程序执行的结果是:

class X{
	Y y=new Y();//1
	public X(){//2
		System.out.print("X");
	}
}
class Y{
	public Y(){//3
		System.out.print("Y");
	}
}
public class Z extends X{
	Y y=new Y();//4
	public Z(){//5
		System.out.print("Z");
	}
	public static void main(String[] args) {
		new Z();
	}
}
答案

YXYZ

类Z继承类X。

在继承层次上,先执行父类和子类的静态的,再执行父类的实例,父类的构造,最后执行子类的实例和子类的构造。

根据以上顺序,我们得出结论:本题中没有静态的。所以先执行1和2,再执行4和5。执行注释1和注释4的时候,分班打印Y。故最终的结果是YXYZ

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuoyibo.net 版权所有 湘ICP备2023021910号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务