面向对象(五)

mac2024-05-07  27

内部类

概述:把类定义在其他类的内部,这个类就被称为内部类,比如在类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(); } }

结果:

修饰符:

private 为了保证数据的安全性

public class MyTest { public static void main(String[] args) { // Wai.Nei nei = new Wai().new Nei(); //内部类私有修饰,外界就无法创建其对象 Wai wai = new Wai(); wai.waiShow(); } } class Wai { private class Nei { int num = 20; public void neiShow() { System.out.println(num); } } public void waiShow() { Nei nei = new Nei(); nei.neiShow(); } }

结果:

static 为了方便访问数据

public class MyTest { public static void main(String[] args) { WaiBu.NeiBu neiBu = new WaiBu.NeiBu(); // 内部类可以用static 修饰, //内部类一旦静态修饰后,就只能访问外部类的静态成员 neiBu.neiShow(); neiBu.neiTest(); } } class WaiBu { static int num = 100; int aa = 200; static class NeiBu {// public void neiShow() { System.out.println(num); waiShow(); } public void neiTest() { WaiBu waiBu = new WaiBu(); System.out.println(waiBu.aa); } } public static void waiShow() {} }

结果:

注意事项:

静态内部类访问的外部类数据必须用静态修饰。 成员方法可以是静态的也可以是非静态的。 成员内部类被静态修饰后的访问方式: 格式: 外部类名.内部类名 对象名 = 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(); } }

结果:

匿名内部类

具备内部类的简化写法,前提是存在一个类或者接口,这个类可以是具体也可以是抽象类。

格式:

new 类名或者接口名(){ 重写方法; } ;

匿名内部类的本质是继承了该类或者实现了该接口的子类匿名对象。 举例,接口类似

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(); }

结果:

最新回复(0)