Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问子类中的父类变量?_Java_Inheritance_Superclass - Fatal编程技术网

Java 如何访问子类中的父类变量?

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 {

首先,我对Java还不熟悉,而且还在学习。我创建了一个子类,该子类重写父类中的方法。 在下面的代码中,我必须使用通过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的值变为零。

首先,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);
}