Java基础题3:继承

2023-12-21 17:34:57

1. 以下代码运行输出的是

public class Person {
    private String name = "Person";
    int age = 0;
}

public class Child extends Person {
    public String grade;
    public static void main(String[] args) {
        Person p = new Child();
        System.out.println(p.name);
    }
}

A. 输出:Person
B. 没有输出
C. 编译出错
D. 运行出错

【答案】
C

【解析】
name是私有成员变量,只能在包内使用。

2. 以下代码运行输出的是

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

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

A. Base
B. BaseBase
C. 编译失败
D. 代码运行但没有输出

【答案】
B
【解析】
Alpha子类中,其实有一个默认提供的构造方法。

Alpha() {
	super();
}

所以,代码1,当new Alpha(); 时会调用子类默认的构造方法,因为子类的构造方法是继承自父类的,所以最终会调用父类的构造方法,输出Base。
new Base(); 调用自己的构造方法,输出Base。

3. 以下代码运行输出的是

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

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

A. BD
B. DB
C. C
D. 编译错误

【答案】
D
【解析】
父类和子类都是带参数的构造方法,但是子类的构造方法的时候,没有帮助父类进行构造,所以编译错误,要想实现此代码,需要在子类构造方法的第一行加 super(s);

4. 以下代码运行输出的是

class X {
    Y y = new Y(); //1
    public X() { //2
        System.out.println("X");
    }
}

class Y {
    public Y() { //3
        System.out.println("Y");
    }
}

class Z extends X {
    Y y = new Y(); //4
    public Z() { //5
        System.out.println("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}

A. ZYXX
B. ZYXY
C. YXYZ
D. XYZX

【答案】
C
【解析】
我们在继承板块中的知识点,可知,代码运行的顺序一定是先静态、再实例、再构造的方法。
静态的有:静态代码块,静态成员变量;实例的(也可以说非静态的)有非静态代码块、非静态成员变量。
并且在继承关系中,执行顺序是先静态,再父类,再子类。就是:父类的静态、子类的静态、父类的实例、父类的构造方法、子类的实例、子类的构造方法。
此题中,当Z继承于X,因为此题代码没有静态方法,所以①先执行父类的实例、父类的构造方法。
父类中:

class X {
    Y y = new Y(); //1
    public X() { //2
        System.out.println("X");
    }
}

代码1,new Y(); Y中提供了不带参数的构造方法,先输出Y,再去执行父类自己的构造方法,输出X。
②再执行子类的实例、子类的构造方法。同样的,子类先后输出YZ。
故,执行结果为:YXYZ

注意:子类中的构造方法,可以理解为,其构造方法的第一行默认有一个super();

6. 以下关于 super 描述正确的是

A. super关键字只代表当前对象内部的那一块父类型特征,不包含再子类对象中。
B. super关键字不仅可以指代子类的直接父类,还可以直接指代父类的父类。
C. 子类通过super关键字只能调用父类的方法,而不能调用父类的属性。
D. 子类通过super关键字只能调用父类的属性,而不能调用父类的方法。

【解析】
super关键字只能指代直接父类,不能指代父类的父类,所以B错。
子类通过super关键字可以调用父类的方法即父类的属性。故CD错。
A正确是因为,super其实只是一个关键字,但是我们在理解的时候可以认为它是父类对象的引用,以用来提高代码的可读性,所以当我们看到super时就知道它是来调用父类的。

文章来源:https://blog.csdn.net/T2283380276/article/details/135132199
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。