标签:
内部类就是在一个类中再定义一个类,内部类可以起到包装隐藏的作用,不允许同一包中的其他类来访问该类,内部类的方法可以访问所以外部类的数据。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