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

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

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

完整的代码如下:

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();
	}

}

 

祝学习愉快~


  • 提问者 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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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