不能将对象变量传递给java中另一个类的构造函数

时间:2017-10-08 10:13:40

标签: java class constructor null

我正在从核心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?

3 个答案:

答案 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成员,其值为nameage等。这当然是null,因为你没有实例化任何东西。下次使用add时,请致电add.pall,其中add仍包含这些空值。

也许您认为这就像指针一样 - 当您更改name时,添加中的name也会发生变化 - 它不会发生变化。

你可能想要做的是声明add但是在构造函数中实例化它,就像你对其余变量所做的那样。另外,请考虑在此处使用inheritance,这似乎更适合您的代码。另外,我会将Add重命名为Citizen或其他内容。