Java内部类

92 阅读3分钟

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) ̄)^猪可以跳高!");
             }
         });
     }
 }
 ​
不使用匿名内部类的话,可以再重新创建一个类,实现接口,重写接口的方法。显然没有匿名内部类来的方便。

\