内部类
内部类的引入
提高了类成员的安全性
内部类概述
把类定义在类的内部,A 类中定义 B类, A类相对于B类就是外部类,B类相对于A类就是内部类
内部类分类
1.成员内部类
2.局部内部类
3.静态内部类
4.匿名内部类
内部类特点
1.内部类编译后生成class文件的格式: 外部类类名$内部类类名
2.内部类可以访问外部类的所有成员,包括私有成员
3.外部类访问内部类成员,必须创建内部类对象
4.外界访问外部类成员,创建外部类对象,访问内部类对象需要同时创建外部类和内部类对象
5.内部类将类和类之间产生了关系,提高了耦合性,降低可读性,慎用
1.成员内部类类
概述: 把类定义在类内部的成员位置
访问格式:
外部类类名.内部类类名 对象名 = new 外部类对象().new 内部类对象();
注意: 当外部类成员名字和内部类成员名字重名的时候: 外部类类名.this.成员
代码示例
class Fu {
int num = 50;
public void show() {
int num = 60;
System.out.println(num);
}
}
class Outer2 extends Fu{
int num = 40;
// 成员内部类
class Inner {
int num = 30;
public void show() {
int num = 20;
// 输出20
System.out.println(____);
// 输出30
System.out.println(____);
// 输出40
System.out.println(____);
// 输出50
System.out.println(____);
// 输出60
____
}
}
}
2.局部内部类
概述: 把类定义在类内部的局部位置
理解为局部变量即可
访问局部内部类成员: 局部内部类只能够在局部创建对象来访问
代码示例
class Outer3 {
public void show() {
class InnerX {
int num = 20;
public void show() {
System.out.println("Outer3.show().Inner.show()");
}
}
InnerX innerX = new InnerX();
System.out.println(innerX.num);
innerX.show();
}
}
3.静态内部类
概述:把类定义在类的内部类,并且使用static关键字修饰内部类
访问格式: 外部类类名.内部类类名 对象名 = new 外部类类名.内部类类名();
如果在外部类访问静态内部类成员
内部类静态成员: 类名.静态成员
内部类非静态成员: 对象.非静态成员
如何在外界访问静态内部类成员
创建静态内部类对象格式:
外部类.内部类 对象名 = new 外部类.内部类();
访问静态内部类非静态成员
对象.非静态成员
访问静态内部类静态成员
对象.静态成员
外部类类名.静态内部类类名.静态成员
代码示例
public class InnerClassDemo05 {
public static void main(String[] args) {
Outer4 outer4 = new Outer4();
outer4.test();
Outer4.Inner oi = new Outer4.Inner();
System.out.println(oi.num);
// System.out.println(oi.num2);
System.out.println(Outer4.Inner.num2);
oi.show();
Outer4.Inner.staticMethod();
}
}
class Outer4 {
static String country;
static class Inner {
int num = 10;
static int num2 = 20;
public void show() {
System.out.println("show");
}
public static void staticMethod() {
System.out.println("staticMethod");
}
}
public void test() {
System.out.println(Inner.num2);
Inner inner = new Inner();
System.out.println(inner.num);
}
}
4.匿名内部类
概述
这个本质就是 一个 继承/实现了某个类(接口,普通类,抽象类)的子类匿名对象
该类没有类名, 类名叫做 外部类类名$数字
格式 :
new 类名() {
[重写方法;]
};