内部类有成员内部类,局部内部类,匿名内部类,静态内部类。
1,成员内部类package innerClass;
public class InnerClassTest { String s1="我是外部成员变量。。"; public static String s2="我是外部静态变量.."; class Inner{ void innerTest(){ String s1="我是内部成员变量"; String s2="我是内部成员变量"; System.out.println(s1 +" "+ s2); System.out.println(InnerClassTest.this.s1); } }public static void main(String[] args) { InnerClassTest out = new InnerClassTest(); Inner inner = out.new Inner(); inner.innerTest(); } }
输出:
我是内部成员变量
我是内部成员变量
我是外部成员变量。。
a,内部类的变量和方法会隐藏外部类的成员变量和方法,可以通过外部类的对象调用外部类变量和方法。
b,内部类实例化通过外部类的对象来实现。
2,局部内部类,定义在方法内部或一个作用域里面的类
package innerClass; public class PartInnerClass { public String getSomething(){ class Inner{ String s = "我是内部类的成员变量"; } return new Inner().s; } public static void main(String[] args) { System.out.println(new partInnerClass().getSomething()); } }
输出:
我是内部类的成员变量
3,匿名内部类,只要是一个抽象类或者接口,那么他的方法都可以在子类中实现,最常用的是多线程的实现,如:
package innerClass; public class AnonymousInnerClass { public static void main(String[] args) { Runnable r = new Runnable(){ public void run(){ System.out.println("I'm anonymous class."); } }; Thread t = new Thread(r); t.start(); } }
4,静态内部类,和成员内部类有两个区别:a,实例化不依赖外部类,b,不能直接访问外部类的非静态变量和方法
package innerClass; public class StaticInnerClass { int i=1; static int j=2; static class InnerClass{ void test(){ //静态内部类不能访问外部类的非静态方法和变量 System.out.println(new StaticInnerClass().i); System.out.println(j); } } public static void main(String[] args) { //不需要依赖外部类 InnerClass inner = new InnerClass(); inner.test(); } }