在Java中访问类的字段

时间:2018-03-25 17:58:04

标签: java oop

我是Java的新手。

我正在练习关于一个人吃一些水果的代码。我有3个班级

水果类:

public class Fruit {
    String fruitname = "grapes";
}

人员类:

public class Person {
    void eat(Fruit f) {
        System.out.println("person is eating " + f.fruitname); // how can I do f.fruitname
    }
}

测试类:

public class TestFruit {
    public static void main(String[] args) {
        Person p = new Person(); // person object
        Fruit f = new Fruit(); // fruit object
        p.eat(f);
    } // eat method of person class
}

输出:

person is eating grapes

为了访问类的字段,创建该类的Object。

我的问题是:

Person课程中,如何在不fruitname Fruit类的情况下访问f.fruitname类的Fruit字段(即编写Person) class?

fruitnameFruit类的数据成员,实例成员在创建对象之前不存在。

我刚开始学习Java,我被困在这里。请帮我理解。

4 个答案:

答案 0 :(得分:4)

您正在做的事情不起作用,因为您没有将成员字段声明为public

public String fruitname = "grapes";

只有这样你甚至可以编译它:

System.out.println("person is eating " + f.fruitname);

请注意,在Java字段中,默认情况下包privatesee also)。这意味着字段可以是private,但在这种情况下,您只能在位于同一个包中的类中访问此字段。

但是,通常会创建这样的getter和setter方法:

public class Fruit {

    private String fruitname = "grapes";

    public String getFruitname() {
        return fruitname;
    }

    public void setFruitname(String fruitname) {
        this.fruitname = fruitname;
    }
}

允许您像这样访问班级成员fruitname

public class Person {
    public void eat(Fruit f) {
        System.out.println("person is eating " + f.getFruitname());
    }
}

根据您的IDE,您可以右键单击该字段(或类中的某个位置)并找到类似Generate.. > Getters & Setters的内容,这样可以减少整个行为的烦恼。

答案 1 :(得分:1)

您的问题是,您没有正确封装 Fruit 类。

当前字段为package-private,因此只有类本身和同一个包中的其他类才能访问该字段。当开始使用并发时,你真的需要正确封装你的字段以保护它们。

我建议查看Annotation-Preprocessor Lombok,因为它稍后会通过生成方法来帮助你。您只需在类上方添加两个注释或在其中添加应该封装的字段。

您的Fruit类的封装和文档版本如下所示:

package me.yourname.yourproject;

import javax.annotation.Nullable;

public class Fruit {

  @Nullable
  private String name;

  /**
   * Constructs a fruit without a name.
   */
  public Fruit(){
  }

  /**
   * Constructs a fruit with an initial name.
   *
   * @param name The fruits initial name.
   */
  public Fruit(String name){
    this.name = name;
  }

  /**
   * Sets the name of the fruit.
   *
   * @param name The fruits new name.
   */
  public void setName(@Nullable String name){
    this.name = name;
  }

  /**
   * Gets the fruits current name.
   */
  @Nullable
  public String getName(){
    return this.name;
  }

}

答案 2 :(得分:0)

所以看起来你需要阅读Creating an object in Java。这不是一件坏事!当你是初学者时,OO设计很难。

要回答你的问题,你必须实例化fruitname对象,然后将其标记为public(或者最好写一个getter / setter)

public class Fruit {
    private string name;
    public Fruit(String name) {
        this.name=name;
    }
    public String getName() {
        return this.name;
    }
}

使用以下内容创建此对象:

Fruit f=new Fruit("peach");
System.out.println(f.getName());

答案 3 :(得分:0)

如果您想要的是在没有Fruit实例的情况下在Person中访问它:
 您的fruitname是一个实例变量。通过声明它静态'你使它成为一个类成员,然后你可以使用Fruit.fruitname
访问它 你可以把它变成公共的'允许从任何地方访问。如在

public static string fruitname = "grapes"; 

现在你不需要一个Fruit实例来访问fruitname 您的人员呼叫可能如下所示:

public class Person {
    void eat() {
        System.out.println("person is eating " + Fruit.fruitname); 
    }
}