jvm的类初始化

jvm的类初始化

子父类继承、

class A {
    int i=1;
    public void printI() {
        System.out.println("i="+i);
    }
}

class B  extends A{
    int i=2;
    public static void main(String[] args) {
        B b=new B();
        b.printI();
    }
}

得到的结果肯定是i=1,因为B是子类,A是父类,B的printI()方法是继承A的,所以B是使用的是A的printI方法,自然打印的是A的成员属性i,因为B继承的方法中是默认使用super指针的

如果你想打印自己的成员变量,即使用子类的成员变量,可以进行重写

class A {
    int i=1;
    public void printI() {
        System.out.println("i="+i);
    }
}

class B  extends A{
    int i=2;

    @Override
    public void printI(){
        System.out.println("i="+i);
    }

    public static void main(String[] args) {
        B b=new B();
        b.printI();
    }
}
public class Test {
    public static void main(String[] args) {
        A a = new B();
        a.printA();
    }

}
class A {
    int a = 5;
    public A() {
        System.out.println("A类初始化");
        printA();
    }

    public void printA() {
        System.out.println(a);
    }
}
class B extends A {
    int a = 15;
    public B(){
        System.out.println("B类初始化");
        printA();
    }

    @Override
    public void printA(){
        System.out.println("打印a属性的值");
        System.out.println(a);
    }
}

首先要了解子父类初始化顺序:

static 父类——>static子类——>父类成员变量初始化——>父类构造代码块——>父类构造方法——>子类成员变量初始化——>子类构造代码——>子类构造方法

和半初始化对象,可以简单认为一个类在加载的时候,成员基本类型变量和引用都会先初始化,像int name = 1,会先把int name建出来,然后给默认值0,然后再进行赋值1

然后就是多态

分析:

在这里插入图片描述

运行结果:

在这里插入图片描述

分析:

首先,是多态,B重写了A的printI()方法,然后就是B自己也定义了a变量,会覆盖了继承过来的a变量,因为创建B的时候,会先将B的所有父类都先创建出来,然后因为重写,这时父类A初始化时使用的printI()方法是使用B的,自然也就使用B自己的a变量,这个时候子类B的a变量还没有初始化完成,只会是0,然后等B初始化完成了自然打印的就是15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值