我正在为类进行一个抽象的超类练习,我坚持为什么我的getter返回null。根据我的教师演示的方式,在子类中重写了setter,并且getter将成为超类中的最终方法。当我将它们移动到子类时,getter工作,所以我猜它与它们在不同的类中的事实有关,但由于我是面向对象编程的新手,我不知道这是不是为什么和/或如何纠正这个问题。
摘要超类:
public abstract class ProgrammingCourse {
private double credits;
private String courseName;
public final double getCredits() {
return credits;
}
public abstract void setCredits(double credits);
public final String getCourseName() {
return courseName;
}
public abstract void setCourseName(String courseName);
示例子类:
public class AdvancedJavaCourse extends ProgrammingCourse {
private double credits;
private String courseName;
@Override
public void setCourseName(String courseName) {
if (courseName == null || courseName.length() == 0) {
JOptionPane.showMessageDialog(null,
"Error: courseName cannot be null or empty");
System.exit(0);
}
this.courseName = courseName;
}
@Override
public void setCredits(double credits) {
this.credits = credits;
}
我如何在我的主要工作中使用它:
ProgrammingCourse[] courses = {new AdvancedJavaCourse(),
new IntroJavaCourse(), new IntroToProgrammingCourse()};
courses[0].setCourseName("adv Java");
courses[1].setCourseName("Intro Java");
courses[2].setCourseName("Intro Programming");
for (ProgrammingCourse pc : courses) {
System.out.println(pc.getCourseName());
}
AdvancedJavaCourse advJava = new AdvancedJavaCourse();
advJava.setCourseName("Advanced Java");
System.out.println(advJava.getCourseName());
答案 0 :(得分:5)
您的代码存在一些问题。从AdvancedJavaCourse
开始,您应删除字段credits
和courseName
。可以从ProgrammingCourse
访问这些内容。
现在您只为每个字段提供了一个声明,您应该在protected
内将字段标记为ProgrammingCourse
或创建一些getter / setter,以便您可以更改其值AdvancedJavaCourse
。
答案 1 :(得分:1)
您必须避免在超类和子类中声明具有相同名称的字段。
这就是所谓的变量/字段shadowing。即使语言允许,也应避免使用。
这里发生的是AdcanceJavaCourse
的实例共有4个字段,两对credit
和courseName
,ProgrammingCourse
和AdvanceJavaCourse
声明的字段在ProgrammingCourse
本身声明。
AdvanceJavaCourse
中的代码将读取和写入该类中声明的变量,而ProgrammingCourse
中的代码将访问该类中声明的字段。
你想在这里做的是删除AdvanceJavaCourse中的字段声明,并将protected
中的字段声明为ProgramingCourse
。
另一种可能性是在ProgramingCourse
中将这些字段声明为私有,为 public void setField(Type value) {
field = value;
}
中的设置者提供一个简单的主体:
super.
那些setter或getter中的任何专门覆盖子类都可以通过使用带有@Override
public void setField(Type value) {
...
super.setField(processedValue);
...
}
前缀的父setter getters来访问私有字段:
public int rollPair()
{
return die1.roll() + die2.roll();
}