1.1内部类的概述
内部类:就是在一个类中定义一个类。举例:在一个类A的内部类定义一个类B,类B就被称为内部类
内部类的定义格式
-
格式:
-
范例:
内部类的访问特点:
-
内部类可以直接访问外部类的成员,包括私有
-
外部类要访问内部类的成员,必须创建对象
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(); } }
1.2 成员内部类
按照内部类在类中定义的位置不同,可以分为如下两种方式
-
在类的成员位置:成员内部类
-
在类的局部位置:局部内部类
成员内部类,外界如何创建对象使用?
-
格式:外部对象名.内部对象名 对象名 = 外部对象.内部类对象;
-
范例:Outer.Inner or = new Outer().new Inner();
内部类
public class Outer { private int num = 10; /*public class Inner{ public void show(){ System.out.println(num); } }*/ private class Inner{ public void show(){ System.out.println(num); } } public void method(){ Inner i = new Inner(); i.show(); } }
测试类
public class InnerDemo { public static void main(String[] args) { //创建内部类对象,并调用方法 /*Outer.Inner or = new Outer().new Inner(); or.show();*/ Outer or = new Outer(); or.method(); } }
1.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 OuterDemo { public static void main(String[] args) { Outer or = new Outer(); or.method(); } }
1.4 匿名内部类
前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
-
格式:
-
范例:
本质:是一个继承了该类或者实现了该接口的子类匿名对象
接口类
public interface Inter { void show(); }
内部类
public class Outer { public void method(){ /*new Inter(){ @Override public void show() { System.out.println("匿名内部类"); } };*/ /* 单次调用 */ /*new Inter(){ @Override public void show() { System.out.println("匿名内部类"); } }.show();*/ Inter i = new Inter(){ @Override public void show() { System.out.println("匿名内部类"); } }; i.show(); i.show(); i.show(); } }
测试类
public class OuterDemo { public static void main(String[] args) { Outer or = new Outer(); or.method(); } }
1.5 匿名内部类在开发中的使用
接口
public interface Jumpping { void jump(); }
接口实现类
public class Cat implements Jumpping { @Override public void jump() { System.out.println("猫可以跳高了 "); } }
接口操作类
public class JumppingOperator { public void method(Jumpping j){ j.jump(); } }
测试类
public class JumppingDemo { public static void main(String[] args) { //需求,创建接口操作类的对象,调用method方法 JumppingOperator jo = new JumppingOperator(); Jumpping j = new Cat(); jo.method(j); //如果多了,而且只用一次,每次都创建过于麻烦 jo.method(new Jumpping() { @Override public void jump() { System.out.println("小狗也可以跳高了"); } }); } }