Java嵌套类

在Java中可以创建几种不同类型的嵌套类:

静态嵌套类:

静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量

public class Outer {

    private String name;
    private static String sname;
    
    public String getName(){
        return name;
    }
    
    public static String getSname(){
        return sname;
    }
    
    private static class Nested{
        public void test(){
            getSname();
            System.out.println(Outer.sname);
            Outer outer = new Outer();
            System.out.println(outer.name);
        }
    }
    
    public static void main(String[] args) {
        Outer.Nested instance = new Outer.Nested();
        instance.test();
    }

}


非静态嵌套类(内部类)

内部类跟外部类的实例相关联,因此必须先创建外部类实例,才能创建内部类实例

public class Outer {

    private String name = "I'm private";
    private static String sname;
    
    public String getName(){
        return name;
    }
    
    public static String getSname(){
        return sname;
    }
    
    private class Nested{
        public void test(){
            getSname();
            System.out.println(Outer.sname);
            System.out.println(name);
            getName();
        }
    }
    
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Nested instance = outer.new Nested();
        instance.test();
    }

}
影子内部类

如果内部类声明了与外部类一样的方法和属性,我们称这样的类为影子内部类

public class Outer {
    private String name = "I'm Outer private";
    private class Nested{
        private String name = "I'm Inner private";
        public void printText(){
            System.out.println(name);
            System.out.println(Outer.this.name);
        }
    }
    
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Nested instance = outer.new Nested();
        instance.printText();
    }
}
局部类

类似于内部类,但是是定义在方法体中的类,只能在定义它的方法作用域内访问。可以向其他内部类一样访问外部类的成员属性和方法, 可以访问方法体内其他的final成员变量。局部类同样可以定义在static方法中,此时只能访问外部类的静态成员,但是局部类中不能定义静态成员(常量除外,被声明为static final的除外)。

The same shadowing rules apply for local classes as for inner classes.

public class Outer {
    private String name = "I'm Outer private";

    public void printText(){
        final String value = "Java";
        class Local{
            private void test(){
                System.out.println(value);
                System.out.println(name);
            }
        }
        Local local = new Local();
        local.test();
    }
    
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.printText();
    }
}
匿名类

顾名思义没有名字的类,他们通常声明为一个已有类的子类或者一个接口的实现。匿名类是在他们实例化的时候声明的。

你可能感兴趣的:(内部类,匿名类)