1 内部类
内部类的作用:
- 内部类提供了更好的封装,不允许外部类之外的类访问外部内中的内部类的对象(但可以获取外部类.内部类.class),内部类只有在外部类中才有效,离开外部类后没有任何意义。
- 内部类可以访问外部的的成员变量(包括私有变量)
- 匿名内部类适合用于创建那些只需要使用一次的类。
内部类比外部类多了三个修饰符(都有的是public-共有访问权限,default-包访问权限):private(当前类访问权限),protected(子类访问权限),static,final。因为外部类只有两个作用于包、任何位置。而内部类有四个作用域:同一个类、同一个包、父子类、任何位置。
1.1 非静态内部类
非静态内部类中保存了一个外部类对象的引用外部类.this(可以使用this,外部类.this来区分外部类和内部类中名字相同的变量)
非静态内部类中不允许包含静态的方法,静态成员变量,静态初始化块。
1.2 静态内部类
静态内部类是与外部类类相关的(而非静态内部类与外部类是对象相关的)。并且,静态内部类只能访问外部类的静态成员和静态方法
1.3 使用内部类
- 不能在外部类中的静态方法中使用非静态内部类(因为非静态内部类是做为外部类的的成员变量的)
- 在外部类以外的其他地方使用非静态内部类:OuterInstance.new InnerConstructor()
- 非静态内部类中有一个其外部类对象的引用,所以,非静态内部类的子类也应该有一个该外部类对象的引用()
- 非静态内部类In对象和他的SubClass对象都必须持有指向外部类Outer对象的引用,区别在于传入Out对象的方式不同。当创建In对象的Outer对象时,必须通过一个已有的Outer对象来调用new关键字;当创建SubClass类的Outer对象时,必须使用Oter对象作为调用者来调用In类的构造器。
非静态内部类与静态内部类创建对象的方式都差不多。区别在于静态内部类通过外部类就可以调用内部类构造器,而非静态内部类通过外部类的对象来调用内部类构造器。因此,当程序使用内部类时,当优先考虑静态内部类。
1.3 匿名内部类
- 当被匿名内部类访问的局部变量自动使用了final修饰。但是这个局部变量不能被改变了。
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int b=3;
A a=new A(){
/**
* TODO 简单描述该方法的实现功能(可选).
* @see temp.A#A()
*/
@Override
public void A() {
// 下面语句在java8之前会报错,之后就不会了
System.out.println(b);
}
};
}
}
interface A{
void A();
}
1.4 Lambda表达式
Lambda表达式由三部分组成:()->{}
- 形参列表
- 箭头
- 代码块
emsp;为了保证Lambda的目标类型(target type)是一个明确的函数式接口,常见的有以下三种方法:
- 将Lambda表达式赋值给一个函数式接口的变量。
- 将Lambda表达式作为函数式接口类型的参数传递给方法
- 将Lambda表达式强制类型转换给一个函数式接口。