内部类的介绍和分类、静态内部类、非静态内部类、局部内部类、匿名内部类、静态非静态内部类面试题

    技术2022-07-11  94

    内部类的介绍分类

    1、内部类: 当一个类的内部,任然有一个完整的结构,这个完整的结构任然需要一个类进行描述,因为有自己的特征(属性,方法) 并且这个内部类是为外部类服务的。

    内部类:在集合中最多

    身体(Body)里面有各种的器官,例如:心脏,也是一个独立的结构,也需要一个类描述 而且这个心脏是为Body服务的,离开Body就没有意义了。

    2、分类

    (一)成员内部类 和成员变量一样,在类中,方法外 1、静态成员内部类:简称静态内部类 2、非静态成员内部类:简称成员内部类

    (二)局部内部类 在方法类 1、有名字的局部内部类:简称局部内部类(最少) 2、没名字的局部内部类:简称匿名内部类

    静态内部类

    一、静态内部类 1、如何声明? 【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{

    【修饰符】 **static** class 内部类 【extends 父类】 【implemends 父接口们】{ } }

    说明:静态内部类的修饰符 (1)权限修饰符:4个 (2)static必须有 (3)abstract可以有 (4)final可以有

    2、成员 类的五大成员都可以 (1)属性:静态的 非静态的都可以 (2)方法:静态的 非静态的都可以 在抽象的静态内部类中,还可以有抽象方法 (3)代码块:静态的和非静态 (4)构造器:无参,有参 (5)内部类,语法上可以,但是太复杂了,不这么写

    3、使用 (1)在静态内部类中不予许使用外部类的非静态的成员 (2)在外部类中使用静态内部类和使用其他的类一样 (3)在外部类的外面使用静态内部类,不需要外部类的对象 Outer.Inner (4)在外部类的外面要调用静态内部类的非静态方法,需要静态内部类的对象 例如:Outer.Inner obj = new Outer.Inner(); obj.test(); (5)在外部类的外面要调用静态内部类的静态方法,不需要静态内部类的对象 例如:Outer.Inner.method();

    4、说明: 静态内部类也有自己的字节码文件 外部类$静态内部类.class

    非静态内部类

    一、非静态内部类 1、如何声明? 【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{

    【修饰符】 class 内部类 【extends 父类】 【implemends 父接口们】{ } }

    说明:非静态内部类的修饰符 (1)权限修饰符:4个 (2)static没有 (3)abstract可以有 (4)final可以有

    2、成员 类的五大成员都可以,但是不予许有静态成员 (1)属性:非静态的都可以 (2)方法:非静态的都可以 在抽象的内部类中,还可以有抽象方法 (3)代码块:非静态 (4)构造器:无参,有参 (5)内部类,语法上可以,但是太复杂了,不这么写

    3、使用 (1)在非静态的内部类中可以使用外部类的所有成员 (2)在外部类中,使用非静态内部类有限制 在外部类的静态方法中不予许使用非静态的内部类 (3)在外部类的外面使用非静态内部类,声明变量和静态内部类一样 Outer.Inner in; (4)在外部类的外面要调用非静态内部类的非静态方法,需要外部类的对象和内部类的对象 例如:Outer out = new Outer(); Outer.Inner in = out.new Inner(); in.test();

    因为“对象.new 内部类”太怪异了,然后实际编写时,不这样写 Outer.Inner in2 = out.getInner();//方法的作用:为外界提供内部类的对象 in.test();

    //如果想要简化Outer.Inner的写法 //可以使用导包语句:import 包.Outer.Inner; Inner in3 = out.getInner(); in3.test();

    4、说明: 非静态内部类也有自己的字节码文件 外部类$非静态内部类.class

    面试题

    考点: (1)子类继承抽象类,需要重写抽象的抽象方法 (2)要使用非静态的内部类,需要外部类的对象 (3)子类继承父类时,在子类的构造器中,必须调用父类的构造器

    public class TestMianShi1 { } class Outer{ abstract class Inner{ public abstract void test(); } } /* 考点: (1)子类继承抽象类,需要重写抽象的抽象方法 (2)要使用非静态的内部类,需要外部类的对象 (3)子类继承父类时,在子类的构造器中,必须调用父类的构造器 */ class MyInner extends Outer.Inner{ //这个是重点 MyInner(Outer out){ out.super(); } public void test() { System.out.println("..."); } }

    局部内部类和静态内部类在下一篇文章中: https://blog.csdn.net/qq_41005604/article/details/107069972

    Processed: 0.011, SQL: 9