概述: 就是把一个类定义在另一个类中,那么这个类我们就将其称之为内部类
按照位置进行分类
* 成员内部类 就是把这个类定义在了成员位置(类中方法外的位置)
*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(); } */ }