继承,静态代码程序面试题总结

本文总结了面试中遇到的关于Java继承和静态代码块的问题。首先展示了类A、类B和类C的继承关系,以及测试代码的执行结果。接着详细分析了类加载器的步骤,包括装载、校验、准备、解析和初始化,并指出初始化阶段静态代码块的执行顺序。此外,还解释了方法的覆盖规则,当子类C重写父类B的out()方法时,如何影响方法调用。最后,讨论了实例变量访问的规则,根据实例的类型决定访问哪个类的成员变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近面试遇到几道有关考继承和静态代码这两个知识点的题目,开始非常晕,现在好好总结一下,理清楚顺序。先贴代码。
①类A

class A {
    int i = 5;
    int j = 5;
    {
        System.out.println("A1");
    }
    static{
        System.out.println("A.static");
    }

    A(){
        System.out.println("A的constructor");
    }
    void out(){
        System.out.println(i+"----"+j);
    }
}

②类B继承类A

class B extends A{

    int i = 4;
    int j = 4;
    {
        System.out.println("B1");
    }
    static{
        System.out.println("B.static");
    }
    B(){
        System.out.println("B的constructor");
    }

    void out(){
        System.out.println(i+"@@@@"+j);
    }
}

③类C继承类B

class C extends B {
    int i = 3;
    int j = 3;
    {
        System.out.println("C1");
    }
    static {
        System.out.println("C.static");
    }

    C() {
        System.out.println("C的constructor");
    }

    void out() {
        System.out.println(i + "####" + j);
    }

}

④测试代码

public class Test {

    public static void main(String[] args) {

        A p = new C();
        p.out();
        System.out.println(p.i+"****"+p.j);
    }
}

先贴执行结果:

A.static
B.static
C.static
A1
A的constructor
B1
Bconstructor
C1
Cconstructor
3####3
5****5

分析:
(1)类加载器把类装入虚拟机的步骤:装载,链接(校验,准备,解析),初始化,具体如下:
装载:查找导入类或接口的二进制数据;
校验:检查类或接口二进制数据的正确性;
准备:给类的静态变量分配初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化java代码块和静态java代码块。
(初始化类中属性是静态代码快的常用用途,但只能用一次!)
类初始化时,先执行父类的静态代码,再执行子类的静态代码,接着是父类如有非静态代码就执行非静态代码,然后执行父类的构造方法,再看子类如果有非静态代码就执行非静态代码,最后执行子类的构造方法。其他方法最后执行。

(2)因为C是继承B,并且重写了父类B的out()方法,所以p调用的是C的out()方法,如果没有重写,则调的是B的out()方法,因为p是A的实例,同理,因为p是A的实例,所以类Test里面的System.out.println(p.i+”**“+p.j);中i,j的值是类A里i,j的值,如果p换成是类B的实例,则是类B里i,j的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值