内部类(1)
来源:互联网 发布:淘宝评价如何上传视频 编辑:程序博客网 时间:2024/06/11 03:42
内部类定义在一个外部类的内部
public class A{ class B{ B(){ System.out.println("Inner class B"); } }}
A为外部类,B为内部类
每个内部类都自动拥有一个指向外部类实例的引用,使用 外部类名.this
eg:在class B 中,可以使用A.this,表示指向外部类的引用。
创建一个普通内部类
使用 OuterClassName.new 创建一个普通内部类实例
public class C{ public static void main(String[] args){ A a = new A(); A.B b = a.new B(); //B b = new B() 错误,无法找到B的类型 }}ly@HP:~/TIJ4/exercise$ javac C.java ly@HP:~/TIJ4/exercise$ java C Inner class B
使用外部类实例方法创建一个内部类,然后返回内部类实例
public class Outer{ class Inner{ public Inner(){System.out.println("Outer.Inner");} } public Inner getInner(){ return new Inner(); } public static void main(String[] args){ Outer a = new Outer(); Inner b = a.getInner();//在外围类可以找到Inner类,因此不必声明为Outer.Inner }}ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java OuterOuter.Inner
Note:一个普通内部类(不添加static修饰符)的域和方法只能是实例类型,不能出现static的域和方法.
所以,想要创建一个普通内部类,必须创建一个外部类的声明
嵌套类(nested class)
声明为static的内部类就是嵌套类
public class Outer{ static class Inner{ public Inner(){ System.out.println("static Inner"); } } public static void main(String[] args){ Inner a = new Inner();//直接调用Inner类的构造器 }}ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer static Inner
如果在外部类外创建嵌套类
public class Test{ public static void main(String[] args){ Outer.Inner a = new Outer.Inner(); /*complier error: *Test.java:5: error: cannot find symbol * Outer.Inner a = Outer.new Inner(); * symbol: variable Outer * location: class Test * 1 error */ //Outer.Inner a = Outer.new Inner();//不能)将外部类名写在new前面,与普通内部类不一样 }}ly@HP:~/TIJ4/exercise$ javac Test.java ly@HP:~/TIJ4/exercise$ java Teststatic Inner
普通内部类(Inner class)和嵌套类(nested class)的区别
1.普通内部类不能包含static数据和方法,而嵌套类不仅可以包含实例数据和方法,也可以包含static数据和方法
public class Outer{ class Inner{ /*complier error *Outer.java:3: error: Illegal static declaration in inner class Outer.Inner * static int i1 = 0; * ^ * modifier 'static' is only allowed in constant variable declarations *1 error */ //static int i1 = 0; int i2 = 1; public Inner(){ System.out.println("i2="+i2); } } static class Nest{ static int k1 = 2; int k2 = 3; public Nest(){ System.out.println("k1="+k1+" k2="+k2); } } public static void main(String[] args){ Outer a = new Outer(); Inner b = a.new Inner(); Nest c = new Nest(); } }ly@HP:~/TIJ4/exercise$ javac Outer.java ly@HP:~/TIJ4/exercise$ java Outer i2=1k1=2 k2=3
2.普通内部类有指向外部类的实例的引用,而嵌套类没有(因为嵌套类的创建不需要外部类的实例)
0 0
- 内部类(1)
- (1)内部类小结
- 内部类---(静态内部类、成员内部类、匿名内部类、局部内部类)
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- 内部类(匿名内部类)
- java 内部类(成员内部类)
- 成员内部类(实例内部类)
- java 内部类(成员内部类)
- java内部类(局部内部类)
- java内部类(1):java内部类的创建以及对外提供的访问方式,匿名内部类详解
- Java备忘录(1)—内部类
- 1、匿名内部类
- 内部类(一)
- 内部类(未完成)
- 内部类(转载)
- 内部类(一)
- 内部类(二)
- 内部类(补充)
- 3月12日训练赛题解(大工软院出题)
- C# 多线程中的lock,Monitor.pulse(all)&wait
- Java反射获取内部类的实例
- 5.2. Publish-Subscribe Channel
- fzu 1515 Balloons in a Box 【枚举】
- 内部类(1)
- 每天一个 Linux 命令(18):locate 命令
- 某产品线成长日记(2015.10)
- Storm上的Nimbus、Supervisor以及Worker之间的关系
- 5.3. Dead Letter Channel
- 5.4. Guaranteed Delivery
- ACM程序设计题目 Problem Z-26
- 5.5. Message Bus
- 物联网之绿色出行