我是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?
fruitname
是Fruit
类的数据成员,实例成员在创建对象之前不存在。
我刚开始学习Java,我被困在这里。请帮我理解。
答案 0 :(得分:4)
您正在做的事情不起作用,因为您没有将成员字段声明为public
:
public String fruitname = "grapes";
只有这样你甚至可以编译它:
System.out.println("person is eating " + f.fruitname);
请注意,在Java字段中,默认情况下包private
(see 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);
}
}