- 今天写一道在笔试过程中遇到的一道题,题目:
public class A {
protected int a = 1;
public A() {
a = 2;
}
public static void main(String[] args) {
new C();
}
}
class B extends A {
protected int b = 2;
public B() {
b = 3;
}
}
class C extends B {
private int c = 2;
public C() {
super();
c = 10;
print();
}
public void print() {
System.out.println("" + a + b + c);
}
}
执行结果
这道题涉及到以及相关的知识点有:
1、有关继承方面的知识
2、修饰符作用域的问题
3、成员变量和构造器的执行顺序
思路
1、主方法中,new C(),此时去执行C中的代码
2、super关键字,调用父类的构造方法,虽然B中没有super,但是也会默认调用B的父类A的构造方法。
3、每个构造器中的赋值都会覆盖本类中的成员变量的值,
测试代码
public class A {
protected int a = 1;
public A() {
System.out.println("构造器A:" + a);
a = 2;
System.out.println("构造器A:" + a);
}
public static void main(String[] args) {
new C();
}
}
class B extends A {
protected int b = 2;
public B() {
System.out.println("构造器B:" + b);
b = 3;
System.out.println("构造器B:" + b);
}
}
class C extends B {
private int c = 2;
public C() {
super();
System.out.println("构造器C:" + c);
c = 10;
System.out.println("构造器C:" + c);
print();
}
public void print() {
System.out.println("" + a + b + c);
}
}
测试结果如下:
知识点一:关于继承
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
- Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力
- 关于构造器调用
子类是不继承父类的构造器的,它只是调用(隐式或显式)。
①如果父类的构造器带有参数,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表
②如果父类构造器没有参数,则在子类的构造器中不需要使用super关键字调用父类构造器,系统会默认自动调用父类的无参构造器
知识点二:成员变量赋值
一种方式为在构造器中初始化赋值,那么实验了三种结果:
1、在一个类中,定义一个成员变量i,构造器中不初始化该数,在主方法中输出,值为0;(成员变量会默认赋值)
2、在一个类中,定义一个成员变量i为2;构造器中不初始化该数,在主方法中输出i,值为2;
3、在一个类中,定义一个成员变量i为2;构造器中初始化该数为x,在主方法中输出i,值为x;
知识点三:修饰符作用域
因为在其中看到protected,所以特意再次记忆一下: