8

我有一个java初学者问题:Parent.print() 在控制台中打印“hallo”,但 Child.print() 也打印“hallo”。我认为它必须打印“孩子”。我该如何解决这个问题?

public class Parent {

    private String output = "hallo";

    public void print() {
        System.out.println(output);
    }

}

public class Child extends Parent {

   private String output = "child";

}
4

4 回答 4

9

目前你有两个单独的变量,并且代码中Parent只知道Parent.output. 您需要将值设置Parent.output为“child”。例如:

public class Parent {

  private String output = "hallo";

  protected void setOutput(String output) {
    this.output = output;
  }

  public void print() {
    System.out.println(output );
  }
}

public class Child extends Parent {
  public Child() {
    setOutput("child");
  }
}

另一种方法是为 Parent 类提供一个构造函数,该构造函数获取所需的输出:

public class Parent {
  private String output;

  public Parent(String output) {
    this.output = output;
  }

  public Parent() {
    this("hallo");
  }

  public void print() {
    System.out.println(output );
  }
}

public class Child extends Parent {
  public Child() {
    super("child");
  }
}

这真的取决于你想做什么。

于 2010-11-15T19:36:21.713 回答
3

Child无权访问Parentoutput实例变量,因为它是private. 您需要做的是在set toprotected的构造函数中制作它。Childoutput"child"

换句话说,这两个output变量是不同的。

如果您将输出更改为protectedin ,您也可以这样做Parent

public void print(){
    output = "child"
    super.print();
}
于 2010-11-15T19:35:13.943 回答
1

child 不打印“child”的原因是在java的继承中,只有方法被继承,而不是字段。该变量output不会被孩子覆盖。

你可以这样做:

public class Parent {
    private String parentOutput = "hallo";

    String getOutput() {
        return output;
    }

    public void print() {
        System.out.println(getOutput());
    }
}

public class Child extends Parent {
    private String childOutput = "child";

    String getOutput() {
        return output;
    }
}

此外,字符串变量不需要是不同的名称,但为了清楚起见,我在这里这样做了。

另一种更易读的方法是这样做:

public class Parent {
    protected String output;

    public Parent() {
        output = "hallo";
    }

    public void print() {
        System.out.println(output);
    }
}

public class Child extends Parent {
    public Child() {
        output = "child";
    }
}

在此示例中,变量是protected,这意味着它可以从父级和子级读取。类的构造函数将变量设置为所需的值。这样您只需实现一次打印功能,并且不需要重复的覆盖方法。

于 2010-11-15T19:57:45.003 回答
0

当我试图找出扩展关键字时,我使用了两个类。我希望这也能帮助你理解基本思想。

父类.java

public class Parent {
    private int a1;
    private int b1;


    public Parent(int a, int b){
        this.a1 = a;
        this.b1 = b;
    }

    public void print() {
        System.out.println("a1= " + this.a1 + " b1= " + this.b1);
    }

}

子.java

public class Child extends Parent {
        public Child(int c1, int d1){
        super(c1,d1);
    }

    public static void main(String[] args) {
        Parent pa = new Parent(1,2);
        pa.print();
        Child ch = new Child(5,6);
        ch.print();
    }

}
于 2015-03-02T13:20:25.787 回答