内部类
把类定义在另一个类的内部,该类就被称为内部类。
特点:
1.可以直接访问外部类的成员,包括私有
2.外部类要想访问内部类成员,必须创建对象
成员内部类
位于外部类成员位置的内部类。
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
//调用外部类的method方法
outer.method();
}
}
public class Outer {
//成员内部类
private class Inner{
public void print(){
System.out.println("这里是Inner");
}
}
//成员内部类一般定义为私有的,我们通过method方法,来创建成员内部类对象。
public void method(){
Inner inner = new Inner();
inner.print();
}
}
局部内部类
定义在一个方法或者一个作用域里面的内部类
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
//调用外部类的show方法
outer.show();
}
}
public class Outer {
public void show() {
//与局部变量类似,局部内部类不能有访问说明符(public、private等)
class Inner {//局部内部类
public void print(){
System.out.println("这里是inner");
}
}
//创建局部内部类对象,调用局部内部类方法
Inner inner = new Inner();
inner.print();
}
}
匿名内部类
定义在一个方法或者一个作用域里且没有名字的内部类
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
//调用外部类的show方法
outer.show();
}
}
public interface Inner {
void eat();
}
public class Outer {
//匿名内部类
public void show(){
new Inner() {
@Override
public void eat() {
System.out.println("这里是inner");
}
}.eat();
}
}
如何理解new Inner{…}中的{…}是匿名的 && 是内部类 && 属于局部内部类?
答:
1.{…}是一个类的声明。他重写了接口Inner里的抽象方法且没有类名,所以是匿名的。
2.{…}声明在外部类里,所以他是内部类。
3.{…}声明在show方法里所以是局部内部类。
lambda表达式
本质:lambda表达式 是匿名内部类 另一种简化的表现形式。
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
//调用外部类的show方法
outer.show();
}
}
public class Outer {
public void show(){
//匿名内部类
/*
Inner inner = new Inner() {
@Override
public void eat() {
System.out.println("这里是inner");
}
}
inner.eat();
*/
//lambda表达式
Inner inner=() -> {
System.out.println("这里是inner lambda");
};
inner.eat();
}
lambda 表达式双冒号引用方法
说明:有时候我们不是必须要自己重写某个匿名内部类的方法,我们可以可以利用 lambda表达式的接口快速指向一个已经被实现的方法。
本质:lambda表达式进一步简化
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
//调用外部类的show方法
outer.show();
}
}
public class Outer {
public void show(){
//匿名内部类
/*
Inner inner = new Inner() {
@Override
public void eat() {
System.out.println("这里是inner");
}
}
inner.eat();
*/
//lambda表达式
/*
Inner inner=() -> {
System.out.println("这里是inner lambda");
};
inner.eat();
*/
//双冒号引用法
Inner inner = System.out::println;
inner.eat();
}