内部类概述
把类定义在其他类的内部,这个类就被称为内部类。 举例:在类A中定义了一个类B, 类B就是内部类。 内部类的访问特点: 内部类可以直接访问外部类的成员,包括私有。 外部类要访问内部 类的成员,必须创建对象。
内部类的分类
成员内部类:在类中的成员位置
局部内部类:在方法的局部位置
class Outer{ //成员位置 //成员内部类 class Inter{ } //Outer的成员方法 public void method(){ //局部内部类 class Inter2{ } } } class OuterDemo2{ public static void main(String[] args){ } }
成员内部类
/* 成员内部类(非静态)的访问特点: 外部类名.内部类名 对象名 = 外部类对象.内部类对象; */ //定义外部类 class Outer{ private int num = 20 ; //成员内部类 class Inter{ public void show(){ System.out.println("show inter...") ; } } } //测试 class OuterDemo3{ public static void main(String[] args){ //需求:访问外部类中的内部类的成员 //Inter i = new Inter() ; //i.show() ; //外部类名.内部类名 对象名 = 外部类对象.内部类对象; Outer.Inter oi = new Outer().new Inter() ; oi.show() ; } }
/* 成员内部类(静态)的访问特点: 外部类名.内部类名 对象名 = new 外部类名.内部类名(); */ //外部类 class Outer{ public int num = 10 ; public static int num2 = 30 ; //有静态的成员内部类 public static class Inter{ //成员内部类被静态修饰,可以看成是外部类的一个成员 public void show(){ //System.out.println(num) ; //无法从静态上下文中引用非静态 变量 num System.out.println(num2) ; } public static void show2(){ //System.out.println(num) ;//无法从静态上下文中引用非静态 变量 num System.out.println(num2) ; } } } //测试 class OuterDemo4{ public static void main(String[] args){ //外部类名.内部类名 对象名 = 外部类对象.内部类对象; //Outer.Inter oi = new Outer().new Inter() ;//限定的新静态类 不适合静态的成员内部类 //外部类名.内部类名 对象名 = new 外部类名.内部类名(); Outer.Inter oi = new Outer.Inter() ; oi.show(); oi.show2(); System.out.println("------------") ; //show2()的访问方式:属于Inter的静态成员 Inter.show2(); //将Inter整体看成是外部类的成员(static修饰了) //链式编程格式 Outer.Inter.show2(); } }
局部内部类
1)可以访问外部类成员,包括私有 2)在外部类局部位置可以去访问局部内部类成员,创建该内部类对象,使用对象访问
class Outer{ private int num = 10 ; //成员方法 public void method(){ //局部变量 int num2 = 50 ; //局部内部类 class Inner{ //内存中 可能要被new 类名() public void show(){ System.out.println(num) ;//10 System.out.println(num2) ; } } Inner i = new Inner(); i.show() ; } } //测试 class OuterDemo5{ public static void main(String[] args){ //创建外部类对象 Outer o = new Outer(); o.method() ; } }
匿名内部类:
前提条件: 存在一个类或者接口 类:可以具体类,可以是抽象类 格式: new 类名或者接口名(){ 重写方法; } ;
interface Inter{ public abstract void show() ; public abstract void show2() ; } class Outer{ //成员方法 public void method(){ //使用匿名内部类的方式实现接口中的show(){} /* new 类名或者接口名(){ 重写方法; } */ //整个部分:new 接口名(){重写方法} ; 就是一个子实现类对象 //接口中只有一个抽象方法 /* new Inter(){ public void show() { System.out.println("show Inter...") ; } }.show() ; */ //如果接口中的有多个抽象方法 /* new Inter(){ public void show() { System.out.println("show Inter...") ; } public void show2() { System.out.println("show Inter...") ; } }.show(); new Inter(){ public void show() { System.out.println("show Inter...") ; } public void show2() { System.out.println("show2 Inter...") ; } }.show2(); */ //直接使用对象名调用多个抽象 Inter i = new Inter(){ public void show(){ System.out.println("show Inter...") ; } public void show2() { System.out.println("show2 Inter...") ; } }; //调用 i.show(); i.show2(); } } //测试 class OuterDemo6{ public static void main(String[] args){ Outer o = new Outer() ; o.method() ; } }