1.内部类概述
内部类:在一个类中定义一个类。(在一个类A的内部定义一个类B,类B就被称为内部类)
内部类的定义格式
-
格式:
public class 类名{ 修饰符 class 类名{ } }
-
范例:
public class Outer{ public class 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(); } }
2.成员内部类
按照内部类在类中定义的位置不同,可以分为两种形式
-
在类的成员位置:成员内部类
-
在类的局部位置:局部内部类
2.1成员内部类
测试中创建对象使用成员内部类。
-
格式:外部类名**.内部类名 对象名 = 外部类对象.**内部类对象
-
例:
Outer.Inner o = new Outer().new Inner();
2.2局部内部类
局部内部类是在方法中定义的类,外界是无法直接使用的,需要在方法内部创建对象并使用该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
3.匿名内部类
前提:存在一个类或者接口,类可以是具体类也可以是抽象类
本质:是一个继承了该类或者实现了该接口的子类匿名对象
-
格式:
new 类名或者接口名(){ 重写方法; };
-
范例:
new Inner(){ public void show(){ } }
3.1匿名内部类的使用
-
定义一个接口:
package 匿名内部类; public interface Jumpping { void Jump(); }
-
接口操作类,有一个方法,方法参数是接口名
package 匿名内部类; public class Jumppingoperator { public void method(Jumpping j){//new Cat(); j.Jump(); } }
-
实现类
package 匿名内部类; public class Cat implements Jumpping{ @Override public void Jump() { System.out.println("猫可以跳高了"); } }
-
测试类
package 匿名内部类; public class JumppingDemo { public static void main(String[] args) { Jumppingoperator j=new Jumppingoperator(); Jumpping c=new Cat(); j.method(c); System.out.println("------------------"); j.method(new Jumpping() { @Override public void Jump() { System.out.println("猪可以飞了"); } }); } }