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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 禾呈 中级黑马   /  2013-7-9 20:54  /  2007 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-10 22:37 编辑

内部类的一个方法为静态的,那么内部类为啥也要是静态的,原理是啥啊?

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

5 个回复

正序浏览
因为访问静态方法是不需要对象的 如果访问内部类的内部方法是静态就会出现冲突
回复 使用道具 举报
      定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性(1)创建实例
   OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new,内部类
   AAA.StaticInner in = new AAA.StaticInner();//注意是外部类本身,静态内部类
(2)内部类中的this
   内部类中的this与其他类一样是指的本身。创建内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件,可理解为内部类链接到外部类。 用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用,于是,可以通过这个引用来访问外围类的成员。
(3)外部类访问内部类
   内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:
       System.out.println("Print in inner Outer.index=" + pouter.this.index);
       System.out.println("Print in inner Inner.index=" + this.index);
(4)内部类向上转型
   内部类也可以和普通类一样拥有向上转型的特性。将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。如果内部类是private的,只可以被它的外部类问,从而完全隐藏实现的细节。
(5)方法内的类
   方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。
(6)静态内部类
   定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。
通常称为嵌套类,当内部类是static时,意味着:
   [1]要创建嵌套类的对象,并不需要其外围类的对象;
   [2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);
   嵌套类与普通的内部类还有一个区别:普通内部类的字段的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这个类中定义静态的成员变量与成员方法。
   另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于该类的对象,更不属于其他外部类的对象。
(7)内部类标识符
   每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。
(8)为何要用内部类?
   1.   内部类一般只为其外部类使用;
   2.   内部类提供了某种进入外部类的窗户;
   3.   也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
静态方法不用实例化就可以调用,而内部类也算是外部类的成员,所以非静态成员不能调用静态方法,可是既然内部类方法是静态的,所以就一定是可以直接调用的,所以内部类也要定义成静态的
回复 使用道具 举报
如果内部类定义在了外不类的成员变量的位置上,并且调用内部类的成员函数是静态,那个这个内部类一定的要用static修饰,因为静态的成员函数不能调用非静态成员函数或者成员变量。
如果内部类不用static修饰的话,除非把内部类定义在调用他的函数里面。
回复 使用道具 举报
我觉得吧,这个类里面成员是静态的,那么这个成员应该是内部类没有实例化就加载进内存了。如果这个类都没有加载进内存,里面的成员就加载进内存了不太合适。所以给内部类定义成静态的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马