java内部类

来源:互联网 发布:java的todo 编辑:程序博客网 时间:2024/04/30 12:21

内部类的作用:提供更好的封装,隐藏在外部类之内,同一包中其他类不允许访问;内部类被当做外部类的成员,可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节,比如内部类的成员变量,可显式创建内部类对象调用。

1.非静态内部类

内部类作为外部类的成员,可以使用任意访问控制符如private、protected、public等修饰。

在非静态内部类里可以直接访问外部类的private成员。

如果外部类成员变量、内部类成员变量与内部类方法的局部变量同名,则可通过使用this、外部类类名.this作为界定来区分。

public class Outer {private int outProp=5;class Inner{private int inProp=5;public void accessOuterProp(){System.out.println("外部类的outProp值:"+outProp);}}public void accessOuterProp(){//System.out.println(inProp);//代码出错System.out.println(new Inner().inProp);}public static void main(String[] args) {//Inner in=new Inner();//出错,无法访问非静态成员Outer out=new Outer();out.accessOuterProp();}}

2.静态内部类

如果使用static修饰一个内部类,则这个内部类属于外部类本身,称为类内部类,也叫静态内部类。

根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。

外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。

public class StaticInnerClassTest {static class StaticInnerClass{private static int prop1=9;private int prop2=5;}public static void main(String[] args) {//System.out.println(prop1);//代码出错System.out.println(StaticInnerClass.prop1);//通过类名访问静态内部类类成员//System.out.println(prop2);//代码出错System.out.println(new StaticInnerClass().prop2);//通过实例访问静态内部类的实例成员}}

3.局部内部类

如果把一个类放在方法里定义,则这个内部类就是一个局部内部类,局部内部类仅在该方法里有效。

由于不能在方法以外的地方使用,所以不能使用访问控制符和static修饰。

public class LocalInnerClass {public static void main(String[] args) {//定义局部内部类class InnerBase{int a;}//定义局部内部类子类class InnerSub extends InnerBase{int b;}InnerSub is=new InnerSub();is.a=5;is.b=6;System.out.println("InnerSub对象a和b的field为:"+is.a+","+is.b);}}

4.匿名内部类

关于匿名内部类有两条规则:

匿名内部类不能是抽象类,因为系统创建匿名内部类时,会立即创建匿名内部类的对象。

匿名内部类不能定义构造器,因为匿名内部类没有类名,但可以定义初始化块。

/*最常用的创建匿名内部类的方式是创建某个接口类型的对象*/interface Product{public double getPrice();public String getName();}public class AnnoymousTest {public void test(Product p){System.out.println("购买了一个"+p.getName()+",花了"+p.getPrice());}public static void main(String[] args) {AnnoymousTest ta=new AnnoymousTest();//调用test方法需要传入Product参数,此处传入匿名实现类的实例ta.test(new Product(){public double getPrice(){return 123.4;}public String getName(){return "Nv显卡";}});}}

原创粉丝点击