如何在子类中访问父类变量?

时间:2018-03-07 18:21:10

标签: java inheritance superclass

首先,我是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的值变为零。

2 个答案:

答案 0 :(得分:1)

首先,Parentclass = Superclass,你的意思是子类。

您的示例中的问题是,即使BonusSalary的子类,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。这将为您提供有关封装的更好主意。