内部类有静态内部类,静态内部类,匿名内部类,局部内部类
(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(); } }
原文地址:https://www.cnblogs.com/jchen104/p/10204408.html
时间: 2024-10-10 02:29:41