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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-13 22:53  /  1803 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 全海波 于 2012-8-4 09:42 编辑

为什内部类中不能用static修饰呢?我要的是原理。

9 个回复

正序浏览
答:

内部类中可以有static啊,

但是,如果内部类中有static成员的话,那么这个类就必须也是static的


结论:内部类中不能定义任何静态成员,如果定义了那么这个类也------必须是静态的
回复 使用道具 举报
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。
声明为static的方法有以下几条限制:
1它们仅能调用其他的static 方法。
2它们只能访问static数据。
3它们不能以任何方式引用this 或super

需要了解2个概念:内部类和静态修饰符static
1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。
2)静态都是用来修饰类的内部成员的。比如静态方法,静态成员变量,静态常量。它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。
这样静态内部类就可以理解了,因为这个类没有必要单独存放一个文件,它一般来说只被所在外部类使用。并且它可以直接被用 外部类名+内部类名 获得。

以下举例说明怎么使用:
Student类有个叫School的内部类(非静态)
Student stu = new Student();
stu.School sch = new stu.School();
sch就是School的一个对象。

假如School是内部静态类:
Student.School sch = new Student.School();

这是昨天晚上我在百度上面搜的,我觉得有点道理,你们评价看看。
回复 使用道具 举报
昨天晚上我也在想这个问题,嘿嘿,学习一下。
回复 使用道具 举报
内部类是外部类的成员,依附外部类存在,他可以用修饰成员变量的修饰符来修饰比如(public private protected final static)。而外部类不可以:外部类只能使用publi和default。这里有一点注意的容易混淆的是内部类和外部类的成员变量,虽然两者不同,但是却可以用相同的修饰符修饰。
  内部类的访问:
  1)外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问。(即使内部类是static的情况下也不可以)
  2)内部类作为外部类的成员,可以访问外部类的所有成员。(但是静态内部类只能访问外部类的静态成员)
  3)内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
  在一个方法中定义的内部类
  在方法中定义的内部类称为局部内部类。与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。其他用法和成员内部类相同。
  静态内部类其实已经脱离了外部类。在创建静态内部类对象时也不需要外部类对象的存在。其实质是一个放置在别的类内部的普通类。而关键字static也只是说明其在创建对象时不依赖于外部类对象的存在,并不是说这个类本身是静态的。
  静态内部类与前面所讲的两种非静态内部类的语法基本相同。区别主要是在内部类的声明前面要加上static 关键字。另外,静态内部类也不可以用private进行定义。因为用private修饰后其他类是不可能调用这个类了,而这个类也就没有存在的意义了。  
  静态内部类与非静态内部类的区别是本质上的。非静态内部类是外部类对象组成的一部分,主要是辅助外部类对象工作的,与外部类对象存在这对成员变量的共享关系。
回复 使用道具 举报
内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。   (1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。   (2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。   (3)、内部类声明成静态的,就不能随便的访问外部类的成员变量,仍然是只能访问外部类的静态成员变量
static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢?
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),例如:
未声明为static .
如果用了static修饰内部类,那么在外部就可以直接使用外部类.内部类.属性(方法)来访问内部类的成员或者方法了。但是外部类的私有属性就无法使用了。通俗点就是私家车变成了公共汽车
回复 使用道具 举报
内部类可以分为:成员内部类、静态内部类、匿名内部类、局部内部类。
1、成员内部类
里面只能定义非静态的变量和方法(非静态的也就是说不带关键字static 的变量);有外部类的引用:外部类名.this 引用;成员内部类里面不能定义静态内部类
2、静态内部类
里面定义静态的变量和方法、非静态的变量和方法,只能访问外部类静态的变量和方法,没有外部类的引用
3、匿名内部类
经常用来作为某个类的唯一子类或者某个接口的唯一实现类;如果要继承的父类只有有参的构建函数,那么就必须要用super关键字调用它有参数的构建函数,否则会报错! 匿名内部类不能用static和abstract修饰,不能包含静态成员。
4、局部内部类
在外部类方法体中定义的类叫局部内部类,局部内部类只能用默认修饰符和final修饰符修饰、abstract修饰符,不能用到Static,访问方法的局部变量时,方法的局部变量带final 才能被访问。
以上四类也可以分为静态内部类和非静态内部类(包括成员内部类、匿名内部类、局部内部类),总结得出:静态内部类中可以用Static,而非静态内部类中不能用Static。对于原理,我认为首先,这个是Java语言规范规定的内容。其次,对于非静态内部类,如果可以有静态成员,你可以想象一下如何去指向这个静态成员。非静态内部类是通过外部类的this指针指向的。那么对于非静态内部类的动态成员,可以通过两个this指针确定位置。但是如果允许静态成员会出现这样的情况:首先,静态成员是不能通过任何this指针的,但是为了确定这个成员,必须确定这个成员所在的类实例。但是这个实例必须通过一个this指针确定。这在语法以及处理上都会造成很大的麻烦。还有最主要的是因为静态成员是类在加载的时候就要分配内存空间的,你放在非静态内部类中,这个非静态内部类还没调用就给分配内存空间?这可能么?因此,非静态内部类中不能用Static。
注意:若非静态实名内部类(即成员内部类和局部内部类中)包含静态成员变量(即静态成员域),则该静态成员变量还需声明为final属性。
希望对你有帮助~~







评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上仁兄呀,你是答非所问呀,我要的是原因,不是他的执行顺序
回复 使用道具 举报
内部类在成员位置上的时候可以被static修饰,但是访问的外部类成员必须是静态的,
Static:当内部类中定义了静态的成员时,该内部类必须静态的,否则编译失败。
代码体现:
Class Outer
{
Static int num=4;
Static class Inner
当一个类要直接访问另一个类中的成员时。可以将这个类定义到另一类里面。
{
Static void show()
{
Sop("show run"+num);
}
Public void method()
{
Inner in=new Inner();
In.,show();
}
}
}
Class InnerClassDemo
{
Public static void main(String[] args)
{
//Outer out=new Outer();
                        //out.method();
                        //System.out.println("Hello World!");
                        //当访问一个外部类的内部类时,先由外部类对象再有内部类对象。
                        //Outer.Inner in=new Outer().new Inner();//要指明内部类所处的外部类
                        //in.show();

                        //内部类静态化,要调用的非静态的方法show();
                        //Outer.Inner in=new Outer.Inner();
                        //in.show();

                        //如果show方法也是静态的,要调用静态的方法show();
                        Outer.Inner.show();
}
}
回复 使用道具 举报
内部类中如果有静态,那么这个内部类也必须是静态。
想想在一个非静态内部类里有个静态成员会怎么样。一个随类的加载而加载,
一个只能被对象调用。不矛盾么。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马