云台大树  

Java允许在类的内部声明一个嵌套类,要么是非静态内部类,要么是静态内部类

嵌套类是其所在的外部类的一个成员属性,非静态嵌套类(inner class)可以访问其所在外部类的所有成员,包括private修饰的,静态嵌套类无法访问其外部类实例的成员


内部类

内部类只能存在于外部类的实例中,它可以访问外部类实例的所有私有变量。静态内部类只能访问外部类的静态成员

class Test {
    public static void main(String[] args) {
		/* 非静态内部类只能存在于外部类的实例中 - 所以要先实例化一个外部类实例 */
        Test test = new Test();
        Test.innerClass inner = test.new innerClass();
        
        inner.setName("world");
        System.out.println(inner.getName());
		
        /* 静态内部类可以直接访问(如果访问修饰符合适的话) */
        Test.StaticInnerClass staticInner = new Test.StaticInnerClass();
        System.out.println(staticInner.getName());
    }

    private String name = "hello";
    private static String sName = "hello";

    public class innerClass {
        public String getName() {
            /* 非静态内部类中使用 外部类名.this 来引用外部类实例 */
            return Test.this.name;
        }

        public void setName(String name) {
            Test.this.name = name;
        }
    }

    public static class StaticInnerClass {
        public String getName() {
            return Test.sName;
        }
    }
}

本地类或匿名类

除了在类内部定义嵌套类外,甚至还可以在块(如方法体)内声明嵌套类,这种嵌套类叫做本地类匿名类(如果没有类名的话)。

本地类可以访问其所在外部类的成员。本地类还能访问块内的本地变量,但是这个本地变量必须是final或者effectively final

effectively final是指“某个变量虽然没有使用final修饰符,但它的值自初始化后就再也没有被更改过”

本地类的使用和内部类是类似的

匿名类其实就是表达式,即通过表达式来创建了类并实例化了对象。它的使用同构造函数类似,只是它包含了类的实现

class AnonymouseClass {
	interface HelloWorld {
    	public void sayHi();
    }
    public void sayHello() {
    	HelloWorld chineseSay = new HelloWorld() {
        	public void sayHi() {
            	System.out.println("你好");
            }
        };
        chineseSay.sayHi();
    }
}
posted on 2022-05-31 21:48  云台大树  阅读(24)  评论(0编辑  收藏  举报