文章目录
内部类的分类
非静态内部类
1:有名内部类
public class Boy{
public void move(){
system.out.println("...................");
}
/**
*有名内部类
*/
public class Herat{
public void beat(){
system.ont.println("有名内部类");
}
}
}
1:全局有名内部类的使用方式类似于全局变量;局部有名内部类的使用方式类似局部变量——它们都有固定的使用范围;
2:匿名内部类
public class Father{
/**
*匿名内部类
*/
Boy boy =new Boy(){
@Override
public void move(){
system.out.println("匿名内部类");
}
}
}
(1)特点
1:匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类;
3:匿名内部类不能自定义构造方法,但是可以通过非静态代码块初始化成员变量
4:匿名内部类一定不能是抽象类;
5:可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用
(2)抽象类与接口
1:抽象类的匿名内部类的实质为抽象类的子类
2:接口的匿名内部类的实质为抽象类的实现类
静态内部类(有static修饰)
4:静态有名内部类
public class Body {
/**
* 静态有名内部类
*/
public static class Heart{
public void beat(){
System.out.println("正在跳动...");
}
}
}
5:静态匿名内部类
public class OutClass {
/**
* 匿名内部类
*/
static Father son = new Father(){
@Override
public void eat() {
System.out.println("筷子吃饭....");
}
};
}
6:静态内部类特点
1:静态内部类只能定义在外部类中
2:静态内部类可以直接访问外部类的静态成员变量和方法,对于非静态成员变量和方法必须创建外部类的对象间接访问
3:有名静态内部类允许有静态成员(静态的代码块、属性、方法)
内部类的特点总结
- 内部类是一个独立的类:编译之后内部类会被编译成独立的.class文件,如果该内部类为有名内部类,则有名内部类字节码文件名为外部类的类名
+$+
内部类类名;如果为匿名内部类,则匿名内部类字节码文件名为外部类类名+$+
数字; - 普通外部类、抽象类和接口可以有内部类(匿名的或有名的);
- 内部类可以直接定义在类中,也可以定义在方法或代码块中;
- 直接定义在外部类中的内部类可以有public、protected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用public和default修饰),也可以使用static修饰( static不能修饰普通外部类、接口和抽象类);
- 定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。
- 在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。
- 从 Java 8开始,如果定义的内部类需要使用该局部变量,则该变量可以不使用final修饰。
Lambda表达式
1:表达式:([参数1], [参数2], [参数3],… [参数n])->{代码块}
2:代码:
InnerClass innerClass = new InnerClass () {
@Override
public void iterate(Object[] array) {
for (Object obj : array) {
System.out.println(obj);
}
}
};
// 用Lambda表达式写:
IArrayUtil arrayUtil = (Object[] array) -> {
for (Object obj : array) {
System.out.println(obj);
}
};
3:如果方法有返回值且只有一行代码,则Lambda表达式语法为:
IComputer computer = (a, b) -> {
return a+b;
};
int result = computer.add(1,2);
System.out.println(result);
}
//Lambda表达式:
IComputer computer = (a, b) -> a+b;
4:如果方法没有返回值且只有一行代码,则Lambda表达式语法为:
IComputer computer = (name) -> {
System.out.println(name+"正在运行");
}
//Lambda表达式为:
IComputer computer = (name) ->System.out.println(name+"正在运行");