内部类顾名思义就是类里面又重新定义了一个类,它就像类的成员属性一样。
既然像成员属性一样,那么我们可以分为:静态内部类,成员内部类,局部内部类,匿名内部类(一种没有类名的局部内部类)
静态内部类
静态内部类差不多像静态变量,可以用(类名.静态内部类)调用
class Dome {
static class work {
static void print() {
System.out.println("hello");
}
}
}
public class Main {
public static void main(String[] args) {
//类名.静态内部类调用
Dome.work.print();
}
}
成员内部类
类似于成员变量,需要new出对象才能调用
class Dome {
class work {
void print() {
System.out.println("hello");
}
}
}
public class Main {
public static void main(String[] args) {
Dome a = new Dome();
Dome.work b = a.new work();
b.print();
// 可以简写成 new Dome().new work().print();
}
}
局部内部类
类似于局部变量,定义在方法体内
class Dome {
void print() {
class work {
void sout() {
System.out.println("hello");
}
}
work a = new work();
a.sout();
}
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print();
}
}
匿名内部类
方法体内的匿名内部类
在这之前先了解一下,有继承关系的成员内部类
class superWork {
void sout() {
System.out.println("父类");
}
}
class Dome {
void print() {
class work extends superWork{
@Override
void sout() {
System.out.println("子类");
}
}
work a = new work();
a.sout();
}
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print();
}
}
换成匿名内部类对其化简
class Dome {
void print() {
superWork a = new superWork(){
@Override
void sout() {
System.out.println("子类");
}
};
a.sout();
// 简写
// new superWork() {
// @Override
// void sout() {
// System.out.println("子类");
// }
// }.sout();
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print();
}
}
可以看出匿名内部类就是一个继承父类(或者实现接口)的一个局部内部类,只不过这个类没有名字。
作为参数的匿名内部类
方法中参数类型为引用类型
class superWork {
void sout() {
System.out.println("父类");
}
}
class Dome {
void print(superWork sw) {
sw.sout();
}
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print(new superWork()); //结果输出“父类”
}
}
如果引用类型我们想去拓展这个父类(或者实现接口),我们可以用匿名内部类去做
class superWork {
void sout() {
System.out.println("父类");
}
}
class Dome {
void print(superWork sw) {
sw.sout();
}
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print(new superWork(){
@Override
void sout() {
System.out.println("子类");
}
}); // 结果输出“子类”
}
}
接口版
interface superWork {
void sout();
}
class Dome {
public void print(superWork sw) {
sw.sout();
}
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print(new superWork() {
@Override
public void sout() {
System.out.println("子类");
}
});
}
}
lambda表达式化简
对于参数形式的匿名类,我们可以用lambda表达式化简
interface superWork {
void sout();
}
class Dome {
public void print(superWork sw) {
sw.sout();
}
}
public class Main {
public static void main(String[] args) {
Dome test = new Dome();
test.print(() -> {
System.out.println("子类");
});
}
}