内部类
定义
内部类是定义在类内部的类,它可以访问外部类的成员。
为什么需要内部类
- 增强封装,把内部类隐藏在外部类中,不允许其他类访问这个内部类
- 增加了代码的维护性
内部类分类
- 实例内部类
直接定义在类当中的一个类,在类前面没有任何一个修饰符 - 静态内部类
在内部类前面加上一个static - 局部内部类
定义在方法中的内部类 - 匿名内部类
属于局部内部的一种特殊情况
实例内部类
class Outter{
String name = "Outername";
class Inner{
int age = 10;
String name = "inname";
void test() {
String name = "testname";
System.out.println(name);
System.out.println(this.name);
System.out.println(Outter.this.name);
}
}
}
public class Test {
public static void main(String[] args) {
Outter out = new Outter();
//System.out.println(out.name);
//创建实例内部类
//创建内部类对象当中,会有一个外部类的引用
Outter.Inner in = out.new Inner();
in.test();
}
}
- 要使用实例内部类,必须先创建外部类对象
- 实例内部类可以访问外部类的成员
- 实例内部类中不能有静态成员
- 外部类不能直接访问实例内部类中的成员
静态内部类
class Outter{
static String name = "myxq";
int age = 10;
static class Inner{
static String color = "black";
int width = 30;
void test() {
System.out.println(name);
System.out.println(new Outter().age);
}
}
}
public class Test {
public static void main(String[] args) {
//创建静态内部类
Outter.Inner in = new Outter.Inner();
in.test();
//System.out.println(in.width);
//访问静态类当中的静态成员
//System.out.println(Outter.Inner.color);
}
}
- 不需要创建外部类对象
Outter.Inner in = new Outter.Inner();
- 静态内部类中没有外部类的引用(不能用:外部类名.this.外部类成员)
- 静态内部类不能直接访问外部类普通成员,但是可以直接访问外部类的静态成员
- 静态内部类中可以定义静态成员,也可以定义非静态成员
局部内部类
class Outter{
void myxq() {
final String name = "myxq";
class Inner{
void test() {
System.out.println(name);
}
}
Inner in = new Inner();
in.test();
}
}
public class Test {
public static void main(String[] args) {
new Outter().myxq();
}
}
- 不能使用一些修饰 public private ...
- 局部内部类只能在定义的方法当中使用
- 局部内部类当中不能包含静态变量
- 局部内部类当中可以包含局部变量,使用的局部变量的本质是final常量
匿名内部类
interface IUSB{
void swapData();
}
class MotherBoard{
void pluginIn(IUSB u) {
u.swapData();
}
}
class Printer implements IUSB{
public void swapData() {
System.out.println("打印工作");
}
}
class KeyBoard implements IUSB{
public void swapData() {
System.out.println("打字");
}
}
class Mouse implements IUSB {
public void swapData() {
System.out.println("鼠标移动");
}
}
public class Test {
public static void main(String[] args) {
IUSB m = new Mouse();
IUSB k = new KeyBoard();
MotherBoard b = new MotherBoard();
b.pluginIn(m);
b.pluginIn(k);
//b.pluginIn(p);
b.pluginIn(new IUSB() {
public void swapData() {
System.out.println("打印工作");
}
});
}
}
- 匿名内部类就是一个没有名字的局部内部类
- 只使用一次的时候,才去使用匿名内部类
- 格式
new 父类的构造器 或 接口(){
内部写的代码(在new时候就会自动执行)
} - 匿名内部类必须得要有父类才或者是实现了接口