以下类型的实例化有什么区别吗? 我是直接在定义变量的位置设置值,还是在类构造函数中设置。
如果没有,最佳做法是什么?
“在课堂上”:
class A {
boolean b = true;
public A(){
}
}
“在构造函数中”:
class B {
boolean b;
public B(){
b = true;
}
}
变量类型仅用于示例。 我看到的唯一区别是,当属性是复杂类型(类)时,构造函数依赖于赋予包含类的构造函数的值:
class A {
B b;
public A(String s){
b = new B(s);
}
}
答案 0 :(得分:4)
实际上它们都是等价的。但是,从可读性的角度来看,第一个更具可读性。此外,当有人从IDE导航到变量声明时很容易看到默认值(例如 ctrl +在Eclipse中单击鼠标)。
查看the official tutorial要说的内容 -
当初始化值可用时,这很有效 初始化可以放在一行上。但是,这种形式 由于其简单性,初始化具有局限性。如果 初始化需要一些逻辑(例如,错误处理或 for循环填充复杂数组),简单的赋值是不合适的。 实例变量可以在构造函数中初始化,其中包含错误 可以使用处理或其他逻辑。提供相同的功能 对于类变量,Java编程语言包括static 初始化块。
因此,当过程很简单时,您可以轻松使用简单的单线初始化技术。对于复杂的初始化选择,构造函数是可行的方法。
答案 1 :(得分:2)
如果将值分配给类中的变量,则在创建类的实例时,将直接将所需的值分配给变量。
如果在构造函数中指定值,则首先为变量分配一个默认值,然后分配构造函数中的值。
继续阅读initialization blocks, constructors and their order of execution
如果是最佳做法,
答案 2 :(得分:1)
使用初始化块。 Initializing Fields
public class X {
// The following is the initializer block
{
}
public X() {
}
}
答案 3 :(得分:0)
如果您没有指定一个变量,则会为实例变量分配默认值! Bu默认布尔实例变量的值为false。
public class HelloWorld {
boolean b;
public void printData() {
System.out.println("Defualt boolean value is " + b);
}
public static void main(String args[]) {
HelloWorld hw = new HelloWorld();
hw.printData();
}
}
,输出为Defualt boolean value is false
。
你在哪里分配你的变量纯粹是一种设计选择。
答案 4 :(得分:0)
我推荐C:
class C {
private boolean b = true;
}
- > no(显式)构造函数 - >更少的代码 - >更容易阅读
答案 5 :(得分:0)
答案 6 :(得分:0)
编译器将实例字段初始化复制到构造函数的开头,因此前两种方法生成完全相同的代码(或非常接近)。
(但请注意,对于静态字段初始化与static
初始化方法相比,上述情况并不完全正确。)
这主要是一个问题,它似乎更清晰,不太可能导致混乱/错误。这取决于许多因素,包括个人风格。