内部类

2018-05-22  本文已影响11人  erki_stwee

为什么要使用内部类

<Think in Java>这样描述:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个实现。所以无论外围类是否已经继承了某个实现,对于内部类没有影响。

接口知识解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

内部类优点

常见内部类分类

成员内部类

可以看成外围类的一个成员,可以无限制访问外围类的所有成员属性和方法;但是外围类要访问内部类的成员属性和方法需要通过内部类实例来访问。

注意事项

public class OuterClass {
    private String str;

    public void outerDisplay(){
        System.out.println("outerClass...");
    }

    class InnerClass{
        public void innerDisplay(){
            str = " inner str";
            System.out.println(str);
            outerDisplay();
        }
    }
    //推荐使用这种方式获取成员内部类
    public InnerClass getInnerClass(){
        return new InnerClass();
    }

    public static void main(String [] args){
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.getInnerClass();
        innerClass.innerDisplay();
    }
}
输出结果
 inner str
outerClass...
局部内部类

它只在该方法和属性中被使用,出了该方法和属性就会失效

public class Parcel5 {  
    public Destionation destionation(String str){  
        class PDestionation implements Destionation{  
            private String label;  
            private PDestionation(String whereTo){  
                label = whereTo;  
            }  
            public String readLabel(){  
                return label;  
            }  
        }  
        return new PDestionation(str);  
    }  
      
    public static void main(String[] args) {  
        Parcel5 parcel5 = new Parcel5();  
        Destionation d = parcel5.destionation("chenssy");  
    }  
} 
public class Parcel6 {  
    private void internalTracking(boolean b){  
        if(b){  
            class TrackingSlip{  
                private String id;  
                TrackingSlip(String s) {  
                    id = s;  
                }  
                String getSlip(){  
                    return id;  
                }  
            }  
            TrackingSlip ts = new TrackingSlip("chenssy");  
            String string = ts.getSlip();  
        }  
    }  
      
    public void track(){  
        internalTracking(true);  
    }  
      
    public static void main(String[] args) {  
        Parcel6 parcel6 = new Parcel6();  
        parcel6.track();  
    }  
} 
匿名内部类
public class OuterClass {
    private String str;

    public void outerDisplay(){
        System.out.println("outerClass...");
    }

    public InnerClass getInnerClass(final int num , String str){
        return new InnerClass(){
            int number = num + 3;
            public int getNumber(){
                return number;
            }
        };
    }

    public static void main(String [] args){
        OuterClass out = new OuterClass();
        InnerClass innerClass = out.getInnerClass(2, "chenssy");
        System.out.println(innerClass.getNumber());
    }
}
输出结果
5
静态内部类

静态内部类与非静态内部类之间最大的区别在于非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:

上一篇 下一篇

猜你喜欢

热点阅读