java 初始化属性_JAVA类属性初始化的有趣儿情况

本文探讨了一个关于Java中继承和初始化的微妙问题。作者在创建APP设置模块时遇到一个bug,即设置保存后在获取时总是返回初始值。经过调试,发现值在父类构造函数之后被重置。通过代码示例,展示了在子类初始化过程中,父类无法正确访问已赋值的子类属性,而子类的构造函数后属性又恢复为初始值。这个问题揭示了Java中初始化顺序的重要性,提醒开发者注意潜在的初始化陷阱。
摘要由CSDN通过智能技术生成

这是我之前遇到的一个问题,在这里分享给同僚;希望大家能避免这些错误;少走弯路。

问题

这个情况有些特殊,当时我在弄APP的设置模块;结果发现无论设置如何保存第二次获取值的时候都是初始值,跟踪了一下发现保存的时候的确是保存到文件了,那么这就奇葩了。想了一下问题肯定出在获取值的时候,跟踪了一下获取值的断点,发现获取的时候是之前保存的值,而在类的构造函数之后值却又成了初始值,这个是为啥?

百思不得其姐啊~~~

我喜欢直接一点,来看看代码是怎么回事儿。

代码

package net.qiujuer;

public abstract class People {

public People() {

initValue();

}

public abstract void initValue();

public void show() {

System.out.printf("Show:" + toString());

}

}

一个父类,在构造函数中调用初始化方法。

package net.qiujuer;

public class Man extends People {

private String mName = "聂小倩";

private int mAge = 18;

@Override

public void initValue() {

mName = "Qiujuer";

mAge = 23;

}

@Override

public String toString() {

return "Name:" + (mName == null ? "NULL" : mName) + " Age:" + mAge + "\n";

}

}

实现类,实现其具体的初始化方法,并在该方法中做一些属性操作。

package net.qiujuer;

public class MainClass {

public static void main(String[] args) {

Man man = new Man();

man.show();

}

}

测试类,在该类中直接 new 并调用方法。

结果是什么呢?

有谁能猜到?

其输出为:

Show:Name:聂小倩 Age:18

怎么样?有想到的么?为什么会这样呢?自己试试看看是不是。

变更

我们输出一些详细的地方。

首先更改父类的构造函数:

public People() {

System.out.printf("People-1:" + toString());

initValue();

System.out.printf("People-2:" + toString());

}

然后更改 Man 的构造函数:

public Man() {

super();

System.out.printf("Man:" + toString());

}

再来运行看看~~

想想一下结果是什么呢?

先想一下,然后再看估计有些用处。

算了,还是直接进入吧~

结果输出:

People-1:Name:NULL Age:0

People-2:Name:Qiujuer Age:23

Man:Name:聂小倩 Age:18

Show:Name:聂小倩 Age:18

想到了么?

结论

我想到了这些:

在类属性初始化的时候,其直接赋值的默认值将会在父类的构造函数之后进行。

在父类操作的时候,其子类的属性并不具备值:mName 属性为 NULL

在父类中可以通过方法对实现类的属性进行赋值操作,但是当其实现类中默认有对值进行赋值的话,那么将会自动进行二次赋值。

一个无心之举,或许会造成一个天大的BUG;且用且珍惜~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值