【问题标题】:How to use values of local variables in inherited functions of java? [duplicate]如何在java的继承函数中使用局部变量的值? [复制]
【发布时间】:2015-06-16 02:27:57
【问题描述】:

我有 2 个 A 类和 B 类

public class A {
    public String a = "hey";

    public void printA() {
        System.out.println(a);
    }

public class B extends A{
    public String a = "Jude";
}

我需要做什么才能使下面几行的输出为Jude

B object = new B();
object.printA();    //This should output Jude

【问题讨论】:

  • 即使你是extends A,字符串也不会被覆盖。
  • 您不能覆盖字段;你只能覆盖方法

标签: java inheritance extends


【解决方案1】:

您不能从超类访问子类字段。但是,您可以像这样在子类中更改它:

public class B extends A {
    B() {
        this.a = "Jude";
    }
}

这样您就不用声明新字段,而是更改现有字段的值。请注意,extends A 必须指定 BA 的子类。

您也可以考虑使用方法而不是字段:

public class A {
    public String getA() {
        return "hey";
    }

    public void printA() {
        System.out.println(getA());
    }
}

public class B extends A {
    @Override
    public String getA() {
        return "Jude";
    }
}

请注意,在 Java 中,“变量”一词通常适用于在方法中声明的局部变量。您说的是“字段”,而不是“变量”。

【讨论】:

    【解决方案2】:

    字段不能被覆盖。方法可以;改用方法:

    public class A {
        public String getA() {
            return "hey";
        }
        public void printA() {
            System.out.println(getA());
        }
    }
    
    public class B extends A {
        public String getA() {
            return "Jude";
        }
    }
    

    就是这样。如果在这些类之外没有调用getA(),则cincdider 将其设为protected

    【讨论】:

      【解决方案3】:

      只需将您的 a 声明更改为 this.a 就可以了。

      public class B extends A{
          B(){
              super();
              //Could hardcode this.a to "Jude" here if you want.
          }
      
          B(String word){
              super();
              this.a = word;
          }
      }
      

      a 已经为超类 A 中的 B 定义了,因此您需要使用“this”来访问它。

      你可以这样使用它

      B object = new B("Jude");
      object.printA(); //"Jude"
      

      【讨论】:

      • 最好有A(String),这样B就可以做super("Jude")
      • @bayou.io 我也更喜欢这个。我改为在 B 上实现它
      【解决方案4】:

      Java® 语言规范,Java SE 8 版

      如果类声明了一个具有特定名称的字段,那么 据说该字段的声明隐藏了所有可访问的 在超类中声明具有相同名称的字段,以及 类的超接口。

      不确定如果我需要为观众进一步解释,但您不能“在 java 的继承函数中使用局部变量的值”,为什么?见上文。

      【讨论】:

      • 一个简单的替代方法是不在子类中重新定义它,而只是从子类中重写超类变量。请参阅下面的答案。
      猜你喜欢
      • 2016-09-13
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      相关资源
      最近更新 更多