簡體   English   中英

無法將對象變量傳遞給java中另一個類的構造函數

[英]can't pass object variables to the constructor of another class in java

我正在從核心 Java 第 1 卷中學習 Java 並且對 java.sorry 很新,因為標題令人困惑,但我不知道發生了什么。 我編寫了一個程序,它可以在屏幕上打印一個人的信息。 所以我創建了一個 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 ?

private Add add = new Add((name + "'s Shellter;"),(name + "'s hous's front road;"),(name + " colony;"),id+422);

該行位於構造函數之外,因此在創建對象時(甚至在構造函數之前)都會被調用。 您必須像其他變量一樣將其添加到私有變量中,並在構造函數的末尾對其進行初始化。

調用此行時,該人的名字尚未初始化,因此為空。 這就是造成問題的原因。

因為您要在構造函數執行之前Man類中創建private add類級別的成員。 該類完全存在后,將執行類級別的實例化。 然后構造函數運行。 因此, 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);
}

仔細觀察您的代碼。 緊隨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仍包含這些null。

也許您認為這就像指針一樣工作-當您更改name時,add中的name也會更改-不會。

您可能想要做的是聲明add但在構造函數中實例化它,就像對其余變量所做的一樣。 另外,請考慮在此處使用繼承 ,這似乎更適合您的代碼。 另外,我將重命名“ AddCitizen或其他名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM