> 文章列表 > Java四种内部类(看这一篇就够了)

Java四种内部类(看这一篇就够了)

Java四种内部类(看这一篇就够了)

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习!

欢迎志同道合的朋友一起加油喔🦾🦾🦾
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心


目录

部类

1.成员内部类/实例内部类

二、局部内部类

三、静态内部类

 四、匿名内部类



内部类

  字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。

内部类是类的第五大成员→【提示:类的五大成员是哪些?[属性、方法、构造方法、代码块、内部类]】

内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

官方给的内部类优点如下:
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整;
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏;
3.方便编写事件驱动程序;
4.方便编写线程代码。

注意:内部类是学习的难点,同时也是重点,后面看底层源码时,有大量的内部类。

1.成员内部类/实例内部类

直接定义在类中,未被static定义的类,就是成员内部类

1.成员内部类的特点:

🐳 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);

🐳 同名的属性名/方法名访问外部类时 → 外部类.this.成员名

🐳 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。所以在外部类访问内部类的时候必须先实例化外部类对象

2. 成员内部类对象的创建

       🐳外部类的内部创建

              内部类名称 内部类引用 = new 内部类()

       🐳在外部类的外部创建内部类对象-内部类对外部可见(访问权限问题)

            (创建方法:外部类名称.内部类 引用 = new 外部类().new 内部类()

               成员内部类要依靠外部类才能产生所以要先创建外部对象

3. 成员方法能访问静态域  不能拥有静态域(无法定义静态变量);静态方法能访问静域  

 不能访问成员域

       🐳对于成员内部类,不呢定义一个静态属性的,因为成员内部类必须要依赖于外部类,若成员内部类有静态方属性,那么没有外部类对象也能被访问了。

       🐳对于外部类来说,不能在外部类的静态方法中使用成员内部类。比如在外部类的main方法中创建内部类对象;

代码演示:

二、局部内部类

编写在方法的内部的类称之为局部内部类,也可以称为方法内部类

局部内部类的特点

1.局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内;
2.局部内部类不可使用权限修饰符 静态(static)修饰符进行修饰 同局部变量相同;
3.局部内部类可以直接访问方法中的属性;
4.局部内部类 可以直接访问方法外部类中属性和方法;
5.局部内部类 创建对象 要在方法内部 局部内部类的外部声明。

代码演示:

三、静态内部类

直接定义在类中,被static定义的类,就是静态内部类

静态内部类特点:

1.静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static;
2.静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法;
3.静态内部类中即能声明静态成员也可以声明非静态成员。

代码演示:

 四、匿名内部类

匿名内部类只是没有类名,其他的都是具备的

匿名内部类特点:

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

🐳必须继承一个抽象类或者实现一个接口

🐳没有构造方法

总结:

(1)匿名类是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创建一个对象。
(2)匿名类可以继承父类的方法也可以重写父类的方法。
(3)使用匿名类时,必然是在某个类中直接用匿名类创建对象,以此,匿名类一定是内部类。
(4)匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法。
(5)由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法。