我的书说局部变量和实例变量之间的关键区别之一是我们必须初始化局部变量
如果你没有初始化它们,实例变量的默认值为0
。在此之前不久,我做了一个介绍构造函数的示例,以及public void
和public double
和。{
return
做。
考虑我刚才在书中所做的以下示例。这里的balance是一个实例variable
。我们下面有两个构造函数。如果实例变量的默认值为零,为什么我需要第一个构造函数
public Account(){
balance = 0;
}
说如果我打电话给Account acc = new Account();
balance = 0
。它不会自动变为零吗?至少这是我对我的书中的理解
继承我正在处理的完整代码
public class Account {
private double balance;
public Account(){
balance = 0;
}
public Account(double initialBalance){
balance = initialBalance;
}
public void deposit(double amount){
balance = balance+amount;
}
public void withdraw(double amount){
balance = balance-amount;
}
public double getBalance(){
return balance;
}
}
public class Test {
public static void main(String [] args){
Account acc = new Account(500);
acc.deposit(500);
System.out.println(acc.getBalance());
}
}
答案 0 :(得分:6)
你不需要第一个构造函数,因为你从来没有在任何地方调用它。
假设 在某个地方被调用,你不会在其中需要行balance = 0
,但有些人仍然会添加它,只是为了让它明确可见并清除它是故意的(有时是无意中自动使用的东西)。
如果您完全删除了构造函数并尝试仅使用Account
(没有任何参数)来实例化new Account()
,那么这不会起作用,因为您没有零-argument构造函数了(另一个神奇的事情:Java将为你生成一个当且仅当你没有任何其他构造函数时)。
答案 1 :(得分:0)
是的,它确实有0.0
作为默认值。
所有基本类型(int
,double
,...)都将初始化为0
,并且所有对其他类型的引用(以某种方式扩展Object
)都将被初始化到null
。
优良作法是(重新)将成员初始化为0(或任何其他对该类有意义的值),以表明您没有忘记该变量。当您稍后添加新成员时,如果其值未在构造函数中初始化,则可能是您忘记它的提示。
您还可以决定在声明期间将其初始化为任何值:
private double balance = 0.0;
并为所有其他成员做同样的事情。在这种情况下,当构造函数没有指定任何特定的值时,它们将接收该值。该模式可用于显示您将这些值设置为默认值的意图,以及由构造函数设置为"覆盖"。
的模式。答案 2 :(得分:0)
是的,所有原始类型(int
,double
,long
...)都会使用0
自动初始化。就像我之前的演讲者所说的那样,添加线条是一种很好的做法,可以让事情更清晰,更清洁。
但也要考虑复杂类型(String
,Integer
,Double
或您自己的类。它们将使用null
进行初始化。如果您尝试访问此默认值,则会获得NullPointerException
,因此现有的默认值会更好。
答案 3 :(得分:0)
构造函数用于初始化实例变量。默认值为0(在int的情况下初始化后)。但是,在您的代码中,您甚至没有调用默认构造函数。所以,在您的代码中,您可以删除默认构造函数。
此外,即使您调用默认构造函数,值也会自动初始化。您甚至不必在代码中提及balance=0
。只有这样就足够了:
public account(){}
但是,如果你没有调用任何构造函数并尝试通过引用变量访问实例变量,那么在局部变量的情况下你会得到同样的错误 -
该变量可能尚未初始化
您可以从https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
更好地学习