文章目录
1. 接口
- JDK1.7之后,接口中可以定义有方法体的方法。实现类在实现时,可以不必重写。static修饰的,可通过接口名直接调用。而default修饰的,必须经过具体类实现后,用new关键字创建对象来调用。
- 类和接口之间满足:has a
- 接口和接口之间可以继承:extends
2. 函数式接口
- 接口中只有一个抽象方法(函数式接口)
//一旦写上该标识就只能写一个抽象方法 可以不写,一个抽象方法也是函数式接口
@FunctionalInterface
interface C{
int add(int x,int y);
}
- 函数式接口(接口中有一个方法)->Lamda表达式(接口中必须只有一个方法)->内部类
3. 内部类
3.1 内部类的分类
- 虽然内部类分很多种,但所有的内部类必须遵守以下规则:
- 1.内部类的类名只用于定义它的类或者语句块之内,在外部引用时必须给出带有外部类名的完整名称。
- 2.内部类的名字不允许与外部类的名字相同,外部类指的是包裹它的那个类。
- 3.内部类可以是抽象类或接口,若是接口,则可以有其他内部类实现。
3.2.1 非静态实名内部类
定义方式
注意事项
- 非静态实名内部类对应的是非静态成员方法
- 对照非静态成员方法,可以总结出如下内容:
- 非静态实名内部类是一个特殊的成员实例类,特殊在它是一个类;
- 类只能被public或者默认修饰符修饰,但非静态实名内部类作为类成员,可以被private修饰;这是它作为类成员应有的特征,应有的权利
- 既然是类成员,访问外部类(包裹类)的静态或者非静态成员是合法的,理由是成员方法可以访问,我作为比方法更高级的类自然也可以访问。所以:可以访问外部类所有成员
- 既然是实例类成员,那么成员实例方法不能做的,成员实例类也不能做,这叫底线。所以方法中不能定义静态变量,因而内部类中不能定义静态成员。但内部类比它强的一点是可以定义静态常量
- 内部类中的方法不具特殊性。
- 案例佐证
创建方式
public class Demo02 {
static int x = 9;
//静态内部类不能访问外部类的非静态成员,可以访问静态成员
static class Inner{
int a = 3;
static final int b = 9;
static void f(){
x = 9;
}
}
}
3.2.2 静态内部类(类比静态成员方法)
定义方式
注意事项
- 对比静态成员方法:
- 静态内部类不能访问外部类的非静态成员,可以访问静态成员,因为非静态成员在静态成员之后,这是符合静态成员方法的规则的
- 和静态方法差不多,只不过多了一个new的过程
创建方式
3.2.3 局部实名内部类
注:局部内部类可以访问外部类的所有成员
定义方式
注意事项
- 类比于局部变量
- 局部变量是在栈中,所以局部匿名内部类也是同理,出栈便被消失。所以不能定义静态成员,包括属性和方法。但有其特殊一点是可以定义静态常量。
- 不能用修饰符修饰,这一点体现了局部变量的特性
- 可以访问外部类所有成员,要不然 局部匿名内部类和自己的局部变量玩,没多大意义
- Local variable a defined in an enclosing scope must be final or effectively final(在封闭范围中定义的局部变量必须是final或有效的final)当方法的内部类访问本方法内的变量是常量
- 局部变量是在栈中,所以局部匿名内部类也是同理,出栈便被消失。所以不能定义静态成员,包括属性和方法。但有其特殊一点是可以定义静态常量。
创建方式
3.2.3 局部匿名内部类
注:匿名类不能定义静态成员,包括方法和属性。
3.2.5 实例匿名内部类
4. lambda表达式
- 可省情况
*
- 抽象类和接口的区别
- 注意:
5. 内存管理
- 堆内存->jvm管理->那段代码->垃圾回收器
- 不是马上回收,先标记可以回收,线程统一起来再回收
- 垃圾回收:null,是否被引用
内存溢出:创建对象不够用
内存泄漏:使用完对象,对象没有被回收,就放到堆内存当中,产生垃圾
不同业务卡 接口