我正在从核心java卷1书中学习java,而java.sorry对于混淆标题很新,但我不知道发生了什么。我编写了一个程序,可以在屏幕上打印有关某人的信息。所以我创建了一个Man类对象数组: -
这是我的Man类: -
package com.smit.man;
public class Man
{
private int age;
private long id;
private String name;
private double weight;
public Man(int aage,String aname,double aweight,long aid)
{
age =aage;
name = aname;
weight = aweight;
id = aid;
}
private Add add = new Add((name + "'s Shellter;"),(name + "'s hous's front road;"),(name + " colony;"),id+422);
public int getAge()
{
return age;
}
public long getId()
{
return id;
}
public String getName()
{
return name;
}
/**
* @return the weight
*/
public double getWeight()
{
return weight;
}
public void pall()
{
System.out.println
(
"Name = " +this.getName() +
" Age = "+this.getAge() +
" ID = " +this.getId() +
" Weight = "+this.getWeight()
);
add.pall();
System.out.println("\n\n\n");
}
}
这个Man类使用Add类,它是: -
package com.smit.man;
/**
* @author smit
*
*/
public class Add
{
private String shellterN,Rd,colony;
private long pin;
Add(String a,String b,String c,long d)
{
this.shellterN = a;
this.Rd = b;
this.colony =c;
this.pin = d;
}
public String getShellterN()
{
return shellterN;
}
public String getRd()
{
return Rd;
}
public String getColony()
{
return colony;
}
public long getPin()
{
return pin;
}
public void pall()
{
System.out.println("ShellterName = " + this.getShellterN() +
" Road = "+this.getRd()+
" Colony= "+ this.getColony()+
" PIN = " + this.getPin());
}
}
这是主要的方法类: -
package com.smit.main;
import com.smit.man.*;
public class Mtest
{
public static void main(String[] args)
{
Man man [] = new Man[3];
man[0]= new Man(17,"Smit",55,34);
man[1] = new Man(100,"Master",60,400);
man[2] = new Man(200,"Guru",10,39);
for(Man a:man)
a.pall();
}
}
每当我在eclipse中运行它时,我得到以下输出
Name = Smit Age = 17 ID = 34 Weight = 55.0
ShellterName = null's Shellter; Road = null's hous's front road; Colony= null colony; PIN = 422
Name = Master Age = 100 ID = 400 Weight = 60.0
ShellterName = null's Shellter; Road = null's hous's front road; Colony= null colony; PIN = 422
Name = Guru Age = 200 ID = 39 Weight = 10.0
ShellterName = null's Shellter; Road = null's hous's front road; Colony= null colony; PIN = 422
我不想要这个空?为什么我得到这个null?
答案 0 :(得分:0)
private Add add = new Add((name + "'s Shellter;"),(name + "'s hous's front road;"),(name + " colony;"),id+422);
这一行在构造函数之外,因此在创建对象时(甚至在构造函数之前)调用它。 您必须像所有其他变量一样添加到私有变量,并在构造函数的末尾初始化它。
当调用此行时,该名称的名称尚未初始化,因此它为空。这就是产生问题的原因。
答案 1 :(得分:0)
因为您在构建器执行之前在private add
类中创建了Man
类级别成员。只要该类存在,就会执行类级实例化。然后构造函数运行。所以name
成员当时有默认值。
name
值存在后,在构造函数中实例化值:
private Add;
public Man(int aage,String aname,double aweight,long aid)
{
age =aage;
name = aname;
weight = aweight;
id = aid;
add = new Add((name + "'s Shellter;"),(name + "'s hous's front road;"),(name + " colony;"),id+422);
}
答案 2 :(得分:0)
仔细观察您的代码。在你public man
之后:
private Add add = new Add((name + "'s Shellter;"),(name + "'s hous's front road;"),(name + " colony;"),id+422);
这不包含在任何方法中,因此会为从此类实例化的所有对象初始化add
成员,其值为name
,age
等。这当然是null
,因为你没有实例化任何东西。下次使用add
时,请致电add.pall
,其中add
仍包含这些空值。
也许您认为这就像指针一样 - 当您更改name
时,添加中的name
也会发生变化 - 它不会发生变化。
你可能想要做的是声明add
但是在构造函数中实例化它,就像你对其余变量所做的那样。另外,请考虑在此处使用inheritance,这似乎更适合您的代码。另外,我会将Add
重命名为Citizen
或其他内容。