内部类: 就是在一个类中定义一个类.
例: 在一个类A的内部定义了一个类B,类B就被称为内部类
- 格式:
public class 类名 {
修饰符 class 类名{
}
}
- 范例:
public class Outer {
public class Inner{
}
}
内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
public class Outer {
private int num = 10;
public class Inner {
public void show() {
System.out.println(num); // 内部类可以访问外部类的成员,包括私有
}
}
public void method() {
// show(); // 外部类不可以直接访问内部类
Inner i = new Inner(); // 必须创建对象
i.show();
}
}
成员内部类
按照内部类在类中定义的位置不同,可以分为两种形式
- 在类的成员位置: 成员内部类
- 在类的局部位置: 局部内部类
public class Outer {
private int num = 10;
public class Inner {
/* public void show() {
System.out.println(num); // 内部类可以访问外部类的成员,包括私有
}*/
private void show() { // 一般内部类都是私有的
System.out.println(num);
}
}
public void method() { // 创建一个方法,使外部间接调用内部类方法
// show(); // 外部类不可以直接访问内部类
Inner i = new Inner(); // 必须创建对象
i.show();
}
}
public static void main(String[] args) {
/* Outer.Inner i = new Outer().new Inner();
i.show();*/
Outer o = new Outer();
o.method();
}
局部内部类
局部内部类是在方法中定义的类,所以外界是无法直接使用得,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
public class Outer {
private int num = 10;
public void method() {
class Inner {
int num2 = 20;
public void show() {
System.out.println(num);
System.out.println(num2);
}
}
Inner i = new Inner();
i.show();
}
}
public class test {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
匿名内部类
局部内部类的一种特殊形式
前提: 存在一个类或者接口,这里的类可以是具体类也可以是抽象类
- 格式:
new 类名或者接口名() {
重写方法;
}
new Inter() {
public void show() {
}
}
本质: 是一个继承了该类或者实现了该接口的子类匿名对象
public interface Inter {
void show();
}
public class Outer {
public void method() {
/* new Inter() {
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show();*/
Inter i = new Inter() {
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show();
i.show();
}
}
public class test {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
匿名内部类在开发中的使用
public interface Jumping {
void jump();
}
public class JumpingOperator {
public void useJumping(Jumping j) { // 多态: Jumping j = new Cat();
j.jump();
}
}
public class Cat implements Jumping{
@Override
public void jump()
{
System.out.println("猫跳高");
}
}
public static void main(String[] args) {
JumpingOperator jo = new JumpingOperator();
Jumping j = new Cat();
jo.useJumping(j);
jo.useJumping(new Jumping() { // 匿名内部类
@Override
public void jump() {
System.out.println("狗跳高");
}
});
}