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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯宪博 中级黑马   /  2012-7-28 10:01  /  1897 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近见一个哥们写的程序里面出现了在一个类的方法中定义内部类
心中不禁有几个疑问
第一
内部类的出现就就是为了在描述事物的时候,描述相应的所属于该类事物的事物
例如
class 人
{
       class 心脏
       {
       }
}
但是如果在方法内定义内部类的话,那有什么意义呢
如果有意义,什么情况下才有意呢

第二
如果把内部类定义在方法内
怎么实例化该类呢
有几种方法实例化
怎么访问外部类和普通内部类有区别吗?
希望大神们指点一二。。。
谢谢。。。

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
本帖最后由 杜佳瑞 于 2012-7-28 12:31 编辑

第一个问题,定义局部内部类我觉得就是为了将类封装起来,外部类只有调用这个类所在的方法才能实例化该类,或是调用这个类里面的方法。
第二个问题,在这个方法里面实例化:new 内部类名().内部类方法名(),但是这句代码一定要放到这个类的后面。new 外部类名().外部类方法()来调用这个局部类。
局部内部类可以直接访问外部类,因为有外部类的引用。与普通内部类的主要区别就是不能用类成员修饰符修饰。
回复 使用道具 举报
1.当你希望在方法中实现较为复杂的功能,但又不希望其为外部访问时,可以在方法中定义局部内部类。
2.局部内部类仅在方法内部有效,无法在该方法外部使用。
3.局部内部类的实例化,我想可以分为在在静态方法中的内部类和在非静态方法中的内部类两种情况分析。
希望对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 芦曦 于 2012-7-28 17:29 编辑

[code]class Outer
{
        void method(final int a)
        {
                final int y = 4;
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                        }
                }
                new Inner().function();//实例化该类。        
        }
}
内部类定义在局部时,
1,不可以被成员修饰符修饰
2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。
内部类定义在成员位置上时才能被私有或者是静态修饰。
这就是内部类被定义在成员位置和定义在局部的区别。

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. interface InterImpl{
  2.         public abstract void play();
  3. }
  4. public class InterClass {
  5.         public static void main(String[] args) {
  6.                 InterImpl ipl = getInterImpl();
  7.         }
  8.        
  9.         public static InterImpl getInterImpl()
  10.         {
  11.                 return new InterImpl(){

  12.                         @Override
  13.                         public void play() {
  14.                                 // TODO Auto-generated method stub
  15.                                 System.out.println("hello");
  16.                         }
  17.                        
  18.                 };
  19.         }
  20. }
  21. 应该一般都这么用,我见源代码好多类似的,局部内部类需要隐藏在方法中,然后通过这个方法获得这个内部类的对象。还有如果你总结出了更好的例子,记得告诉我哦,我也想知道
复制代码
回复 使用道具 举报
哥们。我估计就是你说的那个哥们。。
毕老师说过,内部类可以定义在类的任意地方。
还有内部类不一定是“属于”该类事物的事物,我觉得跟该事物相关的就可以。
例如,在定义人这个类的时候,定义了开车这个方法,这是才需要定义车这个类。因为车不是属于人固有属性。对于开车这个方法,定义车这个类才有意义,那么就把车这个类定义在开车方法中。
对于第二个问题,我专门实验了下,好像只能在方法内部实例话,然后外部类再调用这个方法。
  1.         public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.                 new Outer().method();
  4.         }

  5. }
  6. class Outer
  7. {
  8.         int x=3;
  9.         void method()
  10.         {
  11.                 final int y=4;//为什么必须要final你还帮我解答过。
  12.                 class Inner
  13.                 {
  14.                         void funnction()
  15.                         {
  16.                                 System.out.println(x);
  17.                                 System.out.println(y);
  18.                         }
  19.                 }
  20.                 new Inner().funnction();
  21.         }
  22. }
复制代码
回复 使用道具 举报
黑马王冬冬 发表于 2012-7-28 15:53
1.当你希望在方法中实现较为复杂的功能,但又不希望其为外部访问时,可以在方法中定义局部内部类。
2.局部 ...

貌似是那么回事,谢谢您的回答。。。
回复 使用道具 举报
芦曦 发表于 2012-7-28 17:25
[code]class Outer
{
        void method(final int a)

说的很对,谢谢您的回答。。。
回复 使用道具 举报
吴立杰 发表于 2012-7-28 21:01

对,我也看到好多这种类似的代码,谢谢您的回答。。。
回复 使用道具 举报
左建飞 发表于 2012-7-28 22:22
哥们。我估计就是你说的那个哥们。。
毕老师说过,内部类可以定义在类的任意地方。
还有内部类不一定是“属 ...

哈哈,被你发现了,这位童鞋回答的很贴切,而且真正相对于我的问题给予回答。
但是,假若用面向对象的思想来思考这个问题,难道因为我会开车就自己造出一辆车来开吗?
但是你这想法使我想到了,“造车”这个想法。假若一个人会造车,那么造车这个方法里出现了车的内部类就靠谱的多了,实在是谢谢你啊,跪求管理员为这位童鞋加分。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马