• 内部类_Java


    作者:爱塔居的博客_CSDN博客-JavaSE领域博主

    专栏:JavaSE

    文章目录

    目录

    文章目录

    一、内部类的概念

    二、内部类的分类

    1.静态内部类(被static修饰)

    2.非静态内部类

     3.局部内部类

     4.匿名内部类


    一、内部类的概念

    当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。

    内部类也是封装的一种体现。

    public class OutClass{

     class InnerClass{

    ……

          }

    }

    🍵OutClass是外部类,InnerClass是内部类

    二、内部类的分类

    🥑内部类分为:

    1.静态内部类

    2.非静态内部类/实例内部类

    3.局部内部类

    4.匿名内部类

    1.静态内部类(被static修饰)

    静态内部类当中,不能直接访问内部类的非静态成员。

    通过这个代码,我们主要注意怎么实例化对象,还有如何访问外部类的非静态变量。

    1. class Outer {
    2. public int a1=1;
    3. private int a2=2;
    4. static public int a3=3;
    5. static class Inner{
    6. public int a4=4;
    7. private int a5=5;
    8. public void func(){
    9. Outer outer=new Outer();
    10. System.out.println(outer.a1);//通过引用,访问外部类的非静态成员
    11. System.out.println(outer.a2);
    12. System.out.println(a3);
    13. System.out.println(a4);
    14. System.out.println(a5);
    15. }
    16. }
    17. }
    18. public class Test{
    19. public static void main(String[] args) {
    20. Outer.Inner inner=new Outer.Inner();//静态内部类的实例化
    21. inner.func();
    22. }
    23. }

    2.非静态内部类

    1. class Outer {
    2. public int a1=1;
    3. private int a2=2;
    4. static public int a3=3;
    5. class Inner{
    6. public int a4=4;
    7. private int a5=5;
    8. public void func(){
    9. Outer outer=new Outer();
    10. System.out.println(outer.a1);
    11. System.out.println(outer.a2);
    12. System.out.println(a3);
    13. System.out.println(a4);
    14. System.out.println(a5);
    15. }
    16. }
    17. }
    18. public class Test{
    19. public static void main(String[] args) {
    20. Outer outer=new Outer();
    21. Outer.Inner inner=outer.new Inner();
    22. inner.func();
    23. }
    24. }

    当外部类和内部类有同名变量时:

    1. class Outer {
    2. public int a1=1;
    3. class Inner{
    4. public int a1=2;
    5. public void func(){
    6. Outer outer=new Outer();
    7. System.out.println(outer.a1);
    8. System.out.println(Inner.this.a1);
    9. }
    10. }
    11. }
    12. public class Test{
    13. public static void main(String[] args) {
    14. Outer outer=new Outer();
    15. Outer.Inner inner=outer.new Inner();
    16. inner.func();
    17. }
    18. }

    输出:

    注意: 

    1. class Outer {
    2. public int a1=1;
    3. class Inner{
    4. static final public int a1=2;//加上final就相当于常量。否则会报错。因为static静态类是不依赖对象的。
    5. public void func(){
    6. Outer outer=new Outer();
    7. System.out.println(outer.a1);
    8. System.out.println(Inner.this.a1);
    9. }
    10. }
    11. }
    12. public class Test{
    13. public static void main(String[] args) {
    14. Outer outer=new Outer();
    15. Outer.Inner inner=outer.new Inner();
    16. inner.func();
    17. }
    18. }

     3.局部内部类

     定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少。

    1. class Outer {
    2. public int a=1;
    3. public void method(){
    4. int b=10;
    5. class Inner{
    6. public void func(){
    7. Outer outer=new Outer();
    8. System.out.println(a);
    9. System.out.println(b);
    10. }
    11. }
    12. Inner inner=new Inner();
    13. inner.func();
    14. }
    15. }
    16. public class Test{
    17. public static void main(String[] args) {
    18. Outer outer=new Outer();
    19. outer.method();
    20. }
    21. }

    🍧局部内部类不能被public,static等访问修饰限定符修饰。同时,只能在该方法体内部使用,其他位置都不能使用。

     4.匿名内部类

    1. interface IA{
    2. void func();
    3. }
    4. class AA implements IA{
    5. public void func(){
    6. System.out.println("hello");
    7. }
    8. }
    9. public class Test{
    10. public static void main(String[] args) {
    11. new IA(){//这个类没有名字,所以叫匿名内部类
    12. public void func(){
    13. System.out.println("hi");
    14. }
    15. }.func();
    16. }
    17. }

    输出结果:


  • 相关阅读:
    LeetCode中等题之面试题 01.08. 零矩阵
    【成为红帽工程师】第一天 例行性工作与chrony服务器
    DNS域名解析
    LeetCode中等题之分数加减运算
    微信小程序之自定义组件开发
    【k8s】:Pod的生命周期详解
    各种排序算法的分析及java实现
    用户级协议和框架:DPDK、SPDK和VPP的业务场景和发展趋势
    深度剖析OpenHarmony 3GPP 协议开发
    Python-Django 项目模块-使用自定义管理应用-登录(十二)
  • 原文地址:https://blog.csdn.net/m0_65683419/article/details/127967007