class Creature {
private int yearOfBirth=10;
public void setYearOfBirth(int year) {
yearOfBirth = year;
}
void setYearOfBirth(Creature other) {
yearOfBirth = other.yearOfBirth; // is this correct it compiles fine
}
int getYearOfBirth() {
return yearOfBirth;
}
public static void main(String args[])
{
Creature c = new Creature();
c.setYearOfBirth(89);
Creature d = new Creature();
c.setYearOfBirth(d);
System.out.println(c.yearOfBirth);
}
}
此代码中有错误吗?
“other.yearOfBirth”错了吗?我的教师说这是错的,但它对我来说很好。
答案 0 :(得分:7)
正如你所发现的那样,它会起作用。但我怀疑在游戏中存在根本性的误解。
我的通灵能力告诉我,你的导师期望代码更像是以下内容:
class Creature {
private int yearOfBirth=10;
public void setYearOfBirth(int year) {
yearOfBirth = year;
}
public void setYearOfBirth(Creature other) {
yearOfBirth = other.yearOfBirth;
}
public int getYearOfBirth() {
return yearOfBirth;
}
}
class Program {
public static void main(String args[]) {
Creature c = new Creature();
c.setYearOfBirth(89);
Creature d = new Creature();
c.setYearOfBirth(d);
System.out.println(c.yearOfBirth); // This will not compile
}
}
误解是你只创建了一个类 - 你的主应用程序类。这有效地使yearOfBirth
成为您可以从main方法访问的混合全局值。在更典型的设计中,Creature
是一个完全独立于主方法的类。在这种情况下,您只能通过其Creature
界面访问public
。您将无法直接访问其私人字段。
(注意那里的任何一个学生:是的,我知道我正在简化。)
答案 1 :(得分:5)
你必须要求你的教师解释为什么他们认为这是错误的(这可能是一种风格问题,甚至是误解),所以你可以从中学习。
最终这个人会影响你的成绩。这是与他们积极互动的绝佳机会。你的老师教你个人越多,你掌握主题的机会就越大。
如果另一方面当你被告知有什么不对的时候你会私下离开并询问一般的互联网社区,你可能会被告知你正确并且你最终会对你的老师产生一种虚假的优越感,这将会适得其反。
答案 2 :(得分:1)
我没有发现任何错误。
代码可以正常工作,因为实例或类可以访问同一个类的其他实例的私有成员。这是设计的。
答案 3 :(得分:0)
不,完全没问题。
看,这取决于观众的意见。但是对于给定的上下文,这段代码可能是完美的。
对于某些其他情况,这可能不正确。所以它取决于将如何使用。
直接从另一个实例访问私有成员是正确的(但并不总是可取的,例如当你进行子类化时),这就是为什么它首先是private
的原因。你说的是“嘿,这是我的,我知道如何使用它”
对其他两种方法使用default
访问修饰符,表示您的意图是它们不应该被包外的其他类使用。
可能我唯一要补充的是让课程最终成功。
final class Creature
如果你想让它可以继承,你可能需要检查yearOfBirth
属性的获取/设置,但它们对我来说是完美的。
现在这里最重要的事情是你了解代码的每个部分的作用,以及它如何影响其行为。
你应该没有代码运气(对不起,我不知道这是什么表达的正确),但你应该知道每次打字时你在做什么,你怎么做打算使用。
答案 4 :(得分:0)
我看到两个“问题”,但我不愿意称他们为错误:
您明确将Creature c 的年龄设置为89,然后使用未初始化的默认(!)生物 d 重写该年龄。如果这是你打算做的,那么很好,但至少你浪费了几个周期来设置你打算稍后抛出的值。
您可能违反了JavaBeans命名约定。
解释后一点:许多Java库和框架(特别是JSP)依赖JavaBeans将对象视为一个组件。我没有深入研究所使用的实际机制,但是根据我所读到的,它依赖于JavaBeans类的内省来推断属性和这些属性的类型。通过重载setter setYearOfBirth()来接受int和Creature,你可以抛弃Introspection。 (有关JavaBeans的正确介绍,请参阅here。)
这不是什么大不了的事 - 完全有可能你不会将这个类用作JavaBean,如果你这样做,那么重构它就可以了。但是你的老师可能更喜欢一些更清洁的东西,如下所示:
class Creature {
private int yearOfBirth=10;
public void setYearOfBirth(int year) {
yearOfBirth = year;
}
int getYearOfBirth() {
return yearOfBirth;
}
public static void main(String args[])
{
Creature c = new Creature();
c.setYearOfBirth(89);
Creature d = new Creature();
c.setYearOfBirth(d.getYearOfBirth());
System.out.println(c.getYearOfBirth());
}
}
现在,您对yearOfBirth的所有访问都来自公共getter方法,这有助于封装,并且如果您的main方法移动到另一个类,将阻止代码中断。 (正如Greg D正确指出的那样。)
此外,这还有一个额外的好处,即可以清除代码的 intent ,当您开始为其他人编写代码进行维护和修改时,这会变得越来越重要。
答案 5 :(得分:-2)
这是错误的,因为您正在访问另一个对象的私有成员(您声明private int yearOfBirth
),尽管类类型相同。您应该使用您定义的公共getter:yearOfBirth = other.getYearOfBirth()
答案 6 :(得分:-2)
yearofBirth
是私有的int。因此,对other.yearOfBirth
的调用可能会失败......