首先,我是Java的新手,我还在学习它。我创建了一个子类来覆盖parentClass中的方法。 在下面的代码中,我必须使用通过scanner对象分配的变量C的值。调试之后,我发现变量C的值在开始执行子类中使用的If else块时变为零。即使父类不是私有的,我也使用了getter和setter,并使用super关键字从父类访问变量的值。这段代码有什么问题?
#Main method
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Salary s = new Salary();
Scanner scan = new Scanner(System.in);
System.out.println("Enter a valid salary: ");
s.c = scan.nextInt();
scan.close();
s.range(1000, 2000);
Bonus b = new Bonus();
b.range(10, 100);
}
}
#parent class
public class Salary {
int c;
public void range(int a, int b){
if((a+b)<c){
System.out.println("Employee has average salary");
}
else if ((a+b)>c) {
System.out.println("Employee is rich");
}
}
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
}
#SubClass
public class Bonus extends Salary {
@Override
public void range(int a, int b) {
if((a+b)>super.getC()){
System.out.println("Employee is applicable for bonus");
}
else{
System.out.println("Employee is poor");
}
}
我想获取代码来执行子类中编写的else块。在超类中执行代码时,c的值变为零。
答案 0 :(得分:1)
首先,Parentclass = Superclass,你的意思是子类。
您的示例中的问题是,即使Bonus
是Salary
的子类,Bonus
从其父级继承int c
,它们也是两个不同的实例。
因此,对象int c
中的b
字段永远不会设置为您从标准输入读取的值,因此它为0.
尝试
public static void main(String[] args) {
Salary s = new Salary();
Scanner scan = new Scanner(System.in);
System.out.println("Enter a valid salary: ");
int input = scan.nextInt();
s.c = input;
scan.close();
s.range(1000, 2000);
Bonus b = new Bonus();
b.c = input;
b.range(10, 100);
}
这应该可行,但请注意,这不是OOP,您应该了解更多有关OOP原则的信息。
修改强>
我会使用合成而不是继承,就像你有Salary
和某种BonusDecider
类一样。
此BonusDecider
与您range()
Bonus
的方法类似,但它也会作为Salary
的参数获得,而您可以通过getter访问输入值
你的主要看起来像
public static void main(String[] args) {
Salary s = new Salary();
Scanner scan = new Scanner(System.in);
System.out.println("Enter a valid salary: ");
int input = scan.nextInt();
s.c = input;
scan.close();
s.range(1000, 2000);
BonusDecider b = new BonusDecider();
b.range(10, 100, s);
}
在这种情况下,您可以摆脱不必要的继承。在OOP中,我们赞成组合而不是继承。
答案 1 :(得分:-1)
首先你应该了解超类和父类是一样的。 然后在类Salary中为c创建getter和setter。但是c不是私密的。所以,要么你不需要getter和setter for c,要么你应该把它变成私有的。
此处a link。这将为您提供有关封装的更好主意。