A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiang_ming 中级黑马   /  2014-5-10 14:30  /  1332 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看毕老师的基础视频,有个匿名内部类的练习
如下代码
interface Inter
{
        void method();
}
class Test
{
        //补足代码,通过匿名内部类

}
class  InnerClassTest
{
        public static void main(String[] args)
        {
                Test.function().method();
        }
}


除了视频中的方法,我感觉还可以把Test看成一个类,
把function()看成Test的一个静态内部类,
把method()看成function内部类的非静态方法

但是编写总是不行,请问大家这样可以吗?代码应该怎么写?
谢谢

9 个回复

倒序浏览
方法只能是对象或本类来调用,所以调用method()只能是接口的子类对象。
回复 使用道具 举报
skill20 发表于 2014-5-10 14:44
方法只能是对象或本类来调用,所以调用method()只能是接口的子类对象。

我把Test.function().method();
改成了new Test.function().method();

然后在待写代码区写上
static class function implements Inter
        {
                public  void method()
                {
                        System.out.println("haha");
                }
        }
就行了
回复 使用道具 举报
jiang_ming 发表于 2014-5-10 15:05
我把Test.function().method();
改成了new Test.function().method();

你这个方法可以继承类么?
回复 使用道具 举报
  1. class Test
  2. {
  3.         //补足代码,通过匿名内部类
  4.         static Inter function()
  5.         {
  6.                 //返回一个Inter接口的子类对象。
  7.                 return new Inter()
  8.                 {
  9.                         public void method(){}
  10.                 };
  11.         }
  12. }
复制代码

这样应该可以  楼主试试吧
回复 使用道具 举报
本帖最后由 大恶魔先森~ 于 2014-5-10 16:29 编辑

不可以的,如果按照你说的那样,就不用管接口Inner了,
  1. class Test
  2. {
  3.         public void show()
  4.         {
  5.                 class function
  6.                 {
  7.                         public void method();
  8.                 }
  9.         }
  10.         
  11. }
复制代码

因为外部类和外部其他类要访问内部类的成员,必须建立该类的对象,即为:new Test.fuction();
如果是这样的话,main方法中的调用语句应该是:new Test.fuction().method();
回复 使用道具 举报 1 0
本帖最后由 Shimano 于 2014-5-10 16:22 编辑

你说:
“把method()看成function内部类的非静态方法”,
“把function()看成Test的一个静态内部类,”
首先:错误:
        function()这种写法明显是方法的格式,怎么能把function()看成静态内部类。
        只能说把function看成静态内部类。(不能加括号)
        
而毕老师的例子中method()方法定义在Inter这个接口中。
所以你实验的时候,已经脱离了老师的要求了。
但是可能你还是想在主函数中运行:Test.function().method();
所以编译出错是难免的

你的想法很好,可以很好的加强你对某些概念的理解。但是有些概念你可能还不是很清楚。
比如:
定义匿名内部类的前提:内部类必须继承一个类,或者实现接口
匿名内部类的格式:new 父类或者接口(){定义子类的内容};

按照你的想法,我抛开老师的要求,分析了一下你的思路纠正了你的错误,
        把function看成静态内部类,把method()看成成function静态内部类中的静态方法。
        或者把function看成静态内部类,把method()看成成function静态内部类中的非静态方法。
        代码如下代码:编译运行正常

  1. class Test
  2. {
  3.         static class function
  4.         {
  5.                  static void method()
  6.                 {
  7.                         System.out.println("method run");
  8.                 }
  9.         }
  10. }
  11. class InnerClassTest1
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 Test.function.method();
  16.         }
  17. }
复制代码
  1. class Test
  2. {
  3.         static class function
  4.         {
  5.                  void method()
  6.                 {
  7.                         System.out.println("method run");
  8.                 }
  9.         }
  10. }
  11. class InnerClassTest1
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 new Test.function().method();
  16.         }
  17. }
复制代码




回复 使用道具 举报 1 0
youcyou 发表于 2014-5-10 15:58
这样应该可以  楼主试试吧

这是老师的标准答案,我想试试别的方法
回复 使用道具 举报
大恶魔先森~ 发表于 2014-5-10 16:04
不可以的,如果按照你说的那样,就不用管接口Inner了,
因为外部其他类要访问内部类的成员,必须建立该类的 ...

是的,我这样一改就可以了
回复 使用道具 举报
jiang_ming 发表于 2014-5-10 16:20
这是老师的标准答案,我想试试别的方法
  1. interface Inter
  2. {
  3.         void method();
  4. }
  5. class Test
  6. {
  7.         //补足代码,通过匿名内部类
  8.          static class function
  9.         {
  10.                 void method()
  11.                 {
  12.                        
  13.                 };
  14.         }
  15. }
  16. class  InnerClassTest
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                new Test.function().method();
  21.         }
  22. }
复制代码

这样对吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马