Java 如何访问子类中的父类变量?
首先,我对Java还不熟悉,而且还在学习。我创建了一个子类,该子类重写父类中的方法。 在下面的代码中,我必须使用通过scanner对象分配的变量C的值。调试之后,我发现变量C的值在开始执行子类中使用的If-else块时变为零。即使父类不是私有的,我也使用了getter和setter,并使用super关键字从父类访问变量的值。这个代码有什么问题Java 如何访问子类中的父类变量?,java,inheritance,superclass,Java,Inheritance,Superclass,首先,我对Java还不熟悉,而且还在学习。我创建了一个子类,该子类重写父类中的方法。 在下面的代码中,我必须使用通过scanner对象分配的变量C的值。调试之后,我发现变量C的值在开始执行子类中使用的If-else块时变为零。即使父类不是私有的,我也使用了getter和setter,并使用super关键字从父类访问变量的值。这个代码有什么问题 #Main method import java.util.Scanner; public class Main {
#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的值变为零。首先,Parentclass=Superclass,您指的是subclass 示例中的问题是,尽管Bonus是Salary的子类,而Bonus从其父类继承int c,但它们是两个不同的实例 因此,对象b中的int c字段从未设置为从标准输入读取的值,因此它是0 试一试 这应该是可行的,但请注意,这不是OOP,您应该学习更多有关OOP原则的知识 编辑 我会使用合成而不是继承,就像你有薪水和某种BonuDecider类 这个BonuDecider的方法与您的“从奖金到范围”的方法类似,但它也可以作为参数获取工资,然后您可以通过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);
}
在这种情况下,您将摆脱不必要的继承。在面向对象编程中,我们更喜欢组合而不是继承。首先,您应该理解超类和父类是相同的。 然后,在课堂上,你为c创建了getter和setter。但是c不是私有的。所以要么你不需要c的getter和setter,要么你应该把它私有化
给你。这将为您提供更好的封装概念。您是否对有两个实例感到困惑?你的工资实例和奖金实例完全不相关。相当混乱。如果我删除else块并提供满足继承类中If块的输入,它实际上会显示正确的输出。除了技术问题之外:从子类访问父类变量违反了OOP中的mots重要原则:信息隐藏/封装。您不应该直接或通过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);
}