【问题标题】:How to access parent class variable in sub class?如何访问子类中的父类变量?
【发布时间】:2018-08-15 23:04:53
【问题描述】:

首先,我是 Java 新手,我还在学习它。我创建了一个覆盖父类方法的子类。 在下面的代码中,我必须使用通过扫描仪对象分配的变量 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的值变为零。

【问题讨论】:

  • 您是否对您有两个实例感到困惑?您的 Salary 实例和您的 Bonus 实例完全不相关。
  • 很困惑。如果我删除 else 块并提供满足继承类中 if 块的输入,它实际上会显示正确的输出。
  • 除了技术问题:从子类访问父类变量违反了 OOP 中最重要的原则:信息隐藏/封装。您不应该这样做,无论是直接还是通过“getter”方法。

标签: java inheritance superclass


【解决方案1】:

首先,Parentclass= 超类,您的意思是子类。

您的示例中的问题是,尽管BonusSalary 的子类,并且Bonus 从其父类继承int c,但它们是两个不同的实例。

所以b 对象中的int c 字段永远不会设置为您从标准输入中读取的值,所以它是 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 类。

这个BonusDeciderBonus 中的range() 的方法类似,但它也将作为参数获得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 中,我们更喜欢组合而不是继承。

【讨论】:

  • 如何在不创建实例的情况下访问子类?
  • 你不能。这不是它的工作方式。我不确定您的目标是什么,但请尝试改造您的解决方案。
  • 感谢您的帮助。实际上,我试图理解继承的概念。是的,这个例子不合适。我会想一个合乎逻辑的解决方案。
【解决方案2】:

首先你应该明白超类和父类是一样的。 然后在 Salary 类中,您为 c 创建了 getter 和 setter。但是 c 不是私有的。因此,要么您不需要 c 的 getter 和 setter,要么您应该将其设为私有。

这里是a link。这将使您更好地了解封装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2023-04-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多