天天看点

内部类

概述: 就是把一个类定义在另一个类中,那么这个类我们就将其称之为内部类

按照位置进行分类

* 成员内部类 就是把这个类定义在了成员位置(类中方法外的位置)

*private: 提高数据的安全性

*static : 访问其他的类访问

*非静态的成员内部类被其他类创建对象的格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象 ;

*静态的成员内部类被其他类创建对象的格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名() ;

* 局部内部类 就是把这个类定义在局部位置(方法定义中的位置)

特点

为什么局部内部类在访问局部变量的时候,要求这个局部变量要被final修饰?
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用,但是jdk1.8取消了这个事情,所以我认为这是个bug

内部类的特点

* 内部类可以直接访问外部类的成员,包含私有的
public class aa {

  public static void main(String[] args) {

      // 外部类名.内部类名 对象名 = 外部类名.内部类对象;

    Outer.Inner oi = new Outer.Inner();

    oi.method();

    Outer.Inner2.print();

  }

}

//静态的内部类

class Outer {

  static class Inner {

  public void method() {

    System.out.println("method");

  }

}

 

static class Inner2 {

  public static void print() {

    System.out.println("print");

  }

  }

}
      
public class aa {

public static void main(String[] args) {

  Outer.Inner oi = new Outer().new Inner();

  oi.show();

}

}

//成员内部类

// 要求:使用已知的变量,在控制台输出30,20,10。

 

// 内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this

 

class Outer {

public int num = 10;

 

class Inner {

  public int num = 20;

 

  public void show() {

    int num = 30;

    System.out.println(num);

    System.out.println(this.num);

    System.out.println(Outer.this.num);

  }

  }

}
      
public class aa {

public static void main(String[] args) {

    // Outer.Inner oi = new Outer().new Inner();
  
    // oi.method();

    Outer o = new Outer();

    o.print();

  }

}

class Outer {

  private int num = 10;

 

  private class Inner {

    public void method() {

      System.out.println(num);

    }

  }

    public void print() {

      Inner i = new Inner();

      i.method();

    }

}
      
public class aa {

  public static void main(String[] args) {

    Outer o = new Outer();

    o.method();

  }

}

 

// 局部内部类

class Outer {

  public void method() {

    final int num = 10;

    class Inner {

      public void print() {
  
        System.out.println(num);

      }

    }
    Inner i = new Inner();

    i.print();

   }

/*

* public void run() { Inner i = new Inner(); //局部内部类,只能在其所在的方法中访问

* i.print(); }

*/

}
      

继续阅读