java class in - yaokun123/php-wiki GitHub Wiki

内部类

一、内部类的定义

将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类、嵌套类)

class Outer{
    private int num = 3;
    class Inner{//内部类
        void show(){
            System.out.println("inner show"+num);
        }
    }

    public void method(){
        Inner in = new Inner();
        in.show();
    }
}

class InnerClassDemo{
    public static void main(){
        
    }
}

编译成功会生成3个字节码文件

InnerClassDemo.class

Outer.class

Outer$Inner.class

注意:内部类与外部类用$符号链接。

二、内部类的访问特点

1、内部类可以直接访问外部类中的成员,包括私有成员。
那是因为内部类持有外部类的引用,外部类.this

2、而外部类要访问内部类中的成员必须要建立内部类对象。

三、内部类修饰符

内部类定义在一个类的成员位置上,那么内部类就可以用修饰符修饰。

class InnerClassDemo{
    public static void main(){
        //直接访问外部类中的内部类中的成员
        //格式如下:
        Outer.Inner in = new Outer().new Inner();
        in.show();
    }
}

注意:内部类大部分的情况下都是私有化的。

class Outer{
    private static int num = 3;
    static class Inner{//内部类
        void show(){
            System.out.println("inner show"+num);
        }
    }

    public void method(){
        Inner in = new Inner();
        in.show();
    }
}

class InnerClassDemo{
    public static void main(){
        //如果内部类是静态的,相当于一个外部类
        Outer.Inner in = new Outer.Inner();//不需要先建立外部对象。
        in.show();
    }
}
class Outer{
    private static int num = 3;
    static class Inner{//内部类
        static void show(){//如果内部类中定义了静态成员,该内部类也必须是静态的。
            System.out.println("inner show"+num);
        }
    }

    public void method(){
        Inner in = new Inner();
        in.show();
    }
}

class InnerClassDemo{
    public static void main(){
        //如果内部类是静态的,成员是静态的
        //就不需要对象了
        Outer.Inner.show();
    }
}
class Outer{
    int num = 3;
    class Inner{
        int num = 4;
        void show(){
            int num = 5;
            System.out.println(num);//5
            System.out.println(this.num);//4
            System.out.println(Outer.this.num);//3
        }
    }
}

四、局部内部类

内部类可以存放在局部位置上

class Outer{
    int num = 3;
    void method(){
        class Inner{
            void(){
                System.out.println("show ..."+num);//3
            }

            Inner in = new Inner();
            in.show();
        }
    }
}

class InnerClassDemo{
    public static void main(Srring[] args){
        new Outer().method();
    }
}

访问局部变量

class Outer{
    int num = 3;
    void method(){
        final int x = 9;//注意:此处必须加final关键字
        class Inner{
            void(){
                System.out.println("show ..."+x);//9
            }

            Inner in = new Inner();
            in.show();
        }
    }
}

class InnerClassDemo{
    public static void main(Srring[] args){
        new Outer().method();
    }
}