什么叫内部类?
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面(局部内部类),这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。
成员内部类
在类中的方法,跟成员变量是一个位置
成员内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须要创建对象
创建成员内部类对象格式
//在内部创建成员内部类对象
Inner i = new Inner();
//在外界创建成员内部类格式
//外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer.Inner oi = new Outer().new Inner();
成员内部类的推荐使用方案
将一个类设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
示例代码:
public class Outer {
private class Inner {
public void show() {
System.out.println("内部类show方法被调用。。。");
}
}
//定义方法用来调用内部类
public void method() {
//创建内部类对象
System.out.println("外部类方法被调用。。。");
Inner i = new Inner();
i.show();
}
}
测试类:
public class Test {
public static void main(String[] args) {
//创建一个类对象,用来调用内部类的方法
Outer o = new Outer();
o.method();
}
}
局部内部类
- 局部内部类是在方法中定义的类
- 外界无法直接使用,需要在方法内部创建对象并使用
- 可以直接访问外部类的成员,也可以访问方法内的局部变量
匿名内部类
本质:是一个继承了该类或者实现了该接口的子类匿名对象
使用匿名内部类的前提:
存在一个类或接口,这里的类可以是具体类也可以是抽象类
匿名内部类的格式:
new 类名(){重写方法} new 接口名(){重写方法}
new Inter(){
@Override
public void method(){}
}
匿名内部类可以铜鼓多态的形式接受
Inter i = new Inter(){
@Override
public void method(){
}
}
匿名内部类直接调用方法
interface Inter {
void method();
}
class Test {
public static void main(String[] args) {
new Inter() {
@Override
public void method() {
System.out.println("我是匿名内部类");
}
}.method(); // 直接调用方法
}
}
匿名内部类在开发中的使用
当发现某个方法需要接口或抽象类的子类对象时,就可以传递以个匿名内部类过去,来简化代码,而不需要创建多个类来实现接口或者抽象类。
public interface Jumping {
void jump();
}
public class Cat implements Jumping{
@Override
public void jump() {
System.out.println("猫可以跳了。。。");
}
}
public class Dog implements Jumping{
@Override
public void jump() {
System.out.println("狗可以跳了。。。");
}
}
以前的做法:
public class JumpingTest {
public static void main(String[] args) {
Jumping j1 = new Cat();
j1.jump();
Jumping j2 = new Dog();
j2.jump();
}
}
使用匿名内部类后的做法:
public class JumpingTest {
public static void main(String[] args) {
Jumping j = new Jumping(){
@Override
public void jump() {
System.out.println(" 袋鼠可以跳了。。。");
}
};
j.jump();
}
}