成员变量的声明时初始化和构造方法中初始化的区别

soko1 2012-03-14 10:51:55
成员变量的声明时初始化和构造方法中初始化的区别是什么? 什么情况下用什么方式?
...全文
1185 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2012-03-14
  • 打赏
  • 举报
回复
初始化块优先于构造方法被执行,如果初始化块执行中,构造方法被调用之前没有什么特殊的处理,只是单纯的成员变量赋值,那么效果是一样的

如
public class A {
int a; //方法1 先定义
//int a = 5; //方法2 定义时直接赋值
{System.out.println(a);} //如果有这样的处理

public A() {
a = 5; //方法1 然后在构造方法赋值
}
public static void main(String[] args) {
new A();
}
}
安特矮油 2012-03-14
  • 打赏
  • 举报
回复
没有什么太大的区别,书写方式不同而已而已。
五哥 2012-03-14
  • 打赏
  • 举报
回复
应该没有太大区别 ,都是需要创建实例,才能初始化
看那边 2012-03-14
  • 打赏
  • 举报
回复
在构造函数中初始化。具有前瞻性。很好的考虑了项目未来的优化,维护。
例如:
这个类里面有一个属性String name ;代表了公司的名称。
如果你直接初始化 String name = "XXX公司";
那么如果以后公司换了名称,但是开发者离公司很远。
那么你势必要跑很远去那个公司重新安装。
而且你也要重新修改代码,重新编译。

如果是用构造函数初始化,这个公司的名称保存在一个文本文档里面。
那么你只需要让那个公司在对应的文本文档里面把名字修改了即可。

这个只是一个最简单的例子而已。还有很多原因。总的说呢。你代码写少了。做多了,你自然就知道什么时候该用什么时候不该用了。
ArayChou 2012-03-14
  • 打赏
  • 举报
回复
基本上没有什么区别
soko1 2012-03-14
  • 打赏
  • 举报
回复
成员变量的声明时初始化和构造方法中初始化的区别是什么? 什么情况下用什么方式?

比如

public class UserServiceImpl implements UserService
{
private UserDao userDao;

public UserServiceImpl()
{
this.userDao = new UserDao();
}


为什么不直接写 private UserDao userDao = new UserDao() 取代构造函数?

又比如

public class TestServlet extends HttpServlet
{
private UserService userService;

public TestServlet()
{
this.userService = new UserServiceImpl();
}

}


为什么不直接写 private UserService userService = new UserService() 取代构造函数?
都先生 2012-03-14
  • 打赏
  • 举报
回复
我觉得三楼的说法很有道理。
代码的稳定性非常重要。我们在设计的时候就必要考虑的代码后期维护的成本。
bluetata 2012-03-14
  • 打赏
  • 举报
回复
一定要注意,成员变量按照其声明的顺序会被初始化,
并且立刻被初始化为二进制的0,这个动作发生在所有事件之前,
也就是编译器会立刻将分配给对象的空间初始化。

最后就是调用类的构造方法了。


执行顺序:
执行父类静态代码 执行子类静态代码
初始化父类成员变量(我们常说的赋值语句)
初始化父类构造函数
初始化子类成员变量
初始化子类构造函数
Quester-King 2012-03-14
  • 打赏
  • 举报
回复



声明时为成员变量赋值,那么你一创建对象,这个赋值就进行,而且先于构造器执行。
而且你每次创建这个类的对象,都是同一个值,比如你声明的时候写private int age = 18;,那么你每一个对象的age的值都是被初始成18.但是如果你把赋值语句写在构造器,比如:
constructor(int a){
age = a;
}


那么你每次创建对象都可以单独为每一个对象赋值不同的age。比如你创建10个学生对象,他们的年龄不一定都是18啊,所以最好不要用声明时就赋值,最好写进构造器,为每一个对象赋不同的年龄。
数据集可视化效果见下方。 【数据集概况】 · 检测类别(中文):[公交车(bus), 车辆(vehicle)] · 训练集:1899 张 · 验证集:0 张 · 测试集:0 张 · 总计:1899 张 该数据集聚焦于城市道路环境下的车辆检测任务,旨在为智能交通系统提供高质量的标注数据支持。通过采集真实道路场景中的各类车辆图像,该数据集能够有效支撑车辆识别与分类模型的训练与优化,具有较高的实用价值和研究意义。数据集覆盖了多种车辆类型,包括公交车和普通车辆,为复杂交通环境下的目标检测提供了丰富的样本。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 96 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9950** mAP50-95 | 0.9884 Precision | 0.9513 Recall | 0.9659 train/box_loss | 0.0783 train/cls_loss | 0.0416 val/box_loss | 0.1259 val/cls_loss | 0.0771 【训练过程分析】 96 轮训练后 mAP50 达到 0.9950,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。mAP50-95 为 0.9884,和 mAP50 差距仅 0.01,框的定位精度也很扎实。 【模型性能评估】 Precision 0.9513、Recall 0.9659,精召双高,模型对公交车、车辆的检测能力强。多类检测中,不同类别性能可能有差异,需关注难例类别的表现。 【预测效果展示...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧