静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。
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修饰。
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);
}