内部类定义在一个外部类的内部
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 Outer
Outer.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 Test
static 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=1
k1=2 k2=3
2.普通内部类有指向外部类的实例的引用,而嵌套类没有(因为嵌套类的创建不需要外部类的实例)