成员内部类、局部内部类、匿名内部类、lambda表达式基础


内部类

把类定义在另一个类的内部,该类就被称为内部类
​ 特点:
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表达式的接口快速指向一个已经被实现的方法。

本质: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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值