BallTest类中的成员内部类的获取方法的返回值改成Object为什么会报错?

BallTest类中的成员内部类的获取方法的返回值改成Object为什么会报错?

Test.java
//测试类
public class Test {

    public static void main(String[] args) {
		//完成成员内部类内部测试
		BallTest one = new BallTest();
		//获取内部类对象实例,方式一:new 外部类.new 内部类
		System.out.println("成员内部类的方法一调用");
		BallTest.Inner_m one1 = new BallTest().new Inner_m();
		one1.play();
		//获取内部类对象实例,方式二:外部类对象.new 内部类
		System.out.println("成员内部内的方法二调用");
		one.new Inner_m().play();
		//获取内部类对象实例,方式三:外部类对象.获取方法
		System.out.println("成员内部内的方法三调用");
		one.getInner_m().play();
// 		System.out.println( one.getInner_m() instanceof Object);
		//完成方法内部类测试
	   // BallTest two = new BallTest();
	    one.info();
		//完成匿名内部类测试
        BallTest two = new BallTest();
        two.playBall(new Ball(){
            public void play(){
                System.out.println("**************************");
                System.out.println("匿名内部类:");
                System.out.println("打排球");
            }
        });
		
	    
	}

}
BallTest.java
//创建类BallTest
public class BallTest implements Ball {
    // 创建成员内部类Inner_m
    class Inner_m{
        public void play(){
            System.out.println("成员内部类:");
            System.out.println("打篮球");
        }
    }
    public Object getInner_m(){
        return new Inner_m();
    }

	// 创建方法内部类
    public void info(){
        class Inner_f{
            public void play(){
                System.out.println("****************");
                System.out.println("方法内部类");
                System.out.println("打乒乓球");
            }
        }
        new Inner_f().play();
    }
    

	// 定义一个方法void playBall(Ball ball),调用play()方法
    public void playBall(Ball ball){
        ball.play();
    }
    
    public void play(){
        
    }
}
Ball.java
//接口Ball
public   interface Ball {
    //创建抽象方法play():void
    void play();
}

报错提示为

运行失败

Test.java:16: error: cannot find symbol

one.getInner_m().play();

                ^

  symbol:   method play()

  location: class Object

1 error


如果将BallTest类中的getInner_m方法的返回值修饰符写成Inner_m就能成功运行,为什么Object会报错?

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

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

11回答
好帮手慕小尤 2020-02-12 15:33:44

同学你好,当getInner_m()方法返回值类型为Object时,返回的还是具体的子类的对象,但是引用类型是父类的引用,例如: Animal  a=new Cat();  a的对象是Cat对象,但是引用类型是父类的引用类型  所以在调用子类方法或属性时直接强转为Cat,总而言之  就是返回值是Object时,在调用时可以强转一下 ,但是引用范围大。不强制转换为Inner_m类时,可以直接调用但是引用范围比较小。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

好帮手慕小尤 2020-02-12 09:56:48

同学你好,同学描述的是否是,在getInner_m()方法中为实例化的对象赋值的问题。如下图所示:

http://img1.sycdn.imooc.com//climg/5e435acf09ba585c03320062.jpg

如果是,则不需要赋值,可以直接返回的,如下图所示:

http://img1.sycdn.imooc.com//climg/5e435b1e0916057502870068.jpg

如果不是,建议同学重新反馈。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 慕数据0164170 #1
    之前看到老师的回复是可以直接返回子类类型,我想知道这个直接返回子类类型就是指将返回值修饰符Object改成Inner_m吗?或者是别的方法?
    2020-02-12 10:03:40
好帮手慕小尤 2020-02-11 10:13:50

同学你好,是老师描述不清楚,返回类型是Objec,可以直接返回子类类型,不需要强制转换。但强制转换也是可以的。给您的学习带来不便深感抱歉!祝学习愉快!

  • 提问者 慕数据0164170 #1
    那能不能在不改变返回值修饰符的情况下返回Inner_m类的对象呢?
    2020-02-12 08:38:50
好帮手慕小尤 2020-02-10 14:47:34

同学你好,在getInner_m()方法中实例化的Inner_m()类是Inner_m类型,并不是Object类型。所以没有直接创建了一个跟返回值修饰符类型同类的对象。如下图所示:

http://img1.sycdn.imooc.com//climg/5e40fb5509ae714404940178.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 慕数据0164170 #1
    既然返回的是Inner_m类型,那么为什么前面的老师还要我进行强制类型转换? System.out.println("成员内部内的方法三调用"); Inner_m i = (Inner_m)one.getInner_m(); i.play();
    2020-02-10 22:46:25
提问者 慕数据0164170 2020-02-10 04:41:48

前面的代码在inport了Inner_m类后已成功,但还有一个小问题

//创建类BallTest
public class BallTest implements Ball {
    // 创建成员内部类Inner_m
    class Inner_m implements Ball{
        public void play(){
            System.out.println("成员内部类:");
            System.out.println("打篮球");
        }
    }
    public Object getInner_m(){
        return new Inner_m();
    }

在下面的getInner_m()方法中,我是new Inner_m()对象,那么我觉得他应该是创建了上面的成员内部类Inner_m的类对象,Object作为返回值修饰符只要返回值是Object的子类即可,但是根据前面的实验,他的new Inner_m()直接就是Object类对象了,这是为什么?在同一个类中明明有同名的Inner_m类啊,他没有去调用同类的内部类创建对象,而是直接创建了一个跟返回值修饰符类型同类的对象?即使这个new的对象名与我的成员内部类名完全相同也不会去调用成员内部类?

好帮手慕柯南 2020-02-09 14:23:34

同学你好!

并不是Object不能够强转,应该是你没有import Inner_m这个类,比如:

http://img1.sycdn.imooc.com//climg/5e3fa3d209aa6a4707150520.jpg

因此你应该import一下。老师这里是所有的类都在ceshi1下面,所以导入的路径是那样,你根据自己的情况选择就可以。老师在在线编辑器中测试是会报错的,建议你在eclipse中测试。

祝学习愉快~


  • 提问者 慕数据0164170 #1
    已成功,但还有一个小问题,已在回复中贴出
    2020-02-10 04:34:18
提问者 慕数据0164170 2020-02-09 12:05:14
//测试类
public class Test {

    public static void main(String[] args) {
		//完成成员内部类内部测试
		BallTest one = new BallTest();
		//获取内部类对象实例,方式一:new 外部类.new 内部类
		System.out.println("成员内部类的方法一调用");
		BallTest.Inner_m one1 = new BallTest().new Inner_m();
		one1.play();
		//获取内部类对象实例,方式二:外部类对象.new 内部类
		System.out.println("成员内部内的方法二调用");
		one.new Inner_m().play();
		//获取内部类对象实例,方式三:外部类对象.获取方法
		System.out.println("成员内部内的方法三调用");
		Inner_m i = (Inner_m)one.getInner_m();
		i.play();
// 		one.getInner_m().play();
// 		System.out.println( one.getInner_m() instanceof Object);
		//完成方法内部类测试
	   // BallTest two = new BallTest();
	    one.info();
		//完成匿名内部类测试
        BallTest two = new BallTest();
        two.playBall(new Ball(){
            public void play(){
                System.out.println("**************************");
                System.out.println("匿名内部类:");
                System.out.println("打排球");
            }
        });
		
	    
	}

}

//创建类BallTest
public class BallTest implements Ball {
    // 创建成员内部类Inner_m
    class Inner_m implements Ball{
        public void play(){
            System.out.println("成员内部类:");
            System.out.println("打篮球");
        }
    }
    public Object getInner_m(){
        return new Inner_m();
    }

	// 创建方法内部类
    public void info(){
        class Inner_f implements Ball{
            public void play(){
                System.out.println("****************");
                System.out.println("方法内部类");
                System.out.println("打乒乓球");
            }
        }
        new Inner_f().play();
    }
    

	// 定义一个方法void playBall(Ball ball),调用play()方法
    public void playBall(Ball ball){
        ball.play();
    }
    
    public void play(){
        
    }
}

//接口Ball
public   interface Ball {
    //创建抽象方法play():void
    void play();
}

目前已经根据前一个老师说的所有内部类也都实现了接口,实例化时添加了强制类型转换

但是目前

    public Object getInner_m(){
        return new Inner_m();
    }

这个返回值修饰符如果不使用Inner_m而是使用Object还是没有办法解决Test方法中调用的问题,即使按照前面一个老师说的强制类型转换也会报错

	Inner_m i = (Inner_m)one.getInner_m();
	i.play();

报错信息为

Test.java:16: error: cannot find symbol
Inner_m i = (Inner_m)one.getInner_m();
^
 symbol:   class Inner_m
 location: class Test
Test.java:16: error: cannot find symbol
Inner_m i = (Inner_m)one.getInner_m();
            ^
 symbol:   class Inner_m
 location: class Test
2 errors

好帮手慕柯南 2020-02-09 11:43:20

同学你好,建议你载贴一下最新的代码,注意在我要回答中贴出:

http://img1.sycdn.imooc.com//climg/5e3f7f7d0925f13b08520114.jpg

http://img1.sycdn.imooc.com//climg/5e3f7f8a095d7cda07730583.jpg

建议你在eclipse中进行代码的编写,如果有语法错误,工具会进行提示,可以避免一些不必要的错误。这样更有利于同学对程序进行调试。

祝学习愉快~



好帮手慕小脸 2020-02-08 14:56:29

同学你好,因为Object是所有类的父类,所以在调用时需要进行强转,修改如下:

http://img1.sycdn.imooc.com//climg/5e3e5b8b094c079306250086.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 慕数据0164170 #1
    试了一下 Test.java:16: error: cannot find symbol Inner_m i = (Inner_m)one.getInner_m(); ^ symbol: class Inner_m location: class Test Test.java:16: error: cannot find symbol Inner_m i = (Inner_m)one.getInner_m(); ^ symbol: class Inner_m location: class Test 2 errors 强制类型转换的时候找不到Inner_m类。。。
    2020-02-09 05:40:06
好帮手慕小脸 2020-02-08 10:04:53

同学你好,问题原因如下:

    1、Inner_m( )方法与Inner_f( )都需要实现Ball接口

http://img1.sycdn.imooc.com//climg/5e3e16c409527cae05820469.jpg

    2、调用playBall方法。

http://img1.sycdn.imooc.com//climg/5e3e17330915c22105940126.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

        

  • 提问者 慕数据0164170 #1
    已经加上了两个类的接口实现,用one.playBall(one1)传参可以成功运行,但是我的方法三是想像视频中那样使用get方法获取对象使用,即使给内部类也都加上了接口实现,one.getInner_m().play()仍然会报错 运行失败 Test.java:16: error: cannot find symbol one.getInner_m().play(); ^ symbol: method play() location: class Object 1 error
    2020-02-08 10:25:59
提问者 慕数据0164170 2020-02-08 07:12:22

题目说错了,是返回值修饰符

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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