静态内部类
静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。public class Foo { static Mammal1 a = new Mammal1(){ @Override public void a() { System.out.println(111); } public void b() { } }; public static void main(String[] args) { a.a(); } } interface Mammal1{ public void a(); }
在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。
只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)
类的调用方法:
public class Foo { final static int a = 9; final static int b = 2; class Sum{ public void sum(int a,int b) { System.out.println(a+b); } } Ma d = new Ma() { @Override public void a() { } }; public static void main(String[] args) { new Foo().new Sum().sum(a, b);//内部类调用方法 new Foo().d.a(); //匿名内部类调用方法 } } abstract class Ma{ public abstract void a(); }
内部类特点(总结)
内部类特点:内部类是一个独立的类:编译之后内部类会被编译成独立的.class文件,如果该内部类为有名内部类,则有名内部类字节码文件名为外部类的类名+$+内部类类名;如果为匿名内部类,则匿名内部类字节码文件名为外部类的类名+$+数字;
普通外部类、抽象类和接口可以有内部类(匿名的或有名的);
内部类可以直接定义在类中,也可以定义在方法或代码块中;其中直接定义在外部类中的内部类可以有public、protected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用public和default修饰),也可以使用static修饰( static不能修饰普通外部类、接口和抽象类);但是定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。
内部类可以访问外部类的所有访问权限的成员变量
在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。
从 Java 8开始,如果定义的内部类需要使用该局部变量,则该变量可以不使用final修饰。
lambda表达式
Java支持Lambda 表达式始于Java 8,它的出现简化了函数式接口匿名内部类的语法,其表达式语法如下:([参数1], [参数2], [参数3],.... [参数n])->{代码块}
public class Foo { Ma s = ()->{ System.out.println(111); }; } @FunctionalInterface interface Ma{ public abstract void a(); }这段代码相当于:
public class Foo { Ma s = new Ma(){ @Override public void a() { System.out.println(111); } }; } @FunctionalInterface interface Ma{ public abstract void a(); }
显而易见,代码简化了许多。
如果方法没有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],.... [参数n])->单行语句
如果方法有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],.... [参数n])->表达式
public class Foo { Ma s = (int i)->i; } @FunctionalInterface interface Ma{ public abstract int a(int i); }