Java学习总结(六) —— 内部类
- 一、内部类
-
- 1. 概述
- 2. 内部类的访问
- 二、匿名内部类
-
- 1. 基本使用方法
- 2. 作为参数传递
一、内部类
1. 概述
将一个类A定义在另一个类B里面,里面的那个类A就称为 内部类 ,B则称为外部类。
代码如下:
public class A{
class B{
}
}
2. 内部类的访问
- 1.内部类可以直接访问外部类的成员,包括私有成员。
- 2.外部类要访问内部类的成员,必须要建立内部类的对象。
代码如下:
class Animal {
private boolean CAT = true;
// 内部类
class Cat {
public void isCat() {
// 内部类可以直接访问外部类的成员变量
if (CAT) {
System.out.println("喵喵喵");
} else {
System.out.println("汪汪汪");
}
}
}
public void changeToCat() {
this.CAT = true;
}
public void changeToDog() {
this.CAT = false;
}
}
// 测试类
class Test01 {
public static void main(String[] args) {
// 创建外部类对象
Animal animal = new Animal();
// 创建内部类对象
Animal.Cat Jim = animal.new Cat();
// 调用内部方法
Jim.isCat();
// 调用外部方法
animal.changeToDog();
// 调用内部方法
Jim.isCat();
}
}
输出结果:
喵喵喵
汪汪汪
重点:
- 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
- 比如,Animal$Cat.class
二、匿名内部类
匿名内部类:是内部类的简化格式,匿名内部类的本质是一个 带着具体实现的父类或父接口的匿名的 子类对象。
传统实现接口的步骤为:
- 1.创建接口
- 2.定义子类
- 3.重写接口的方法
- 4.创建子类对象
- 5.调用重写后的方法
所以针对以上繁琐的步骤,提出了匿名内部类来简化开发的步骤。
【前提】匿名内部类必须继承一个父类或者实现一个父接口。
代码如下:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
1. 基本使用方法
举个例子,代码如下:
abstract class Fruit {
public abstract void eat();
}
class InnerDemo {
public static void main(String[] args) {
/*
1.等号右边:是匿名内部类,定义并创建该接口的子类对象
2.等号左边:是多态赋值,接口类型引用指向子类对象
*/
Fruit fruit = new Fruit() {
@Override
public void eat() {
System.out.println("甜滋滋的");
}
};
fruit.eat();
}
}
输出结果:
甜滋滋的
2. 作为参数传递
另一种使用方法是将匿名内部类作为参数传递,通常在方法的形式参数是接口或者抽象类时使用。
代码如下:
abstract class Fruit {
public abstract void eat();
}
class InnerDemo {
public static void main(String[] args) {
show(new Fruit() {
@Override
public void eat() {
System.out.println("甜滋滋的");
}
});
}
public static void show(Fruit fruit) {
fruit.eat();
}
}
输出结果:
甜滋滋的