【问题标题】:java access variable from another class [closed]来自另一个类的java访问变量[关闭]
【发布时间】:2015-06-25 19:06:40
【问题描述】:

我在从另一个类访问字符串时遇到问题,我不知道我可以让它变得更简单。例如,我有一个名为“Person”的类,我有一个字符串名称。我通过构造函数和直接设置名称的“名称”。我还有另一个名为 Loan 的课程,我还没有尝试访问任何内容。我的最后一堂课叫做“App”,这就是一切完成的地方。

顺便说一句 - Person 是我的超类,Loan 扩展了 Person,App 扩展了 Loan,它们都在同一个包中。

现在在我的 App 类中,我尝试访问我创建的唯一人员对象的字符串“名称”。我再次通过构造函数直接分配了名称,但不知何故这不起作用。最初我的名字集是受保护的,因为我是怎么理解的: protected = 访问同一类、同一包或子类中的方法/变量 即使在我公开我的字符串之后,它仍然无法正常工作。我完全迷路了......

当我输入时

  System.out.println(omid.name);

它说它无法解析为变量,我需要制作一个本地变量。

谢谢!

这是我的 Person 代码:

package Programs;

public class Person {
    public String name;
    protected int age;
    protected int id;
    protected String status;
    protected int alienNumber;
    protected int socialSecurityNumber;

    Person()
    {

    }

    Person(String name, int age, int id)
    {
        this.name = name;
        this.age = age;
        this.id = id;
    }



    public void setid(int id)
    {
        if(id >= 100000)
        {
            this.socialSecurityNumber = id;
            System.out.println("You are now a citizen " + name);
            System.out.println("Social Security Number: " + socialSecurityNumber);
        }
        else
        {
            System.out.println("Sorry " + name + " you do not meet the qualitifactions for citizenship");
            alienNumber = id;
            System.out.println("You alien number is: " + alienNumber);

        }
    }



    public String toString()
    {
        if(id >=99000 )
        {
            status = "citizen";
        }
        else
        {
            status = "immigrant";
        }

        return "Name: " + name + 
                "Age: " + age + 
                "Id: " + id +
                "Status " + status;
        }
public static void main(String[] args)
{
    Person omid = new Person("omid nassir", 28, 120000);
    omid.name = "omid";
}




}

贷款代码

package Programs;

import Programs.Person;


public class Loan extends Person{


    public static final int LOANAMOUNT1 = 250000;
    public static final int LOANAMOUNT2 = 500000;
    public static final int LOANAMOUNT3 = 750000;
    public static final int LOANAMOUNT4 = 1000000;
    public int income;
    public int loanRequested;


    Loan(int income, int socialSecurityNumber, int loanRequested)
    {
        this.income = income;
        this.socialSecurityNumber = socialSecurityNumber;
        this.loanRequested = loanRequested;
    }


    public void applyForLoan(String name, int socialSecurityNumber, int income, int loanAmount)
    {
     int obtainable = LOANAMOUNT1 / 4;
        if(socialSecurityNumber >= 99999)
        {
            if(income > obtainable)
            {
                obtainable = loanAmount;
                System.out.println("Congradulations " + name + " you are eligible for loan amount of " + loanAmount);
            }
        }
        else if(socialSecurityNumber <=99999)
        {
            obtainable = LOANAMOUNT1;
            System.out.println("Sorry " + name + " in order to qualify for " + loanAmount + " you need to be"
                    + " a citizen and have a minimum income of " + obtainable);
            System.out.println("Loan amount granted: " + LOANAMOUNT1);
        }
    }


}

应用代码

package Programs;

public class App extends Person {

        public static void main(String[] args)
    {
        System.out.println(omid.name);
    }


}

【问题讨论】:

  • 您有 2 个 main(String[] args) 方法(在 App 和 Person 中)。我不确定你要做什么,但你只需要 1
  • "App" 正在扩展 "Person",因此应该继承字符串 "name"。因此,您可以像访问局部变量一样访问它。 System.out.println(name); 除非“omid”是另一个“人”。但在您的情况下,您只有 1 个人员对象,因此它应该只使用 name 而不是 omid.name
  • 当 App 类扩展一个 Person 时,并不意味着在 App.main() 中你将拥有你在 Person.main() 中创建的东西
  • @AlexNevidomsky - 好的,这就是我的主要问题,谢谢。但只有一个问题。如果我要扩展一个类,我要继承什么?谢谢。
  • 非常粗略地说,您会得到非私有的方法和字段。但这是一个很长的话题,有很多细节,你最好分开研究。这里的诀窍是,在新类中创建具有相同名称的事物时,您会“丢失”该继承。然后你必须明确地调用“旧版本”。

标签: java inheritance package subclass extends


【解决方案1】:

您需要在Appmain 方法中定义omid。你在Personmain 中定义了omid,但是这个变量不能被访问,因为这是一个完全不同的范围。您可能需要阅读 static 及其语义。

【讨论】:

  • 我知道静态的作用,我正在尝试创建一个练习程序,我可以创建多个人并根据他们的状态是否有资格获得贷款。因此,如果我将字符串名称设为静态,它会因每个实例而改变。我还是 Java 新手,所以我可能错了。但我会再次阅读静态。谢谢。
  • 使其成为静态意味着它由该类(类型)的所有对象共享。更改它的值意味着它将针对该类的所有实例进行更改。
  • 没错,我不希望它被所有实例共享。我想制作十几个不同的 Person 类型的对象,它们都有自己的名字、收入等......
  • 那么你在错误的地方定义了你的 person 对象。在“Person”类的“main”方法中定义它意味着将为您正在制作的每个 Person 对象调用 main 方法。因此,每次您创建一个新的 Person 对象时,您都会一次又一次地制作“omid”。您想在 Person 类本身之外定义 Person 对象。例如在“App”类中。就像我说的,如果你想打印 Person 本身的名字,你可以使用name在类本身,因为它是一个局部变量。
  • @rissandimo 如果您在App 中看不到您的main 方法有什么问题,那么您肯定需要阅读变量的静态和可见性/生命周期。
【解决方案2】:

您有多个static void main() 方法。仅运行App 中的一个。我看到App extends Person;我不认为那是你想要的。静态方法不能被覆盖;它不会自动调用 Person 中的 main 方法。在您的程序中执行的唯一语句是

System.out.println(omid.name);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2011-07-20
    • 1970-01-01
    • 2013-10-25
    • 2023-04-10
    相关资源
    最近更新 更多