内部类概述
内部类:就是在一个类中定义一个类。举例:在一个类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);
}
}
}
/*
测试类
*/
public class InnerDemo {
public static void main(String[] args) {
//创建内部类对象并调用方法
//Inner i = new Inner(); 不能直接创建Inner的对象
Outer.Inner inner = new Outer().new Inner();
inner.show();
}
}
运行结果:
一般情况下内部类为私有的,不供外界访问
代码测试:
public class Outer {
private int num = 10;
//一般情况下内部类为私有的,不供外界访问
private class Inner{
public void show() {
System.out.println(num);
}
}
public void method(){
Inner inner = new Inner();
inner.show();
}
}
/*
测试类
*/
public class InnerDemo {
public static void main(String[] args) {
//创建内部类对象并调用方法
//Inner i = new Inner(); 不能直接创建Inner的对象
//Outer.Inner inner = new Outer().new Inner();
//inner.show();
//通过创建外部类的对象以及调用外部类的方法间接调用内部类
Outer outer = new Outer();
outer.method();
}
}
运行结果:
局部内部类
代码测试:
public class Outer {
private int num = 10;
public void method(){
//局部内部类 外部无法访问 通过外部类间接调用
class Inner{
private void show(){
System.out.println(num);
}
}
//外部类调用内部类方法
new Inner().show();
}
}
/*
测试类
*/
public class OuterDemo {
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("匿名内部类");
}
} ;
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
运行结果:
没有结果。
如何调用呢?
代码:
new Inter(){
@Override
public void show(){
System.out.println("匿名内部类");
}
}.show(); //前面是对象 重写了show方法,然后在对象之后调用show的方法
运行结果:
匿名内部类返回的是一个对象,所以我们可以将该对象赋值回去:
Inter i =new Inter(){
@Override
public void show(){
System.out.println("匿名内部类");
}
};
i.show();
i.show();
运行结果:
匿名内部类在开发中的使用
代码测试:
public interface Jumpping {
void jump();
}
public class Cat implements Jumpping{
@Override
public void jump() {
System.out.println("猫可以跳高");
}
}
public class JumppingOperator {
public void method(Jumpping j){
j.jump();
}
}
public class JumppingDemo {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator();
Jumpping j = new Cat();
jo.method(j);
//用一次的情况下没必要重复创建类,直接创建匿名内部类
Jumpping dog = new Jumpping() {
@Override
public void jump() {
System.out.println("狗可以调高了");
}
};
jo.method(dog);
}
}
运行结果: