内部类说明及其使用
1.为什么要学习内部类?
能够提高类成员的安全性。
2.定义
内部类就是把类定义在类的内部。
如果A 类中定义 B类,那么 A类就是外部类,B类就是内部类,,其他与A类同级别的类就是外界。
3.内部类的分类
1)成员内部类
访问格式:外部类类名.内部类类名 对象名 = new 外部类对象().new 内部类对象();
当外部类成员名字和内部类成员名字重名的时候: 外部类类名.this.成员
内部类调用范例:
public class InnerClassDemo02 {
public static void main(String[] args) {
Outer2.Inner oi = new Outer2().new Inner();
oi.show();
}
}
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;
System.out.println(num); // 输出20
System.out.println(this.num);// 输出30
System.out.println(Outer2.this.num); // 输出40
System.out.println(Outer2.super.num);// 输出50
Outer2.super.show();// 输出60
}
}
}
2)局部内部类
局部内部类只能够在局部创建对象访问
范例:
public class InnerClassDemo04 {
public static void main(String[] args) {
Outer3 outer3 = new Outer3();
outer3.show();
}
}
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();
}
}
以上的输出结果为:
20
Outer3.show().Inner.show()
局部内部类需要在局部实例化,同时局部内部类不的调用不能在类创建之前,局部的执行顺序由上至下。
3)静态内部类
访问格式: 外部类类名.内部类类名 对象名 = new 外部类类名.内部类类名();
访问非静态成员:创建静态内部类对象访问
访问静态成员:直接通过外部类类名.内部类类名.内部类静态成员
4)匿名内部类
匿名内部类: 这个本质就是 一个 继承/实现了某个类(接口,普通类,抽象类)的子类匿名对象
格式:
new 类名() {
[重写方法;]
};
特点: 它是一个对象,它是一个子类对象,同时它是子类匿名对象。
public class InnerClassDemo04 {
public static void main(String[] args) {
// 利用多态
Object s = new Object() {
@Override
public String toString() {
return "今晚打老虎";
}
}.toString();
System.out.println(s);
// 通过父类引用变量名访问多个方法
}
}
输出结果为:今晚打老虎。
4.内部类的特点
- 内部类编译后生成class文件的格式:外部类类名$内部类类名;
- 内部类可以访问外部类的所有成员,包括私有成员;
- 外部类访问内部类成员,必须创建内部类对象;
- 外界访问外部类成员,需创建外部类对象,再由外界访问内部类成员;
- 内部类将类和类之间产生了关系,提高了耦合性,降低可读性,慎用。