目录
什么是内部类:就是在一个类的里面,再定义一个类;
内部类表示的事物是外部类的一部分,内部类单独出现没有什么意义。
内部类的访问特点:
- 内部类可以直接访问外部类的成员,包括私有;
- 外部类要访问内部类的成员,必须创建对象;
内部类的分类:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
一.成员内部类
- 写在成员位置上的,属于外部类的成员;
- 成员内部类可以被一些修饰符所修饰,比如private,默认,protected,public,static等;
- (protected:包的其他类,和其他包的子类都可以用)
- 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量;
(一).如何获取成员内部类对象:
1.在外部类中编写方法,对外提供内部类的对象;
2.在外界直接创建内部类的对象
创建格式:外部类名.内部类名 对象名=外部类对象.内部类对象;
(二).成员内部类如何获取外部类的成员变量;
public class Outer{
private int a=10;
class Inner{
private int a=20;
public void show(){
int a=30;
System.out..println(Outer.this.a);//10
System.out.println(this.a);//20
System.out.println(a);//30
//就近原则
}
}
}
外部类成员变量和内部类成员变量重名时,在内部类如何访问?
System.out.println(Outer.this.变量名);
二.静态内部类
静态内部类其实也是成员内部类的一种,在成员内部类前面用static修饰,此时就是静态内部类;
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象 ;
例如:
public class Outer{
int a=10;
static int b=20;
static class Inner{
public void show1(){
Outer o=new Outer();
System.out.println(o.a);
System.out.println(b);
}
public static void show2(){
Outer 0=new Outer();
System.out.println(o.a);
System.out.println(b);
}
}
}
创建静态内部类对象的格式:外部类名.内部类名 对象名=new 外部类名.内部类名();
调用非静态方法的格式:先创建对象,用对象调用;
调用静态方法的格式:外部类名.内部类名.方法名();
三.局部内部类
1.将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
2.外界是无法直接使用,需要在方法内部创建对象并使用。
3.该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
四.匿名内部类
1.匿名内部类本质上就是隐藏了名字的内部类;
可以写在成员位置,也可以写在局部位置。
2.格式:
new 类名或者接口名(){
重写方法;
};
例如:
new Run(){
@Override
public void Run(){
System.out.println("重写了跑步的方法");
}
};
3.格式细节:
包含了继承或实现,方法重写,创建对象。
整体就是一个类的子类对象或者接口的实现类对象。
4.使用场景:
当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,
如果实现类只要使用一次,就可以用匿名内部类简化代码。
五 Lambda概述
1.Lambda表达式是JDK开始后的一种新语法形式;
作用是:简化匿名内部类的代码写法;
(注意的是:Lambda表达式只能简化函数式接口的匿名内部类的写法格式)
2.Lambda表达式的简化格式:
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码。
}
3.什么是函数式接口?
首先必须是接口,其次接口中有且仅有一个抽象方式的形式。
通常我们会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口。
4.Lambda表达式的省略写法
参数类型可以省略不写
如果只有一个参数,参数类型可以省略,同时()也可以省略
如果Lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号;
此时,如果这行代码是return语句,必须省略return不写,同时也必须省略“,”不写。