`
joshua_peng
  • 浏览: 3716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

内部类 Static Nested Class 和 Inner Class的不同

阅读更多

内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特性,只是为了找一个容身之处,所以需要放到一个类中而已,这么一点小事,你还要把它放到类内部的一个类中,过分了啊!提供内部类,不是为让你干这种事情,无聊,不让你干。我想可能是既然静态成员类似c语言的全局变量,而内部类通常是用于创建内部对象用的,所以,把“全局变量”放在内部类中就是毫无意义的事情,既然是毫无意义的事情,就应该被禁止),内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中,如下所示:
public class Outer
{
int out_x = 0;
public void method()
{
Inner1 inner1 = new Inner1();
public class Inner2 //在方法体内部定义的内部类
{
public method()
{
out_x = 3;
}
}
Inner2 inner2 = new Inner2();
}
 
public class Inner1 //在方法体外面定义的内部类
{
}
}
在方法体外面定义的内部类的访问类型可以是public,protecte,默认的,private等4种类型,这就好像类中定义的成员变量有4种访问类型一样,它们决定这个内部类的定义对其他类是否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象,代码如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();
 
在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final修饰符。
对于这些细节,只要在eclipse写代码试试,根据开发工具提示的各类错误信息就可以马上了解到。
 
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer
{
public void start()
{
new Thread(
new Runable(){
public void run(){};
}
).start();
}
}
cyf
最后,在方法外部定义的内部类前面可以加上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修饰符。
 
备注:首先根据你的印象说出你对内部类的总体方面的特点:例如,在两个地方可以定义,可以访问外部类的成员变量,不能定义静态成员,这是大的特点。然后再说一些细节方面的知识,例如,几种定义方式的语法区别,静态内部类,以及匿名内部类。

 

分享到:
评论

相关推荐

    java-嵌套类(inner class)-来自oracle官网

    1.Nested Class(嵌套类) 1.1.Nested class 1.2.Nested class的分类 1.3.Nested class的使用原因 2.Static Nested Classes 2.1.static nested class访问enclosing class(outer class)的成员 2.2.enclosing...

    JAVA程序员32问

    Java 面试题 经典 第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。

    abstract class和interface有什么区别?

    Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static) 的内部类,它可以不依赖于外部类实例被实例化。而通 常的内部类需要在外部类实例化后才能实例化。 25、JSP中动态...

    java基础知识

    3、Static Nested Class 和 Inner Class的不同 答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner ...

    java笔试题,java程序员常见的笔试

    3、Static Nested Class 和 Inner Class的不同 答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner ...

    Java程序员面试陷阱大全.doc

    Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)  Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用...

    java 语言中常见易错知识点

    3、Static Nested Class 和 Inner Class的不同 答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner ...

    java面试题大全-基础方面

    3、Static Nested Class 和 Inner Class的不同 答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner ...

    java面试宝典

    3、Static Nested Class 和 Inner Class的不同 答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++ 嵌套类最大的不同就在于 是否有指向外部的引用上。注: 静态内部类...

    java面试笔试题大汇总+很全面.txt

    一,谈谈final, finally, finalize的... 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。   第四,&和&&的区别。  这个问得很少。   第五,HashMap和Hashtable的区别。

    java整理试题

    第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 这个问得很少。 第五,HashMap和Hashtable的区别。

    java编程常见面试题目

    第一,谈谈final, ...第三,Static Nested Class 和 Inner Class的不同,  第四,&和&&的区别。  第五,HashMap和Hashtable的区别。   第六,Collection 和 Collections的区别。

    Java面试经典试题及答案.doc

    Java面试经典试题及答案 第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 ..................

    Java面试32问

    第三,static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。 第六,Collection 和 Collections的区别。 第七,什么...

    Java面试宝典2017.zip

    Static Nested Class 和 Inner Class的不同。 19 27、内部类可以引用它的包含类的成员吗?有没有什么限制? 20 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...

    关于java可能遇到的面试题

    final—修饰符 Anonymous Inner Class Static Nested Class 和 Inner Class的不同

    java程序员必知的

    第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。  Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类...

    变态JAVA程序员面试32问

    第三,StaticNestedClass和 InnerClass 的不同,说得越多越好(面试题有的很笼统) 。 第四,&和&&的区别。 第五,HashMap 和 Hashtable 的区别。 第六,Collection和 Collections的区别。 第七,什么时候用assert....

    Java程序员面试题及解答

     第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。  第四,&和&&的区别。  第五,HashMap和Hashtable的区别。  第六,Collection 和 Collections的区别。  第七,什么时候...

Global site tag (gtag.js) - Google Analytics