1.内部类:指在一个类的内部再定义一个类。
格式:
public class 类名{
修饰符 class 类名{
...
}
}
示例:
public class Outer{
public class Inner{
...
}
}
特性:
1.1 内部类可以直接访问外部类的成员,包括私有。
1.2 外部类要访问内部类的成员,必须先创建内部类对象。
按照内部类在类中定义的位置不同,可以分为两种形式:
● 在类的成员位置:成员内部类
● 在累的局部位置:局部内部类
2.成员内部类
创建成员内部类对象使用:
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象 ;
示例:
Outer.Inner oi = new Outer().new Inner();
代码:
public class Outer {
private int num = 10; //私有成员属性
public class Inner{ //内部类
public void show(){
System.out.println(num);
}
}
public void method(){
Inner i = new Inner(); //在成员方法里创建内部类对象,调用方法
i.show();
}
}
方法一:
public class TestDemo01 {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner(); //创建一个内部类对象调用方法,内部类必须 //是public
oi.show();
}
方法二:
public class TestDemo02 {
public static void main(String[] args) {
Outer outer = new Outer(); //创建一个外部类对象,通过成员方法访问private的内部类
outer.method();
}
3.局部内部类
局部内部类是在外部类的方法中定义。外界无法直接使用,需要在方法内部创建内部类对象。
局部内部类可以直接访问外部类成员,也可访问方法成员。
public class Outer {
private int num = 10; //私有成员属性
public void method(){ //成员方法
int num2 = 20; //方法成员
class Inner{ //局部内部类,没有访问修饰符
public void show(){
System.out.println(num);
System.out.println(num2);
}
}
Inner i = new Inner(); //创建局部类对象
i.show(); //对象调方法
}
}
public class TestDemo03 {
public static void main(String[] args) {
Outer outer = new Outer(); //创建一个外部类对象
outer.method();
}
4.匿名内部类
4.1 匿名内部类是局部内部类的一种特殊形式,也是局部内部类。
4.2 前提:存在一个类或者接口,类可以是抽象类,用来被继承或者实现
● 格式:
new 类名或者接口名(){
重写方法;
};
● 示例:
new inter(){
public void show(){
...
}
}
● 本质:是一个继承了已存在类或者实现了接口的子类的匿名对象
● 代码:
public interface Inter {
//存在的接口,用来被匿名内部类实现
public void show();
}
● 方法一:
public class Outer {
public void method(){
new Inter(){ //本质是一个接口实现子类的对象
@Override //重写接口的方法
public void show() {
System.out.println("这是匿名内部类"+num);
}
}.show(); //注意有分号;
}
}
● 方法二:
public class Outer {
public void method(){
Inner i = new Inter(){ //Inner对象来接收
@Override //重写接口的方法
public void show() {
System.out.println("这是匿名内部类"+num);
}
}; //注意有分号;
i.show(); //可以方便的调用多次
}
}
● 测试:
public class TestDemo04 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.method();
}
匿名内部类的实际使用:
一个Jumpping的接口:
public interface Jumpping {
public void jump();
}
一个Jumpping的操作类JumppingOperator:
public class JumppingOperator {
public void method(Jumpping j){ //形参是接口名,实际上需要的是该接口的实现类对象
j.jump();
}
}
一个测试类:
public class JumppingDemo {
public static void main(String[] args) {
JumppingOperator jo = new JumppingOperator(); //创建操作类对象
jo.method(new Jumpping() { //实现了Jumpping接口的匿名内部类
@Override
public void jump() {
System.out.println("^(* ̄(oo) ̄)^猪可以跳高!");
}
});
}
}
不使用匿名内部类的话,可以再重新创建一个类,实现接口,重写接口的方法。显然没有匿名内部类来的方便。
\