java java中静态内部类类有哪些特性

posts - 24,&
comments - 1,&
trackbacks - 0
[静态内部类]
类声明中包含“static”关键字的内部类。如以下示例代码:
public&class&InnerClass&{
&&&&private&static&String&nickName&=&"anan";
&&&&private&String&
&&&&private&int&
&&&&public&InnerClass(String&name,&int&age)
&&&&&&&&this.name&=&
&&&&&&&&this.age&=&
&&&&public&String&getName()
&&&&&&&&return&
&&&&public&void&setName(String&name)
&&&&&&&&this.name&=&&
&&&&public&int&getAge()
&&&&&&&&return&
&&&&public&void&setAge(int&age)
&&&&&&&&this.age&=&
&&&&public&static&class&Inner
&&&&&&&&private&String&heart&=&"zhaoli";
&&&&&&&&public&String&getHeart()
&&&&&&&&&&&&return&
&&&&&&&&public&void&setHeart(String&h)
&&&&&&&&&&&&this.heart&=&h;
&&&&&&&&public&void&print()
&&&&&&&&&&&&System.out.println(InnerClass.nickName);
&&&&&&&&&&&&System.out.println(getHeart());
public&class&InnerClassTest&{
&&&&public&static&void&main(String[]&args)
&&&&&&&&InnerClass.Inner&inner&=&new&InnerClass.Inner();
&&&&&&&&inner.print();
&&&&&&&&inner.setHeart("simple-simply");
&&&&&&&&inner.print();
测试输出为:
simple-simply
这里说明public 修饰的静态内部类其实跟外部类的使用并没有太大区别,以“OuterClass.InnerClass”的方式来引用某个如此修饰的静态内部类。
&静态成员类特性&
静态成员类可访问外部类的任一静态字段或静态方法
像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符
&静态成员类约束&
静态成员类不能与外部类重名
像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法
静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。
什么时候使用静态成员类
B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:
public&class&LinkedList&E&&extends&AbstractSequentialList&E&&
&&&…;
&&&private&static&class&Entry&E&&{
&&&&Entry&E&&
&&&&Entry&E&&
&&&&Entry(E&element,&Entry&E&&next,&Entry&E&&previous)&{
&&&&&&&&this.element&=&
&&&&&&&&this.next&=&
&&&&&&&&this.previous&=&
&&&&…;
& 显然,Entry用来表示LinkedList中的一个结点,只被LinkedList自身使用。
[非静态内部类]
一个静态成员类,若去掉“static”关键字,就成为成员类:
public&class&InnerClass&{
&&&&private&static&String&nickName&=&"anan";
&&&&private&String&
&&&&private&int&
&&&&public&InnerClass(String&name,&int&age)
&&&&&&&&this.name&=&
&&&&&&&&this.age&=&
&&&&public&String&getName()
&&&&&&&&return&
&&&&public&void&setName(String&name)
&&&&&&&&this.name&=&&
&&&&public&int&getAge()
&&&&&&&&return&
&&&&public&void&setAge(int&age)
&&&&&&&&this.age&=&
&&&&public&class&Inner
&&&&&&&&private&String&heart&=&"zhaoli";
&&&&&&&&public&String&getHeart()
&&&&&&&&&&&&return&
&&&&&&&&public&void&setHeart(String&h)
&&&&&&&&&&&&this.heart&=&h;
&&&&&&&&public&void&print()
&&&&&&&&&&&&System.out.println(InnerClass.nickName);
&&&&&&&&&&&&System.out.println(InnerClass.this.name);
&&&&&&&&&&&&System.out.println(InnerClass.this.age);
&&&&&&&&&&&&System.out.println(getHeart());
public&class&InnerClassTest&{
&&&&public&static&void&main(String[]&args)
&&&&&&&&InnerClass&outer&=&new&InnerClass("simply-simple",&<span style="color: #);
&&&&&&&&InnerClass.Inner&inner&=&outer.new&Inner();
&&&&&&&&inner.print();
测试输出为:
simply-simple
类似于外部类的实例函数,成员类有public/private/default权限修饰符
一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。
一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用&#8220;OuterClass.this&#8221;的形式。
指定内部类实例所属的外部类实例 内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外部类实例自然就是创建它的外部类实例方法对应的外部类实例。
另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
&成员类约束&
成员类不能与外部类重名
不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。
什么时候使用成员类
成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:
public&abstract&class&AbstractList&E&&extends&AbstractCollection&E&&implements&List&E&&{
&&&&private&class&Itr&implements&Iterator&E&&{
&&&&&&&&&&#8230;&#8230;&#8230;;
&&&&&public&Iterator&E&&iterator()&{
&&&&&&&&return&new&Itr();
&因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
试想,如果没有成员类机制,只有在AbastractList源码之外定义一个实现Iterator的类Itr,该类有一个AbstractList实例成员list,为了Itr能获取list的内部信息以便实现遍历,AbstractList必然要向Itr开放额外的访问接口。
阅读(...) 评论()Java 内部类与静态类
我的图书馆
Java 内部类与静态类
&Java 内部类与静态类我们一般不常用,开源框架经常用,有兴趣可以看看这篇,以下是我的一些总结,先了解一下,留着备用。
1:内部类拥有普通类的所有特性,也拥有类成员变量的特性
2:内部类可以访问其外部类的成员变量,属性,方法,其它内部类
1:只有内部类才能声明为static,也可以说是静态内部类
2:只有静态内部类才能拥有静态成员,普通内部类只能定义普通成员
3:静态类跟静态方法一样,只能访问其外部类的静态成员
4:如果在外部类的静态方法中访问内部类,这时候只能访问静态内部类
01/**02&* 外部类,不能声明为 static03&* 04&* @author zhanqi05&* 06&*/07public class OuterClass {08&09&&&&private int ab = 1;10&&&&private static int sab = 2;11&12&&&&/**13&&&&&* 普通内部类14&&&&&*/15&&&&public class NormalInnerClass {16&17&&&&&&&&// private static int age = 22;18&&&&&&&&private int age = 22; // 不能声明为static19&20&&&&&&&&public NormalInnerClass() {21&&&&&&&&&&&&// 可以访问外部类静态与非静态成员22&&&&&&&&&&&&System.out.println(ab);23&&&&&&&&&&&&System.out.println(sab);24&&&&&&&&}25&&&&}26&27&&&&/**28&&&&&* 静态内部类29&&&&&*/30&&&&public static class StaticInnerClass {31&&&&&&&&// 定义静态与非静态成员都是可以的32&&&&&&&&private static int age = 22;33&&&&&&&&private int age2 = 22;34&35&&&&&&&&private void echo() {36&&&&&&&&&&&&// System.out.println(ab);37&&&&&&&&&&&&System.out.println(sab);// 只能访问外部类的静态成员38&&&&&&&&}39&&&&}40}
内部类的实例化
1:访问内部类,必须使用:外部类.内部类,OutClass.InnerClass
2:普通内部类必须绑定在其外部类的实例上
3:静态内部类可以直接 new
01/**02&* 外部类访问内部类03&*/04public class OuterClass {05&06&&&&/**07&&&&&* 普通方法08&&&&&*/09&&&&public void method() {10&&&&&&&&StaticInnerClass sic = new StaticInnerClass();11&&&&&&&&NormalInnerClass nic = new NormalInnerClass();12&&&&}13&14&&&&/**15&&&&&* Main16&&&&&*/17&&&&public static void main(String[] args) {18&&&&&&&&// 在静态方法中,只能访问静态成员,静态内部类19&&&&&&&&// NormalInnerClass nic = new NormalInnerClass();20&&&&&&&&StaticInnerClass sic = new StaticInnerClass();21&&&&}22}23&24/**25&* 其它类访问内部类26&*/27class Test {28&&&&public static void main(String[] args) {29&&&&&&&&/**30&&&&&&&&&* 1:其它类访问内部类,必须使用:外部类.内部类,OutClass.InnerClass31&&&&&&&&&* 2:普通内部类必须绑定在其外部类的实例上32&&&&&&&&&* 3:静态内部类可以直接 new33&&&&&&&&&*/34&&&&&&&&OuterClass.StaticInnerClass sic = new OuterClass.StaticInnerClass();35&&&&&&&&// OuterClass.NormalInnerClass n = new OuterClass.NormalInnerClass();36&37&&&&&&&&OuterClass oc = new OuterClass();38&&&&&&&&OuterClass.NormalInnerClass nic = oc.new NormalInnerClass();39&&&&}40}
TA的最新馆藏
喜欢该文的人也喜欢658被浏览53278分享邀请回答1627 条评论分享收藏感谢收起164 条评论分享收藏感谢收起> 问题详情
内部类是在一个类内嵌套定义的类。其特点描述错误的是()A.只能在定义它的类或程序段中或表达式内
悬赏:0&答案豆
提问人:匿名网友
发布时间:
内部类是在一个类内嵌套定义的类。其特点描述错误的是 ()A.只能在定义它的类或程序段中或表达式内匿名使用,外部使用时必须给出类的全名B.可以使用它所在类的静态成员变量或实例成员变量,但不可以使用所在类中的局部变量C.可作为其他类的成员,而且可访问它所在类的成员D.除static内部类外,不能在类内声明static成员请帮忙给出正确答案和分析,谢谢!
为您推荐的考试题库
您可能感兴趣的试题
1下列说法不正确的是&&(&&)A.IOException必须被捕获或抛出B.java语言会自动初始化变量的值C.java语言不允许同时继承一个类并实现一个接口D.java语言会自动回收内存中的垃圾2用关键字 ______ 修饰的类不能被继承。&&(&&)A.publicB.friendly(缺省)C.finalD.无修饰关键字3switch语句&&(&&)A.都可以用if-else if结构实现B.都不可以用if-else if结构实现C.有的可以用if-else if结构实现D.大部分不可以用if-else if结构实现4Java虚拟机的执行过程有多个特点,下列哪个特点不属于JVM执行特点?&&(&&)A.多线程B.动态连接C.异常处理D.异步处理
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
找答案会员
享三项特权
找答案会员
享三项特权
找答案会员
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:[转载]Java内部类的特点
零、初始化外部类对象的同时也会运行运行内部类的默认构造函数,且先运行内部类构造函数,再运行外部类构造函数。
一、定义在一个类体内的另外一个类称之为内部类。
二、1、内部类可以直接或利用引用访问外部类的属性和方法,包括私有属性和方法(但静态内部类不能访问外部类的非静态成员变量和方法)。内部类所访问的外部属性的值由构造时的外部类对象决定。比如:1、OuterClass
OuterClass();&&&&&&&&&
OuterClass.InnerClass in = out.new InnerClass();
in访问的外部类属性就是对象out的属性。2、OuterClass.InnerClass in=new
OuterClass().new InnerClass();
和 InnerClass in = new InnerClass(); 及OuterClass.InnerClass in = new
OuterClass.InnerClass();
访问的外部类的属性就是默认的外部类构造函数后的外部类属性值。2、而外部类要访问内部类的成员,则只能通过引用的方式进行,可问内部类所有成员。
三、构造内部类对象的方法有:
1、内部类在自己所处的外部类的静态方法内构建对象或在另一个类里构造对象时应用如下形式:
(1)OuterClass out = new OuterClass();
OuterClass.InnerClass in = out.new InnerClass();
(2)OuterClass.InnerClass in=new OuterClass().new
InnerClass();
其中OuterClass是外部类,InnerClass是内部类。
2、内部类在它所在的外部类的非静态方法里或定义为外部类的成员变量时,则可用以下方式来构造对象:
InnerClass in = new InnerClass();
3、如果内部类为静态类,则可用如下形式来构造函数:
OuterClass.InnerClass in = new OuterClass.InnerClass();
无需再利用外部类的对象来来构造内部类对象,如果静态内部类需要在静态方法或其它类中构造对象就必须用上面的方式来初始化。
四、访问机制:
System.out.println(this.x);或System.out.println(x);//内部类访问内部类的成员变量或成员方法可用此方法。
System.out.println(OuterClass.this.x);//内部类访问外部类的同名变量时可用此方法,如果没有同名可用System.out.println(x);
五、内部类可以使用任意的范围限定:public/private/protected class
InnerClass,且严格按照这几种访问权限来控制内部类能使用的范围。普通类的范围限定只可以是public或者不加。
六、内部类的命名不允许与外部类 重名,内部类可以继承同级的内部类,也可继承其它类(除内部类和外部类)。
七、内部类可以定义为接口,并且可以定义另外一个类来实现它
八、内部类可以定义为抽象类,可以定义另外一个内部类继承它
九、内部类使用static修饰,自动升级为顶级类,外部类不可以用static修饰,用OuterClass.InnerClass
inner=new OuterClass.InnerClass();创建实例。内部类还可定义为final.
十、内部类可以再定义内部类(基本不用)如下所示:
class test2
class sunclass3
class sunclass4
public void test1()
System.out.println("");
public static void main(String arg[])
test2.sunclass3.sunclass4 t1=new test2().new sunclass3().new
sunclass4();
t1.test1();
十一、方法内的内部类:方法内的内部类不能加范围限定(protected public
private)方法内的内部类不能加static修饰符方法内的内部类只能在方法内构建其实例
方法内的内部类如果访问方法局部变量,则此局部变量必须使用final修饰
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 java静态内部类好处 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信