内部类有静态内部类,静态内部类,匿名内部类,局部内部类
(1)非静态内部类
直接在类的内部定义的类就是非静态内部类,如下
public class Test {
public static void main(String[] args) {
Outer.Inner c1=new Outer().new Inner();
c1.Print();
}
}
class Outer{
private int temp=10;
class Inner{
private int temp=100;
public void Print() {
int temp=1000;
System.out.println("外部类成员变量"+Outer.this.temp);
System.out.println("内部类成员变量"+this.temp);
System.out.println("局部变量"+temp);
}
}
}
外部类成员变量10
内部类成员变量100
局部变量1000
我们可以看出
- 内部类对象的创建是建立在外部类对象的基础上的,先有了外部类对象才能有内部类对象
- 内部对象基于外部对象,内部对象1存在时外部对象一定存在,所以可以直接访问外部类成员,但反之不行,应为外部对象存在时不保证内部类也存在
- 非静态内部类不能存在静态的方法,属性和初始化块
- 外部类的静态方法和静态代码块不能访问非静态内部类
(2)静态内部类
带有static的内部类
public class Test {
public static void main(String[] args) {
Outer.Inner c1=new Outer.Inner();
c1.Print();
}
}
class Outer{
private int temp=10;
static class Inner{
private int temp=100;
public void Print() {
int temp=1000;
System.out.println(this.temp);
System.out.println(temp);
}
}
}
静态内部类有以下特征
- 静态内部类对象的创建不依赖于外部类对象
- 根据上面的特点,静态内部类的实例方法不能直接访问外部类的实例方法
- 静态内部类被看做是外部类的一个静态成员,所以外部类的静态方法可以通过“静态内部类.名字”的方式访问静态内部类的静态成员,通过new静态内部类访问静态内部类的实例
(3)匿名内部类
在只用一次的情况下使用匿名内部类,用完就丢弃。主要作用比如,有接口AA,现在想调用实现接口AA的方法
就必须有实现接口的实现类,比如BB,加入这个类只是用一次,我们可以使用匿名内部类来实现
public class Test {
public static void T(AA a) {
a.aa();
}
public static void main(String[] args) {
Test.T(new AA(){
@Override
public void aa() {
// TODO Auto-generated method stub
System.out.println("匿名内部类");
}
});
}
}
interface AA {
void aa();
}
在上面的代码中,我们在方法调用时才去new一个AA的实现类
(4)局部内部类
方法内部定义的内部类,作用域仅限于方法内部
public class Test {
public void show() {
class Inner{
public void run() {
System.out.println("局部内部类");
}
}
new Inner().run();
}
public static void main(String[] args) {
new Test().show();
}
}