类内部可以有另一个类,也就是内部类,如果带static则为静态内部类
静态内部类当然不能直接访问实例变量
内部类修饰符可以有四种,而外部类只有两种
内部类的意义:
这个内部类只适用于这个外部类
因为外部类的某些字段是private的,这个内部类要想访问除非是他的成员
生成的class文件也会在一起的,便于整理
内部类作为类的成员,当然也要有外部类的对象才能访问
静态内部类的使用,相当于包名
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
非静态的内部类要动态生成:
OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
内部类的字段如果覆盖了外部类的 非static字段,要全名访问
OuterObject.this.x
内部类有两种特殊形式,一是在块中,局部内部类
局部内部类只能访问所在块中的final变量(跟一般内部类的区别)
JDK8以后,如果这个局部变量初始化后就没变过,可以不声明为final
只有方法自己才能访问自己的参数,局部类不可以
JDK8以后,局部类也可以访问所在方法的参数了
静态方法的局部内部类当然只能访问外部类的静态字段
局部内部类不能有static成员,除非是常量
接口都是显式static的,所以不可能出现在块中,包括局部内部类里
跟局部内部类不同,另一种,匿名内部类只是一个表达式,可以出现在表达式能出现的任何地方
new,父类名称或接口名称,构造(),类体{}
HelloWorld frenchGreeting = new HelloWorld() { String name = "tout le monde"; public void greet() { greetSomeone("tout le monde"); } public void greetSomeone(String someone) { name = someone; System.out.println("Salut " + name); } };
这个类体里面定义的是一个子类或者实现类,会有覆盖或实现的方法
匿名内部类也是外部类的成员,访问规则同一般内部类或局部内部类
另外匿名内部类是没有构造的
局部内部类通常用来定义一个内部类型
匿名内部类通常用来实现接口,且多用于界面编程
Lambda 表达式(略)
Enum(枚举)
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY,//不加引号 THURSDAY, FRIDAY, SATURDAY //后面没东西的话可以不加分号 }
枚举是一个类,可以有字段和方法的定义,且自带一些方法,如values()
for (Day d : Day.values()) {
枚举都是显式继承java.lang.Enum,所以不能继承其他了
构造或者是默认,或者是private,且不能手动调用