概述:把类定义在其他类的内部,这个类就被称为内部类,比如在类A中定义了一个类B,类B就是内部类。 访问特点:内部类可以直接访问外部类的成员,包括私有。外部类要访问内部类的成员,必须创建对象。 分类: 成员内部类:在成员位置定义的类。 局部内部类:在局部位置定义的类。
访问内部类的成员: 格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象; public class MyTest { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.neiShow(); System.out.println(inner.bb); Outer outer = new Outer();//外部类访问内部类,在外部类的方法内创建内部类对象 outer.test(); } } class Outer { int num = 20; private int aa = 100; //定义成员内部类 class Inner { int bb = 20; public void neiShow() { System.out.println("这是内部类的show方法"); System.out.println(num); System.out.println(aa); waiShow(); waiTest(); } public void neiTest() { System.out.println("这是内部类的test方法"); } } public void waiShow() { System.out.println("这是外部类的show方法"); } private void waiTest() { System.out.println("这是外部类私有的方法"); } public void test() { //创建内部类的对象 Inner inner = new Inner(); System.out.println(inner.bb); inner.neiTest(); } }静态内部类访问的外部类数据必须用静态修饰。 成员方法可以是静态的也可以是非静态的。 成员内部类被静态修饰后的访问方式: 格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
局部内部类可以直接访问外部类的成员,也可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。 局部内部类访问局部变量必须使用final修饰,因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用哪个变量,为了数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。(JDK1.8后会默认加上)
public class MyTest { public static void main(String[] args) { Wai wai = new Wai(); wai.waiShow(); } } class Wai { int num = 30; public void waiShow() { class Nei { int num = 20; public void neiTest() { int num = 10; System.out.println(num); System.out.println(new Nei().num); System.out.println(new Wai().num); Nei nei = new Nei(); nei.neiShow(); } public void neiShow() { System.out.println("chvgjb"); } } new Nei().neiTest(); } }结果:
具备内部类的简化写法,前提是存在一个类或者接口,这个类可以是具体也可以是抽象类。
匿名内部类的本质是继承了该类或者实现了该接口的子类匿名对象。 举例,接口类似
public class MyTest { public static void main(String[] args) { new EE() { @Override public void hehe() { System.out.println("呵呵"); } @Override public void haha() { System.out.println("哈哈"); } }.haha(); new EE() { @Override public void hehe() { System.out.println("呵呵222"); } @Override public void haha() { System.out.println("哈哈2222"); } }.hehe(); //用多态的方式 给对象起个名字 EE ee = new EE() { @Override public void hehe() { System.out.println("呵呵222333"); } @Override public void haha() { System.out.println("哈哈22223333"); } }; ee.haha(); ee.hehe(); } } abstract class EE { public abstract void hehe(); public abstract void haha(); }结果: