Java:扩展内部类

我试图理解在Java中扩展内部类。 我已经阅读过,但没有找到我的问题。 所以这里……

我有…

public class Pie{ protected Slice[] slices; // Pie constructor public Pie(int n){ sliceGenerator(n) } private void sliceGenerator(int n){ slices = new Slice[n]; final float sweepAngle = 360.0f/(float)n; float startAngle = 0; for (int i=0;i<n;i++){ slices[i] = new Slice(startAngle); startAngle += sweepAngle; } } @Override public String toString(){ for (Slice s:slices){ s.toString(); } } // Inner class... public class Slice{ public Slice(float startAngle){ //set some private fields based on startAngle and generic pie } @Override public String toString(){ return **string based on private fields** } } } 

然后我扩展这个……

 public class ApplePie extends Pie{ protected Slice[] slices; // Apple Pie constructor public ApplePie(int n){ super(n); } // Inner class... public class Slice extends Pie.Slice{ public Slice(float startAngle){ super(startAngle); //set some **additional** private fields based on startAngle **specific to apple pie** appleness or something } @Override public String toString(){ return **string based on apple pie specific private fields** } } } 

现在,当我制作一个Apple派并调用其toString方法时,就像这样…

 ApplePie ap = new ApplePie(8); System.out.println(ap.toString()); 

我没有获得有关苹果派切片的信息,但有关馅饼切片的信息。 它忽略了我的toString覆盖,或者更可能忽略了我的苹果派Slice 。 如何安排苹果派切片参考ApplePie

任何帮助非常感谢! 对不起馅饼参考 – 这是我正在使用的实际课程……

我已经更改了您的代码以满足您的要求。

你的超类Pie即将创建一个新的Slice实例,但是子类ApplePie的Slice不会覆盖其超类的Slice方法。

我添加了以下函数,以使子类能够创建自己的Slice

 protected void newSliceArray(int n) { slices = new Slice[n]; } protected Slice newSlice(float startAngle) { return new Slice(startAngle); } 

Pie.java:

 public class Pie { private int a = 1; protected Slice[] slices; // Pie constructor public Pie(int n) { sliceGenerator(n); } private void sliceGenerator(int n) { newSliceArray(n); final float sweepAngle = 360.0f / n; float startAngle = 0; for (int i = 0; i < n; i++) { slices[i] = newSlice(startAngle); startAngle += sweepAngle; } } protected void newSliceArray(int n) { slices = new Slice[n]; } protected Slice newSlice(float startAngle) { return new Slice(startAngle); } @Override public String toString() { String t = ""; for (Slice s : slices) { t += s.toString(); } return t; } // Inner class... public class Slice { public Slice(float startAngle) { // set some private fields based on startAngle and generic pie } @Override public String toString() { return "" + a; } } } 

ApplePie.java:

 public class ApplePie extends Pie { private int b = 2; // protected Slice[] slices; // Apple Pie constructor public ApplePie(int n) { super(n); } protected void newSliceArray(int n) { slices = new Slice[n]; } protected Slice newSlice(float startAngle) { return new Slice(startAngle); } // Inner class... public class Slice extends Pie.Slice { public Slice(float startAngle) { super(startAngle); // set some **additional** private fields based on startAngle **specific to apple pie** // appleness or something } @Override public String toString() { return b + ""; } } } 

测试:

 public static void main(String[] args) { ApplePie ap = new ApplePie(8); System.out.println(ap.toString()); } 

该代码将打印22222222

在您的超类中,您正在创建和存储Pie.Slice对象:

 private void sliceGenerator(int n){ slices = new Slice[n]; final float sweepAngle = 360.0f/(float)n; float startAngle = 0; for (int i=0;i 

这些是Pie.toString使用的相同对象( ApplePie Pie.toStringApplePie不会覆盖它)。

使用ApplePie扩展Pie并使用ApplePie扩展Pie.Slice不会改变这一点。 上面代码中的new Slice(startAngle)并没有神奇地切换到实例化不同的东西。

除此之外,你的Pie.toString()没有返回任何东西 - 它甚至不应该编译:

 @Override public String toString(){ for (Slice s:slices){ s.toString(); } } 

我猜你想要返回一个表示所有切片的String。 这将是一个快速解决方案,例如:

 @Override public String toString() { return Arrays.toString(slices); } 

Arrays.toString只是一个获取表示数组的String的实用工具方法。)

答案在于你的计划。 当您实例化Slice类时,它会调用超类并调用sliceGenerator。 此方法在内部创建Pie.Slice的实例,而不是ApplePie.Slice。 要解决此问题,请使sliceGenerator方法受到保护,并在Apple.Slice类中覆盖它。 创建Apple.Slice的实例,它应该工作。