开启左侧

什么是内部类?Static Nested Class 和 Inner Class的不同。

[复制链接]
红筹 发表于 2011-8-26 19:35:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特性,只是为了找一个容身之处,所以需要放到一个类中而已,既然静态成员类似c语言的全局变量,而内部类通常是用于创建内部对象用的,所以,把“全局变量”放在内部类中就是毫无意义的事情,既然是毫无意义的事情,就应该被禁止),内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中,如下所示:
public class Outer
{
          int out_x  = 0;
          public void method()
                  {
                   Inner1inner1 = new Inner1();
                   publicclass Inner2   //在方法体内部定义的内部类
                   {
                            public method()
                            {
                                     out_x= 3;
                            }
                   }
                   Inner2inner2 = new Inner2();
          }
          public class Inner1   //在方法体外面定义的内部类
          {
          }
         
}
在方法体外面定义的内部类的访问类型可以是public,protecte,默认的,private等4种类型,这就好像类中定义的成员变量有4种访问类型一样,它们决定这个内部类的定义对其他类是否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象,代码如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.newInnner1();
在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final修饰符。
对于这些细节,只要在eclipse写代码试试,根据开发工具提示的各类错误信息就可以马上了解到。
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer
{
          public void start()
          {
                   newThread(
new Runable(){
                                     publicvoid run(){};
}
).start();
          }
}
最后,在方法外部定义的内部类前面可以加上static关键字,从而成为Static Nested Class,它不再具有内部类的特性,所有,从狭义上讲,它不是内部类。Static Nested Class与普通类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以定义成public、protected、默认的、private等多种类型,而普通类只能定义成public和默认的这两种类型。在外面引用Static Nested Class类的名称为“外部类名.内部类名”。在外面不需要创建外部类的实例对象,就可以直接创建Static Nested Class,例如,假设Inner是定义在Outer类中的Static Nested Class,那么可以使用如下语句创建Inner类:
Outer.Inner inner = new Outer.Inner();
由于static Nested Class不依赖于外部类的实例对象,所以,static Nested Class能访问外部类的非static成员变量。当在外部类中访问Static Nested Class时,可以直接使用Static Nested Class的名字,而不需要加上外部类的名字了,在Static Nested Class中也可以直接引用外部类的static的成员变量,不需要加上外部类的名字。
在静态方法中定义的内部类也是Static Nested Class,这时候不能在类前面加static关键字,静态方法中的Static Nested Class与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的static的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加final修饰符。
备注:首先根据你的印象说出你对内部类的总体方面的特点:例如,在两个地方可以定义,可以访问外部类的成员变量,不能定义静态成员,这是大的特点。然后再说一些细节方面的知识,例如,几种定义方式的语法区别,静态内部类,以及匿名内部类。

做好自己!

精彩评论8

正序浏览
godfrey 发表于 2011-8-28 16:16:36 | 显示全部楼层
看不懂 呜呜呜

点评

慢慢来,会懂得。  详情 回复 发表于 2011-8-30 11:29
欢迎大家多发帖,参与讨论,增进彼此了解。
红筹 发表于 2011-8-30 11:29:27 | 显示全部楼层
godfrey 发表于 2011-8-28 16:16
看不懂 呜呜呜

慢慢来,会懂得。

点评

佟老师 你教我呗  详情 回复 发表于 2011-8-30 13:44
做好自己!
 楼主| godfrey 发表于 2011-8-30 13:44:07 | 显示全部楼层
红筹 发表于 2011-8-30 11:29
慢慢来,会懂得。

佟老师 你教我呗

点评

哈哈哈,客气了,这个东西啊,我也是半调子。THINK IN JAVA 你可以看看这本书,如果对JAVA 基础感兴趣的话。  详情 回复 发表于 2011-8-30 14:40
红筹 发表于 2011-8-30 14:40:22 | 显示全部楼层
godfrey 发表于 2011-8-30 13:44
佟老师 你教我呗

哈哈哈,客气了,这个东西啊,我也是半调子。THINK IN JAVA 你可以看看这本书,如果对JAVA 基础感兴趣的话。

点评

龙大叔 讨厌你哦 哈哈  详情 回复 发表于 2011-8-30 18:06
大伟哥 谦虚了 你很强的。。。  发表于 2011-8-30 17:30
做好自己!
 楼主| godfrey 发表于 2011-8-30 18:06:24 | 显示全部楼层
红筹 发表于 2011-8-30 14:40
哈哈哈,客气了,这个东西啊,我也是半调子。THINK IN JAVA 你可以看看这本书,如果对JAVA 基础感兴趣的话 ...

龙大叔  讨厌你哦 哈哈

点评

就那么个人,龙哥他自己很低调的。。。  详情 回复 发表于 2011-8-31 15:02
红筹 发表于 2011-8-31 15:02:41 | 显示全部楼层
godfrey 发表于 2011-8-30 18:06
龙大叔  讨厌你哦 哈哈

就那么个人,龙哥他自己很低调的。。。

点评

他让我们叫他大叔诶 你说说 啧啧啧 他就是我心中的大叔了  详情 回复 发表于 2011-8-31 16:49
做好自己!
 楼主| godfrey 发表于 2011-8-31 16:49:30 | 显示全部楼层
红筹 发表于 2011-8-31 15:02
就那么个人,龙哥他自己很低调的。。。

他让我们叫他大叔诶  你说说 啧啧啧  他就是我心中的大叔了
红筹 发表于 2011-8-31 17:51:18 | 显示全部楼层
文中说“在方法内部定义的内部类前面不能有访问类型修饰符”(代码下第一行),而代码的第五行“public class Inner2   //在方法体内部定义的内部类”(不含大括号)中又有public 修饰,这里是不是矛盾呢?希望对此熟悉的高手指教一二?

点评

文字叙述是正确的!  发表于 2012-8-23 18:20
做好自己!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


0关注

4粉丝

13帖子

推荐阅读更多+
会员达人更多+
广告位

最新信息

更多+

关注我们:教育技术人

官方微信

官方微博

教育技术热线:

13955453231

学教育技术,上教育技术论坛!

教育技术论坛征稿范围:教育技术应用案例、教程文章、优秀作品等。

Email:sf@etthink.com

Copyright   ©2007-2026  应用思考-教育技术论坛  Powered by©Discuz!  技术支持:且行资源    ( 皖ICP备10014945号-4 )