求救,老师帮我优化一下。虽然实现了代码,但是感觉有一些小问题

求救,老师帮我优化一下。虽然实现了代码,但是感觉有一些小问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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呢?

③老师帮看一下,我代码除了上述我的两个问题,是否还有别的问题


感谢老师

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2022-04-28 11:51:26

    同学你好,老师直接分析同学代码中存在的问题,也许可以间接回答同学的疑问:

    1.方法内部类这部分,同学采用的返回字符串的形式进行打印输出。实际上可以直接测试类中调用info方法,并且使打印语句只在info方法中就可以了,这样就可以不去声明doe方法。修改后的代码如下图:

https://img1.sycdn.imooc.com//climg/626a0ede099811e407580423.jpg

https://img1.sycdn.imooc.com//climg/626a0ef70958f03605440107.jpg

    2.BallTest类中的playBall(Ball ball)方法实现有问题,这里应当是一个多态的形式,参数传入Ball接口的实现类,通过多态调用play方法。而同学的实现调用info,与题目要求完全不同。修改后的代码如下图:

https://img1.sycdn.imooc.com//climg/626a0f060949300106790166.jpg

    3.匿名内部类的书写:匿名内部类的书写语法应该是“接口类型 对象名 = new 接口名(参数列表){接口方法的重写}”的格式,而同学的代码中单独声明了一个方法,实际上是不必要的。修改后的代码如下图:

https://img1.sycdn.imooc.com//climg/626a0f1909367d2a07620347.jpg

完整的代码如下:

1
2
3
4
5
6
package com.imooc.test;
 
public interface Ball {
    // 创建抽象方法play():void
    public abstract void play();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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();
    }
 
}

 

祝学习愉快~


  • 提问者 UUU加油 #1

    info方法  返回值是void时, 下面为何要加 new Inner_f().play();呢

    2022-04-28 12:10:24
  • 提问者 UUU加油 #2

    ①info方法 返回值为void时,最后为啥加 new Inner_f().play();呢。

    不是只有 有返回值时,才可以,return new Inner_f().play()吗?

    ②为啥后面要调用play方法:new Inner_f().play();不可以在Test类中调用吗?

    2022-04-28 12:13:57
  • 好帮手慕小蓝 回复 提问者 UUU加油 #3

    同学你好~

    1.Inner_f作为方法内部类,也叫作局部内部类,其生命周期与局部变量是一致的,其有效范围只在info方法中,所以该内部类只能在info方法中创建对象。

    2.由于第一点的原因,内部类中的方法只能在内部类所在的方法中调用,即play方法只能在info方法中调用。在测试类中是无法调用的。

    3.new Inner_f().play();语句的问题:这里是为了执行play方法中的代码,而这个方法只能在info方法中调用。

    4.基于第三点,info方法就需要设计成void返回的方法,即只在play方法中用打印语句输出结果。

    祝学习愉快~


    2022-04-28 13:21:54
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码