当你初始化的东西。让我们说一个小摆动程序。它会像这样吗
variables here
{
private Jlist contactList;
String [] contactArray;
ArrayList <String> contactArrayList;
ResultSet namesList
// constructor here
public whatever()
{
GridLayout aGrid = new GridLayout(2,2,10,10);
contact1 = new String();
contact2 = new String();
contact3 = new String();
contactArrayList = new ArrayList<String>();
// is something supposed too go in the () of this JList?
contactList = new JList();
contactArray = new String[5];
from1 =new JLabel ("From: " + contactArray[1]);
gridlayout.add(components)// theres too many components to write onto SO.
}
// methods here
public void fillContactsGui()
{
createConnection();
ArrayList<String> contactsArrayList = new ArrayList<String>();
while (namesList.next())
{
contactArrayList.add(namesList.getString(1));
ContactArray[1] = namesList[1];
}
}
我知道这可能是一个很大的初学者问题,但这也是我已经习惯使用的代码。我初始化三次和四次没有意义因为我不知道他们在哪里gp。任何人都可以对此有所了解吗?
P.S。抱歉凌乱的示例代码。我尽了最大努力。
然后在这里更清楚一点。
代码的总体布局就是我所要求的。
我的代码格式如下。
变量; 构造函数; 方法;
我说的应该是这样的
public class test
{
int i;
public test()
{
i = 0;
}
public void addi()
{
i = i +1;
}
}
而不喜欢这个
public class test
{
int i = 0;
public test()
{
int i = 0;
}
public void addi()
{
int i = i +1;
}
}
我试图找出初始化变量的正确方法。因为我每次使用它们时都会定义它们
答案 0 :(得分:2)
由于各种原因,变量可以在不同的位置初始化。例如,在示例代码中,始终将联系人列表初始化为新的JList。这可以在“变量here”部分中以private JList contactList = new JList()
完成。
您的contactArrayList看起来通常基于传递给构造函数的参数,因此应该在构造函数中将项添加到它中。如果您采用这种方法,则应将contactArrayList声明为final。这会强制所有构造函数初始化列表。 (如果您不想将其声明为final,则需要在声明时以与处理contactList相同的方式初始化它。)
有时,在构造类的实例之前,不能(或不应该)初始化字段。在这些情况下,您必须非常小心地访问和使用该字段,以确保它不会在未初始化状态下使用。
答案 1 :(得分:1)
没有初始化事物的唯一问题是你让自己对空指针异常开放。理想情况下,您应该在构造函数中初始化所需的所有内容,这样您就可以确保每个其他方法都可以使用。另一种方法是在调用方法之前检查事物是否为空(例如if (list != null && list.size() > 0)
)
答案 2 :(得分:1)
一般情况下,只要知道初始值,就应该尽快初始化变量。而不是
ArrayList<String> contactArrayList;
考虑这个
static final int INITIAL_LIST_SIZE = 100;
List<String> contactArrayList = new ArrayList<String>(INITIAL_LIST_SIZE);
以下是类变量,实例变量或数组组件的default values列表。
附录:重复默认初始化通常不赞成。在后面的示例中,默认初始化将 i 设置为零。
错误:请注意关于int i = 0
构造函数中test
的更正评论,隐藏字段 i 。
public class test {
int i = 0; // superfluous, "int i;" is enough
public test() {
int i = 0; // hides field i
}
public void addi() {
int i = i + 1; // hides field i; won't increment field i
}
}
答案 3 :(得分:1)
本教程在Object Initialization in Java上回答了您的许多问题。
您将学习实例变量根据其类型初始化为默认值,何时使用静态初始化器,何时使用构造函数,初始化与继承等等。
以下是其他一些有价值的资源:
答案 4 :(得分:0)
你的最后一个例子 - 带有“public test(){int i = 0;}”的例子可能不会按预期工作。通过在test和addi中重新声明变量“int”,您现在有三个名为“i”的变量:顶部定义的成员变量,test中的局部变量和addi中的另一个局部变量。任何一个函数都不会更改成员值。
我肯定会避免使用虚拟值初始化变量,例如“contact1 = new String()”。是的,这可以防止您为未初始化的变量收到编译错误,或者可能抛出空指针异常。但是如果你在没有这个的情况下得到一个错误,那么那必然意味着你没有把真正的值放到变量中。设置虚拟值并不能解决问题,它只是隐藏它。这就像把磁带放在仪表板上的警告灯上:是的,你不再看到警告了,但那并不是因为问题得到解决,只是因为你把它覆盖了。
在某些情况下,设置默认值是有意义的,然后您可能会将其替换为其他值,也许您不会。我不是说这是一个不好的做法。我是说如果你为单位变量得到错误,不要盲目地将它们初始化为无意义的东西。弄清楚为什么他们没有价值并解决真正的问题。
除此之外,我不确定该怎么说你的例子。我不确定你要完成什么。您有一个名为contact1,contact2和contact3的变量,似乎从未使用过。 contactArray显然应该由fillContactsGui填充,但是我看不到它被调用的位置。我不确定这些是你的逻辑中的缺陷还是这只是一个不完整的例子。
关于初始化和使用数据的一般正确方法:
如果变量可以是本地变量,请将其设置为本地变量。在这种情况下,理想情况下在声明它时初始化它。像:
public void foobar()
{
... do some stuff ...
int i=0;
... do other stuff ...
i=i+j;
... etc ...
}
我会避免定义它,然后在可能的情况下稍后进行初始化,因为这会导致您无法初始化它。当然,如果它可以以两种不同的方式初始化,则难以避免。像:
public void foobar()
{
int i;
if (plugh>0)
i=plugh;
... bunch more logic ...
// Inside some IF so we won't even get here if i was set earlier
if (zork==true)
i=shambar;
... etc ...
}
尽管如此,你可以将它们保持在一起越多越好。