标签:
内部类就是在一个类中再定义一个类,内部类可以起到包装隐藏的作用,不允许同一包中的其他类来访问该类,内部类的方法可以访问所以外部类的数据。Think in Java中:每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个接口的实现,对内部类是没有影响的。
【1】成员内部类
【2】静态内部类
【3】局部内部类
【4】匿名内部类
成员内部类
成员内部类也是最为普通的内部类,他是外部类的一个成员,所以可以无限制的访问外部类中是所以变量和方法,但是外部类访问内部类必须通过内部类的实例也就是对象才能访问。成员内部类不能访问任何的static变量和方法。
<span style="font-size:18px;">package OneWeek; public class OrdOuter { private String name = "zhangsan"; private int age = 999; private int score = 10000; public String getNameAge(){ return "姓名:"+this.name+" 年龄:"+this.age; } public class Inner{ private int score = 100; public void test(){ System.out.println("内部类访问外部类的name:"+name); System.out.println("内部类访问外部类的age:"+age); System.out.println("访问内部类的score:"+score); System.out.println("访问外部类的score:"+OrdOuter.this.score); } } public static void main(String args[]){ OrdOuter out = new OrdOuter(); Inner in = out.new Inner(); System.out.println(out.getNameAge()); in.test(); } }</span>
静态内部类
前面提到static可以修饰成员变量、方法、代码块,他还可以修饰内部类,我们称之为静态内部类。静态内部类和普通的成员内部类是不同的,普通的成员内部类在编译之后会隐含保存着一个指向外部类的引用,而静态内部类是没有的,也就是说他的创建不需要依赖外部类,他不能使用任何外部类中的非静态变量和方法。
<span style="font-size:18px;">package OneWeek; public class StaOuter { private static String name = "zhangsan"; private static int age = 999; private static int score = 10000; public static String getNameAge(){ return "姓名:"+name+" 年龄:"+age; } public static class Inner{ private static int score = 100; public void test(){ System.out.println("内部类访问外部类的name:"+name); System.out.println("内部类访问内部类的score:"+Inner.score);//访问相同的变量时要加类名 System.out.println("内部类访问外部类的score:"+StaOuter.score); } } public static void main(String args[]){ Inner in = new Inner(); //System.out.println(in.getNameAge());//不能直接访问外部类中的静态方法 in.test(); } }</span>
局部内部类
局部内部类也叫方法内部类,其实就是将内部类定义在方法之中,限制了其有效范围,方法内部类只在方法的内部可见,也就是只能再该方法中使用。
<span style="font-size:18px;">package OneWeek; public class MetOuter { private String name = "张三"; private int age = 666; public String getNameAge(){ return "姓名:"+name+" 年龄:"+age; } public void show(){ class Inner{ private String name = "李四"; private int age = 999; public String getNameAge(){ return "姓名:"+name+" 年龄:"+age; } } Inner in = new Inner();//只能在该方法中调用该类 System.out.println(in.getNameAge()); } public static void main(String args[]){ MetOuter out = new MetOuter(); out.show();// 调用的也是内部类中的变量 } }</span>
匿名内部类
匿名内部类必须继承一个父类或者实现一个接口,同时其没有class关键字,是通过new来生成一个对象的引用。匿名类中不能定义构造函数,匿名类中不能有static变量和方法,匿名内部类不能是抽象的,他必须实现继承的类或者是实现接口的所有抽象方法。
<span style="font-size:18px;">package OneWeek; public class OutClass { public InnerClass1 getInnerClass(final int num){//外部类中的方法 return new InnerClass1(){//匿名内部类的创建 int n = num*6; public int getNumber(){//实现抽象类中的方法,或者是接口中的方法 return n; } }; } abstract class InnerClass1{//需要实现的抽象类或者接口 abstract int getNumber(); } public static void main(String args[]){ OutClass out = new OutClass(); InnerClass1 inner = out.getInnerClass(2); //直接调用方法 System.out.println(inner.getNumber()); } }</span>
我们给匿名内部类传递的参数也是final类型,其目的是保证参数的一致性,内部类的属性和外部类方法的参数时不相同的,外部看起来一样但却是可以独立变换的,如上边例子中的fianl int num,外部类方法中的参数num传递给了内部类中的n,为了保证这两个的一致性,必须使用final。
标签:
原文地址:http://blog.csdn.net/jinhuoxingkong/article/details/51355992