写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:https://www.cnblogs.com/acm-icpcer/p/8575721.html
Java的四种内部类包括如下:
1、成员内部类
2、静态内部类
3、局部内部类
4、匿名内部类
现一一说明:
1、成员内部类
简单的讲就是:
(1)没有使用static修饰的内部类;
(2)在成员内部类中不允许出现静态变量和静态方法的声明。static只能用在静态常量的声明上。
(3)成员内部类中可以访问外部类中所有的成员(变量,方法),包含私有成员,如果在内部类中定义有和外部类同名的实例变量,访问方法如下:
OuterClass.this.outerMember;
(4)构建内部类的实例,要求必须外部类的实例先存在。
sample code:
class MemberOuter{ private String s1 = "Outer InstanceMar"; private String s2 = "OuterStatic s2"; public void setS1(String s1) { this.s1 = s1; new MemberOuter().new MemberInner(); this.new MemberInner(); //此时MemberOuter已经实例化完成,所以可以使用this new MemberInner().test2(); } public static void test2 (){ new MemberOuter().new MemberInner(); /* this.new MemberInner(); 此时MemberOuter没有实例化完成,所以不可以使用this static 是在MemberOuter构造器前使用,所以此时this不能使用 */ } class MemberInner{ String s1= "Inner instanceMae "; static final String s4 = "static final MemberInner"; void test2(){ System.out.println(" s1 =" + s1); System.out.println(" Outter MemberOuter.this.s1 =" + MemberOuter.this.s1); System.out.println("s2 = "+s2); } } } public class MemberInnerTest { public static void main (String args []){ /* MemberOuter.MemberInner mm = new MemberOuter().new MemberInner(); mm.test2();*/ MemberOuter mo = new MemberOuter(); mo.setS1(""); } }
2、静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
sample code:
public class StaticInnerTest { public static void main(String[] args) { StaticOuter.StaticInner si = new StaticOuter.StaticInner(); si.test2(); //StaticOuter.StaticInner.test(); System.out.println("si.b = "+si.b); System.out.println("si.a = "+si.a); // System.out.println("StaticOuter.b = "+StaticOuter.b); 这里报错 } } class StaticOuter { private int a = 100; private static int b = 150; public static void test(){ System.out.println("Outer static test ..."); } public void test2(){ System.out.println("Outer instabce test ..."); } static class StaticInner { public int a = 200; static int b =300; public static void test(){ System.out.println("Inner static test ..."); } public void test2(){ System.out.println("Inner instance test ..."); StaticOuter.test(); new StaticOuter().test2(); System.out.println("StaticOuter.b = "+StaticOuter.b); } } }
3、局部内部类
简单的说就是:
(1)定义在方法体,甚至比方法体更小的代码块中
(2)类比局部变量。
(3)局部内部类是所有内部类中最少使用的一种形式。
(4)局部内部类可以访问的外部类的成员根据所在方法体不同。
(5)在静态方法中:可以访问外部类中所有静态成员,包含私有;
在实例方法中:可以访问外部类中所有的成员,包含私有;
局部内部类可以访问所在方法中定义的局部变量,但是要求局部变量必须使用final修饰。
sample code:
public class LocalInnerTest { private int a = 1; private static int b = 2; public void test() { final int c = 3; class LocalInner { public void add1() { System.out.println("a= " + a); System.out.println("b= " + b); System.out.println("c= " + c); } } new LocalInner().add1(); } static public void test2() { final int d = 5; class LocalInner2 { public void add1() { // System.out.println("a= " + a); System.out.println("b= " + b); System.out.println("c= " + d); } } new LocalInner2().add1(); } public static void main(String args[]) { // LocalInnerTest() lc = new LocalInnerTest(); new LocalInnerTest().test2(); new LocalInnerTest().test(); } }
4、匿名内部类
(1)没有名字的局部内部类。
(2)没有class,interface,implements,extends关键字
(3)没有构造器。
(4)一般隐式的继承某一个父类或者实现某一个接口
(5)为了方便和速成而写的类,一般只使用一次,复用性不高。
sample code:
interface innerclass{ public void print(); } public class Main{ public static void main(String[] args) { innerclass A = new innerclass() { public void print() { System.out.println("匿名内部类1"); } }; A.print(); innerclass B = new innerclass() { public void print() { System.out.println("匿名内部类2"); } }; B.print(); A.print(); } }
tz@COI HZAU
2018/3/15