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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© air 中级黑马   /  2013-11-2 16:43  /  1643 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. interface Inter
  2. {
  3.         void method();
  4. }

  5. class Test  
  6. {
  7. //补足代码,通过匿名内部.
  8. static Inter function()        //这个名字是什么意思?为什么不用implements关键字呢?               
  9.         {
  10.                 return new Inter()//为什么要用上return呢?
  11.                 {
  12.                         public void method()
  13.                         {
  14.                                 System.out.println("haha,it is easy");
  15.                         }
  16.                 };                //这个地方不是应该.method的吗?和上面那个return有关系吗?
  17.         }
  18. }





  19. class InnerClassTest
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Test.function().method();//为什么上面的Inter function到这下面就没有Inter了呢?
  24.         }
  25. }
复制代码
这里是视频里老师写的题目.可是咋和他里面讲的方法又有些出入呢?
请同学帮忙解释一下我这几个代码上的问题

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

15 个回复

倒序浏览
不用implements关键字是因为它都创了个Inter对象===》return new Inter()是因为你定义 function() 方法的时候要求了返回值是inter类型,而你看到 return new Inter()后面没有分号而是大括号,里面写着method()方法,这个方法复写了接口里的方法。意思大概是创建了个匿名创对象,这个对象里有个method()方法里写的是System.out.println("haha,it is easy");

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
   首先,要了解内部类的定义以及用法,其次要仔细想想return和void 的作用,最后再来看看这个程序。
  都说代码要多写,才能有疑惑,有疑惑才会有想法。多敲代码。
回复 使用道具 举报
首先你要知道如何定义匿名内部类,你这个问题才可以解决。
你程序中存在疑问的代码中实际上可以化繁为简看,外部就是一个返回Inter类型的方法,
在方法中需要返回值,return 后面跟的就是一个Inter类型的对象,只是通过匿名内部类的形式来定义,
它就是一个Inter对象。
使用简化代码表示就是:其中public是我加上去,为了让你看的更为直观,
                                 return后面的就是一个匿名内部类对象,我没有复写方法。
public static Inter function()
{
     return new Inter(){};
}

不知道解答的是否清楚,如果不清楚的话可以继续提问。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
帅气的冬瓜 发表于 2013-11-2 17:13
首先,要了解内部类的定义以及用法,其次要仔细想想return和void 的作用,最后再来看看这个程序。
  都 ...

请问我可以将你的回帖当成是你提供的帮助吗?你的答案和我的问题完全没有直接关系.不过你说的大道理是对的.还是谢谢你的热心了
回复 使用道具 举报
楼上的说的很棒啊,
09.static Inter function() 这个是方法,不是内部类
11.return new Inter() {...} 这个是上面方法的返回值
返回值本身才是内部类,而且是匿名内部类,
通俗一点的说法就是 new Inter()【 = new X implements Inter ()】 { @Override... }
中间那段被省略的就是所谓的匿名内部类,X就是这个内部类的名字(我自己起的)

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李新辉 于 2013-11-2 17:36 编辑

interface Inter
{
        void method();
}
class Test
{
          //补足代码,通过匿名内部
}
static Inter function()//这个名字是什么意思?为什么不用implements关键字呢?
                                //这里的Inter意思是function()这个函数返回了一个Inter类型的一个子类匿名对象
{
        return new Inter()//为什么要用上return呢?
                                   //返回值不是void,是Inter类型的子类匿名对象,当然要写return了

                                   //return和;之间看做为一个整体,即匿名对象
        {
                public void method()
               {
                        System.out.println("haha,it is easy");
               }
       };                //这个地方不是应该.method的吗?和上面那个return有关系吗?      
                          //    ";"   这个符号表示return语句结束  
}
class InnerClassTest
{
        public static void main(String[] args)
        {
                Test.function().method();//为什么上面的Inter function到这下面就没有Inter了呢?
                                                       //function()这个函数被成员修饰符static修饰,所以可用“类名.函数名”调用即Test.function()
                                                       //Test.function()返回了一个Inter的类型的子类对象,这个对象又调用了method()方法
        }
}
===========================================
return语句返回了一个Inter类型的子类匿名对象
这里的匿名对象把接口覆写了……





评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
air 中级黑马 2013-11-2 17:33:11
8#
doitforyou 发表于 2013-11-2 17:14
首先你要知道如何定义匿名内部类,你这个问题才可以解决。
你程序中存在疑问的代码中实际上可以化繁为简看 ...

看的不太清楚.可以就我提出问题的代码一行行的回答吗?
回复 使用道具 举报
你这个代码也够乱的了……
论坛发帖的时候,都用空格代码会比较好看
table制表位键识别不了
出来会比较乱……
回复 使用道具 举报
额,好吧,其实已经相当于都回答了。
比如第一个问题,那是一个方法,当然不存在继承或是实现了。
第二个问题,因为方法需要返回Inter类型的对象,所以肯定需要返回值,就有return关键字。
第三个问题,return后面跟的就是一个匿名内部类对象,它的格式就是这样的 new Inter(){这里会复写method方法}。

你可以类比于平时的方法来看:
public static String func()
{
    return "method";
}

Inter相当于String ,是一个返回类型,return后面的跟的是String对象,相当于你代码中的分号之前部分,这部分就是匿名内部类,
你继续看视频就会恍然大悟,注意要看的视频时匿名内部类,不是普通内部类,这两者差别还是挺大的。
而且7楼的解释相当详细,估计你应该彻底懂了。
回复 使用道具 举报
air 中级黑马 2013-11-2 17:59:51
11#
李新辉 发表于 2013-11-2 17:32
interface Inter
{
        void method();

想了好一阵子,其实,static Inter function()//这个名字里的Inter的意义和void,int,double的意思是一样的,是返回值类型的意思是吗?我没反应过来.没练习过,一下子没想到


//Test.function()返回了一个Inter的类型的子类对象,这个对象又调用了method()方法
然后这句话就已经很通顺了..其实那个return分号结束的地方视频里是上写着.method我才问的
回复 使用道具 举报
air 发表于 2013-11-2 17:59
想了好一阵子,其实,static Inter function()//这个名字里的Inter的意义和void,int,double的意思是一样的, ...

我看到第14天又从新看到第9天了
这个弯确实不好转……
慢慢就好了
代码还是要自己敲敲的    敲完  在看视频 自己哪里不对   
回复 使用道具 举报
air 中级黑马 2013-11-2 18:06:23
13#
doitforyou 发表于 2013-11-2 17:46
额,好吧,其实已经相当于都回答了。
比如第一个问题,那是一个方法,当然不存在继承或是实现了。
第二个问 ...

是啊.你回复的慢了.我刚想明白点了回复再刷新才看到你的回复,害我想的挺久的.你都回答出我想到的意思了.
谢谢你啊~你真热心
我就是被那个static Inter function()里的Inter给卡住了,其他都不是问题.没想到啊.
接口名字也可以作为返回值类型来引用的吗?
那无论我写个什么类类叫什么名字,那么我也定个方法,返回值就必须是这个类名的对象咯?
回复 使用道具 举报
air 中级黑马 2013-11-2 18:13:19
14#
李新辉 发表于 2013-11-2 18:05
我看到第14天又从新看到第9天了
这个弯确实不好转……
慢慢就好了

同是天涯沦落人啊~,咱两的进度差不多,估计会是童鞋.~~我也是视频里老师出了问题,我就暂停,然后自己做.可是做错了,看老师的答案感觉不理解才上论坛问的.
你还没回答我呢.static Inter function()//这里Inter是返回值类型吧?
接口名字也可以作为返回值类型来引用的吗?
那无论我写个什么类类叫什么名字,那么我也定个方法,返回值就必须是这个类名的对象咯?
回复 使用道具 举报
air 发表于 2013-11-2 18:06
是啊.你回复的慢了.我刚想明白点了回复再刷新才看到你的回复,害我想的挺久的.你都回答出我想到的意思了.
...

java语法中有基本数据类型和引用类型,引用类型就是指数组,接口,类等,
目前我没有遇到不可以作为返回类型的,接口名字是代表一个类型,下面的理解是对的,
只要你喜欢,你可以定义符合语法规则的类,随便起什么名字,但是你返回的对象一定要符合返回类型,否则无法通过编译。因为java是一种强类型语言。
回复 使用道具 举报
air 发表于 2013-11-2 18:13
同是天涯沦落人啊~,咱两的进度差不多,估计会是童鞋.~~我也是视频里老师出了问题,我就暂停,然后自己做.可 ...

类即类型
类是对对象的描述,即对象的类型描述
那么这个类的对象就是本类类型的啦……

接口也是类,是一种特殊的类型描述

苹果 a
苹果 b
苹果 c
就是我有三个苹果,分别命名为:a,b,c,
他们都是苹果类型的的对象名称

java里就是:
类名 a
类名 b
类名 c
a,b,c,就是这个类型的名称

类型就是标示他是哪一类型而已
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马