黑马程序员技术交流社区

标题: 内部类-接口-匿名内部类-问题 [打印本页]

作者: hacket    时间: 2013-6-6 17:10
标题: 内部类-接口-匿名内部类-问题
本帖最后由 hacket 于 2013-6-8 12:26 编辑
  1. class Outer
  2. {
  3.         //内部类
  4.         class InnerClass
  5.         {
  6.                 void show()
  7.                 {
  8.                         System.out.println("类InnerClass中的show()...");
  9.                 }
  10.         }
  11.         //内部接口
  12.         interface InnerInterface
  13.         {
  14.                 void show();
  15.         }

  16.         void show()
  17.         {        
  18.                 //方法中通过匿名实现方式调用
  19.                 new InnerInterface()
  20.                 {
  21.                         public void show()
  22.                         {
  23.                                 System.out.println("接口InnerClass中的show()...类Outer中show()中的InnerInterface的show()...");
  24.                         }
  25.                 }.show();
  26.         }

  27. }
  28. public class ClassInterface
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 Outer outer = new Outer();
  33.                 //outer.new InnerClass().show(); //方式1、外部类调用内部类中的方法show() ---成功
  34.                
  35.                 //outer.show(); //方式2、类Outer中通过匿名实现方式调用 ---成功

  36.                
  37.                 //方式3、外部类中通过匿名实现方式调用
  38.                 outer.new InnerInterface()
  39.                 {
  40.                         public void show()
  41.                         {
  42.                                 System.out.println("接口InnerClass中的show()...");
  43.                         }
  44.                 }.show();
  45.                 /*
  46.                         上面的这句报的错误:

  47.                         ClassInterface.java:40: 错误: 匿名类实现接口; 不能有限定符 - 对于新
  48.                 outer.new InnerInterface()
  49.                 1 个错误
  50.                 */
  51.         }
  52. }
复制代码
错误看代码中,第二种方式可以,但第三种方式报错了。。。

作者: xr782271574    时间: 2013-6-6 17:47
你的内部接口定义在类里面的?类里面不可以定义接口吧, outer.new InnerInterface()
                {
                        public void show()
                        {
                                System.out.println("接口InnerClass中的show()...");
                        }
                }.show();
这种方式是错的。
作者: hacket    时间: 2013-6-6 17:52
  1. void show()
  2.         {        
  3.                 //方法中通过匿名实现方式调用
  4.                 new InnerInterface()
  5.                 {
  6.                         public void show()
  7.                         {
  8.                                 System.out.println("接口InnerClass中的show()...类Outer中show()中的InnerInterface的show()...");
  9.                         }
  10.                 }.show();
  11.         }
复制代码
你看上面的代码,是可以正常运行的,这不就说明可以定义接口么。

作者: 黑马伍哲沂    时间: 2013-6-6 18:04
你这个应该是编译时的问题吧。

编译检查语法问题。  说明这种调用方式是错误的。   你说的接口能运行,说明接口定义在类中并没有问题。

但这种调用方式不可以。
作者: hacket    时间: 2013-6-6 18:08
黑马伍哲沂 发表于 2013-6-6 18:04
你这个应该是编译时的问题吧。

编译检查语法问题。  说明这种调用方式是错误的。   你说的接口能运行,说 ...

这不清楚,以前也没试过这种调用方式,只是把调用放到了另外一个类,就不行了。这很是奇妙。
作者: 黑马伍哲沂    时间: 2013-6-6 18:18
hacket 发表于 2013-6-6 18:08
这不清楚,以前也没试过这种调用方式,只是把调用放到了另外一个类,就不行了。这很是奇妙。 ...

好吧。  我特意在命令行下编译了。是这个错误。  这个叫编译时的错误。

编译时的错误叫语法错误。  虚拟机说你的是语法错误,你就别挣扎了。- -:lol  这是错误的方式。

123.jpg (11.3 KB, 下载次数: 0)

123.jpg

作者: hacket    时间: 2013-6-6 18:22
黑马伍哲沂 发表于 2013-6-6 18:18
好吧。  我特意在命令行下编译了。是这个错误。  这个叫编译时的错误。

编译时的错误叫语法错误。  虚拟 ...

{:2_33:}很是不符合情理,这只能先留着。这错误提示,知道有啥解决方案么。
作者: 黑马伍哲沂    时间: 2013-6-6 18:27
hacket 发表于 2013-6-6 18:22
很是不符合情理,这只能先留着。这错误提示,知道有啥解决方案么。 ...
  1. package com.itheima;

  2. class Outer
  3. {
  4.         // 内部类
  5.         class InnerClass
  6.         {
  7.                 void show()
  8.                 {
  9.                         System.out.println("类InnerClass中的show()...");
  10.                 }
  11.         }
  12.         // 内部接口
  13.         interface InnerInterface
  14.         {
  15.                 void show();
  16.         }
  17.         public void show()
  18.         {
  19.                 // 方法中通过匿名实现方式调用
  20.                 new InnerInterface()
  21.                 {
  22.                         public void show()
  23.                         {
  24.                                 System.out
  25.                                         .println("接口InnerClass中的show()...类Outer中show()中的InnerInterface的show()...");
  26.                         }
  27.                 }.show();
  28.         }
  29. }

  30. public class InnerInterTest
  31. {
  32.         public static void main(String[] args)
  33.         {
  34.                 new Outer.InnerInterface()
  35.                 {
  36.                         @Override public void show()
  37.                         {
  38.                                 // TODO Auto-generated method stub
  39.                                 System.out.println("覆盖没。。。。。");// 答:覆盖了!- -。
  40.                         }
  41.                 }.show();
  42.         }
  43. }
复制代码

作者: hacket    时间: 2013-6-6 18:49
黑马伍哲沂 发表于 2013-6-6 18:27

{:3_47:}new Outer.InnerInterface()还可以这样点呀。。。
作者: 黑马伍哲沂    时间: 2013-6-6 18:53
hacket 发表于 2013-6-6 18:49
new Outer.InnerInterface()还可以这样点呀。。。

- -。  我也是才想到的。
作者: hacket    时间: 2013-6-6 18:54
黑马伍哲沂 发表于 2013-6-6 18:53
- -。  我也是才想到的。

{:3_47:}解释下啥原因。。。。
作者: 黑马伍哲沂    时间: 2013-6-6 18:57
hacket 发表于 2013-6-6 18:54
解释下啥原因。。。。

没法解释 。。这个  没原因。  或者有原因我不知道。

毕老师将内部类的时候,讲过外部创建内部类的对象。 不就是这么写的么。  我就直接把那套路用过来,
发现是可以的。  老师也就说,别纠结写法,就是个写法。没原因。(如果我记忆没混淆的话 ,应该是这样的)
作者: hacket    时间: 2013-6-6 19:00
黑马伍哲沂 发表于 2013-6-6 18:57
没法解释 。。这个  没原因。  或者有原因我不知道。

毕老师将内部类的时候,讲过外部创建内部类的对象 ...

{:3_50:}(⊙o⊙)…好吧。表示看了一年了,忘得差不多了。这得回头再看看。。。
作者: 黑马伍哲沂    时间: 2013-6-6 19:01
hacket 发表于 2013-6-6 19:00
(⊙o⊙)…好吧。表示看了一年了,忘得差不多了。这得回头再看看。。。 ...

哈哈 复习复习 是好事。- -  我也要复习了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2