求救,老师帮我优化一下。虽然实现了代码,但是感觉有一些小问题
public interface Ball { //创建抽象方法play():void public abstract void play(); } public class BallTest{ // 创建成员内部类Inner_m public class Inner_m implements Ball{ public void play() { System.out.println("成员内部类:"+"\n打篮球"); } } // 创建方法内部类 public Object info() { class Inner_f implements Ball{ @Override public void play() { System.out.println("************"); System.out.println("方法内部类:"+"\n打乒乓球"); } public String doe() { play(); return ""; } }return new Inner_f().doe(); } // 定义一个方法void playBall(Ball ball),调用play()方法 public void playBall(Ball ball) { BallTest ba=new BallTest(); ba.info(); } } public class Test { public void getPlay(Ball ball) { ball.play(); } public static void main(String[] args) { //完成成员内部类内部测试 BallTest.Inner_m inner=new BallTest().new Inner_m(); inner.play(); //完成方法内部类测试 BallTest te=new BallTest(); System.out.println(te.info()); //完成匿名内部类测试 System.out.println("****************"); Test tes=new Test(); tes.getPlay(new Ball() { public void play() { System.out.println("匿名内部类"+"\n打排球"); } }); } }
老师,我的代码感觉是有点问题的:
①BallTest类我增加了一个 doe方法后,在测试类才完成了 方法内部类的测试。当没有doe方法,并且 方法info 返回值类型为void时,Test测试类无法正常输出play方法(或者是我调用方式不对),请老师指点一下。
②方法info 必须为带返回值的类型吗? 为何我用void在测试类无法正常调用play呢?
③老师帮看一下,我代码除了上述我的两个问题,是否还有别的问题
感谢老师
21
收起
正在回答 回答被采纳积分+1
1回答
好帮手慕小蓝
2022-04-28 11:51:26
同学你好,老师直接分析同学代码中存在的问题,也许可以间接回答同学的疑问:
1.方法内部类这部分,同学采用的返回字符串的形式进行打印输出。实际上可以直接测试类中调用info方法,并且使打印语句只在info方法中就可以了,这样就可以不去声明doe方法。修改后的代码如下图:
2.BallTest类中的playBall(Ball ball)方法实现有问题,这里应当是一个多态的形式,参数传入Ball接口的实现类,通过多态调用play方法。而同学的实现调用info,与题目要求完全不同。修改后的代码如下图:
3.匿名内部类的书写:匿名内部类的书写语法应该是“接口类型 对象名 = new 接口名(参数列表){接口方法的重写}”的格式,而同学的代码中单独声明了一个方法,实际上是不必要的。修改后的代码如下图:
完整的代码如下:
package com.imooc.test; public interface Ball { // 创建抽象方法play():void public abstract void play(); }
package com.imooc.test; public class BallTest { // 创建成员内部类Inner_m public class Inner_m implements Ball { public void play() { System.out.println("成员内部类:" + "\n打篮球"); } } // 创建方法内部类 // public Object info() { public void info() { class Inner_f implements Ball { @Override public void play() { System.out.println("************"); System.out.println("方法内部类:" + "\n打乒乓球"); } // public String doe() { // play(); // return ""; // } } new Inner_f().play(); // return new Inner_f().doe(); } // 定义一个方法void playBall(Ball ball),调用play()方法 public void playBall(Ball ball) { // BallTest ba = new BallTest(); // ba.info(); ball.play(); } }
package com.imooc.test; public class Test { // public void getPlay(Ball ball) { // ball.play(); // } public static void main(String[] args) { // 完成成员内部类内部测试 BallTest.Inner_m inner = new BallTest().new Inner_m(); inner.play(); // 完成方法内部类测试 BallTest te = new BallTest(); // System.out.println(te.info()); te.info(); // 完成匿名内部类测试 System.out.println("****************"); // Test tes = new Test(); // tes.getPlay(new Ball() { // public void play() { // System.out.println("匿名内部类" + "\n打排球"); // } // }); Ball b = new Ball() { public void play() { System.out.println("匿名内部类" + "\n打排球"); } }; b.play(); } }
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星