内部类

    科技2024-07-02  69

    ##内部类

    内部类是嵌套类的一种,它不用static关键字修饰,即非静态的“类中类”。它分为成员内部类、局部内部类和匿名内部类三种。在访问权限上,外部类或接口修饰符只能是public或默认的;如果是成员内部类或接口,则四种访问权限都可以,即要求内部类或接口必须像成员变量那样直接定义在外部类中;如果是局部内部类,不允许添加任何访问控制符,就像局部变量一样。

    package sunn; //外部类或接口修饰符只能是public或默认的 public class Test1 { //如果是内部类或接口,则四种访问权限都可以,要求内部类或接口必须像成员变量那样直接定义在外部类中 private class Heart{ } public static void main(String[] args) { int age = 12;//局部变量 class Body{//和局部变量一样,局部内部类不允许添加任何访问控制符 } } }

    以下面的代码为例,首先创建一个外部类Body,再其内部创建一个内部类Heart,最后在分别为外部类和内部类各自创建一个代码块。 有名字的内部类对象的创建语法格式如下,它必须指明哪个对象的内部类。

    内部类名  变量名 = 外部类对象名.new 内部类名();

    package body; public class Body { //内部类 class Heart{//有名字的内部类 public void work() { System.out.println("正在跳动......"); } { System.out.println("内部类代码块"); } } { Heart heart = new Heart();//默认有个this,代表一个大的对象 System.out.println("代码块"); } public static void main(String[] args) { Body body = new Body(); Heart heart = body.new Heart();//内部类的创建必须指明哪个对象的内部类 heart.work(); } }

    以上代码中,根据主方法的顺序,先执行外部类的代码块,在此代码块中再先执行内部类的代码块,所以先输出“内部类代码块”“代码块”;主方法第二行,再一次创建内部类对象,执行代码块,输出“内部类代码块”;最后一行调用,输出“正在跳动......”。

    匿名内部类就是没有“内部类名”的内部类,其语法格式如下:

    外部类名 外部类对象名 = new 外部类名() {

    };

    匿名内部类创建的对象一定是普遍类或抽象类的子类对象或者是接口的实现类对象。所以,匿名内部类主要用于“重写”父类方法或“实现”抽象方法。

    package body; public class Mammal { public void move() { System.out.println("正在移动......"); } } package body; public class Body { static Mammal mammal = new Mammal() {//匿名内部类 //匿名内部类创建的对象一定是普遍类或抽象类的子类对象,一定是接口的实现类对象 @Override public void move() { System.out.println("靠鳍游动......"); } public void eat() { System.out.println("正在吃......"); } }; public static void main(String[] args) { mammal.move(); } }

    从语法上讲,匿名内部类中也可以定义新的属性和方法,此时就是一个上转型变量,所以mammal.eat();无法实现,故而没有必要。

    含有内部类的文件编译后的命名格式为:有名内部类是“外部类$内部类.class”,匿名内部类为“外部类$数值.class”。编译以下代码后,打开文件所在路径如下。

    package body; public class Test { //有名内部类编译后生成:外部类$内部类.class class A { } //匿名内部类编译后生成:外部类$数值.class Object object = new Object() { }; Object ob = new Object() { }; }

     

     

    Processed: 0.013, SQL: 8