内部类基础

来源:互联网 发布:中国大数据市场份额 编辑:程序博客网 时间:2024/06/05 14:34

内部类:

    内部类有成员内部类、局部内部类、匿名内部类、静态内部类。

成员内部类

     作为外围类的成员存在,可以访问外围类所有的成员属性和方法,但是外围类要访问内部类的属性和方法则要通过内部类的实例对象来访问。     注意:内部类中不能存在任何静态变量和静态方法。     成员内部类是依附于外围类的,所以要通过外围类实例对象来创建内部类实例对象。     如果内部类拥有和外部类同名的属性和方法时,则默认访问的事内部类的属性或方法; 
Outer outer = new Outer();Outer.Inner inner = Outer.new Inner();     如果要访问外围类的同名属性或方法,则          外部类.this.成员变量          外部类.this.成员方法

局部内部类

      嵌套在方法和作用域内的,这种类使用的目的就是想创建一个辅助类来解决比较复杂的问题,但是又不希望这个类是公共可用的,它只能在该方法或该作用域中使用。

定义在方法中:

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 {    public InnerClass getInnerClass(final int num,String str2){        return new InnerClass(){            int number = num + 3;            public int getNumber(){                return number;            }        };      }    public static void main(String[] args) {        OuterClass out = new OuterClass();        InnerClass inner = out.getInnerClass(2, "chenssy");        System.out.println(inner.getNumber());    }}interface InnerClass {    int getNumber();}----------------Output:

静态内部类

     它创建实例对象是不需要依赖外围类的;它不能使用外围类的非静态属性和方法。  注意:在静态内部咧中可以存在静态成员;     静态内部类只能访问外部类的静态成员变量和方法,不能访问非静态成员变量和方法;     静态内部类可以直接创建实例不需要依赖于外围类。
public class OuterClass {    private String sex;    public static String name = "chenssy";    /**     *静态内部类     */    static class InnerClass1{        /* 在静态内部类中可以存在静态成员 */        public static String _name1 = "chenssy_static";        public void display(){            /*             * 静态内部类只能访问外围类的静态成员变量和方法             * 不能访问外围类的非静态成员变量和方法             */            System.out.println("OutClass name :" + name);        }    }    /**     * 非静态内部类     */    class InnerClass2{        /* 非静态内部类中不能存在静态成员 */        public String _name2 = "chenssy_inner";        /* 非静态内部类中可以调用外围类的任何成员,不管是静态的还是非静态的 */        public void display(){            System.out.println("OuterClass name:" + name);        }    }    /**     * @desc 外围类方法     */    public void display(){        /* 外围类访问静态内部类:内部类. */        System.out.println(InnerClass1._name1);        /* 静态内部类 可以直接创建实例不需要依赖于外围类 */        new InnerClass1().display();        /* 非静态内部的创建需要依赖于外围类 */        OuterClass.InnerClass2 inner2 = new OuterClass().new InnerClass2();        /* 非静态内部类的成员需要使用非静态内部类的实例 */        System.out.println(inner2._name2);        inner2.display();    }    public static void main(String[] args) {        OuterClass outer = new OuterClass();        outer.display();    }}----------------Output:chenssy_staticOutClass name :chenssychenssy_innerOuterClass name:chenssy静态内部类实例对象时不需要依赖外部类的实例对象引用。 Outter.Inner inner = new Outter.Inner();
原创粉丝点击