成员内部类
概念
在类的内部定义,与实例变量、实例方法同级别的类
注意
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象 Outer out = new Outer; Outer.Inner in = out.new Inner();
特点
成员内部类可以使用任意访问修饰符
成员内部类可以直接访问外部类的属性和方法
成员内部类中属性和外部类的属性同名时,使用外部类名.this来访问外部类的属性
成员内部类不能包含静态成员,但是可以包含静态常量
public class Outer {
private int age = 18;
private String name = "张三";
public void show(){
System.out.println("外部类的属性:"+age + name);
}
class Inner{
private int age = 20;
private String name ="李四";
public void show(){
System.out.println("内部类的属性"+ age +name);
//内部类调用外部类的属性
System.out.println("内部类调用外部类的属性"+ Outer.this.age +Outer.this.name);
}
}
}
public class Test {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
//上面两步代码可以合成一个
//Outer.Inner in = new Outer().new Inner()
in.show();
out.show();
}
}
静态内部类
概念:
依赖外部类对象,可直接创建或通过类访问,相当于外部类,为外部类提供功能
注意:
只能直接访问外部类的静态成员
特点:
静态外部类可以使用任意修饰符
静态内部类不能直接访问外部类的实例属性和方法,可以直接访问静态的属性和方法
静态内部类可以包含静态成员
public class Outer {
private static int age = 18;
private static String name = "张三";
public void show(){
System.out.println("外部类的属性:"+age + name);
}
static class Inner{
private int age = 20;
private String name ="李四";
public void show(){
System.out.println("内部类的属性"+ age +name);
//内部类调用外部类的属性
System.out.println("内部类调用外部类的属性"+ Outer.age + Outer.name );
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
Outer out = new Outer();
//上面两步代码可以合成一个
//Outer.Inner in = new Outer().new Inner()
in.show();
out.show();
}
}
局部内部类
概念:
定义在外部方法中,作用范围和创建对象范围仅限于当前方法,限制类的适用范围
特点:
①不能使用任何访问修饰符
②如果局部类所在的方法是实例方法,可以直接访问外部类的实例属性和方法;如果局部类所在的方法是静态方法,只能访问外部类的静态属性和方法
③局部类可以访问局部变量,但是局部变量必须是final,JDK1.8.final可以省略,对象生命周期长于局部变量
④局部内部类中不能声明静态成员,可以使用静态常量
public class Outer {
private String name = "王五";
private int age = 25;
public void show(){
final int num = 1000;
class Inner{
private String phone = "110";
public void saiHi(){
System.out.println("电话:" + phone);
System.out.println("姓名:" + Outer.this.name + " 年龄:" + Outer.this.age);
System.out.println("num" + 1000);
}
}
Inner inner = new Inner();
inner.saiHi();
}
}
public class Test {
public static void main(String[] args) {
Outer out = new Outer();
out.show();
}
}
匿名内部类
概念:
相当于没有类名的局部内部类,必须继承父类或者实现接口
优点:
减少代码量,缺点:可读性比较差
//定义一个接口
public interface Usb {
public abstract void service();
}
//接口的实现类
public class Upan implements Usb {
@Override
public void service() {
System.out.println("与电脑连接成功");
}
}
//测试
public class Test {
public static void main(String[] args) {
//局部内部类的写法
// Upan upan = new Upan();
// upan.service();
// class Mouse implements Usb{
// @Override
// public void service() {
// System.out.println("鼠标和电脑连接成功");
// }
// }
//匿名内部类的使用
Usb mouse = new Usb(){
@Override
public void service() {
System.out.println("鼠标和电脑连接成功,开始工作。。。");
}
};
mouse.service();
}
}