当前位置: 首页 > article >正文

Java之内部类

目录

实例内部类

静态内部类

局部内部类

匿名内部类


下面将讲解实例内部类,静态内部类,局部内部类和匿名内部类

实例内部类

实例内部类(也称为非静态内部类)依赖于外部类的实例。这意味着,要创建实例内部类的实例,你必须先创建外部类的实例。实例内部类可以访问外部类的所有成员(包括私有成员),而不需要任何特殊条件。

1.如何获取实例内部类?

   获取实例内部类对象依赖于外部类对象,通过 new 外部类.new 内部类

   或者外部类.new 内部类。

2.在实例内部类中,可以定义被final修饰的静态的成员变量,例如public static final int x=6;

   但是不能定义没有被final修饰的静态的成员变量,例如public static int x=6。

解释:

   因为x被final修饰,此时x为常量,类加载的时候不回家住普通的成员变量,实例内部类中

   又存在static,而static是在类加载的时候创建的。

3.当外部类中的数据成员和内部类中的数据成员一样的时候,如何在内部类中访问外部类中同名的成员,通过    外部类.this.  来进行访问。

class OuterClass {
    //
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;


    class InnerClass {
        public int data1 = 1111;
        public int data4 = 4;
        private int data5 = 5;

        public static final int data6 = 6;

        public void test() {
            System.out.println(this.data1);
            System.out.println(OuterClass.this.data1);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println("内部类的test方法");
        }
    }

    public void test() {
        System.out.println("外部类的test方法");
        InnerClass innerClass = new InnerClass();
        System.out.println(innerClass.data4);
    }
}


public class Test {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        //System.out.println(outerClass.data1);

        //获取实例内部类对象的时候 依赖于外部类对象
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.test();

        //上面的outerClass.new InnerClass()是new OuterClass().new InnerClass()的简化形式
        OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();
        innerClass2.test();
    }
}
静态内部类

静态内部类不依赖于外部类的实例。它类似于外部类中的其他静态成员,可以通过外部类名直接访问(如果它是public或protected的)。

1.如何获取静态内部类对象

   通过new  外部类类名.内部类    的方式来获取。

2.如何在静态内部类中访问外部类的非静态的成员

   通过在内部类中new创建一个外部类对象,然后通过   外部类.成员    的方式来访问。

class OuterClass2 {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;


    static class InnerClass {

        //public int data1 = 111;
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;

        public void test() {
            OuterClass2 outerClass2 = new OuterClass2();
            System.out.println(outerClass2.data1);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("内部类的test方法");
        }
    }
}

public class Test1 {

    public static void main(String[] args) {
        OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
        innerClass.test();
    }
}
局部内部类

局部内部类是定义在方法、构造器或初始化块内部的类。局部内部类只能在其定义的作用域内被访问,并且不能包含静态成员。局部内部类可以访问其外部类的所有成员以及定义它的方法或构造器中的局部变量(但局部变量必须是final或实际上是final的,从Java 8开始,这个限制放宽,只要局部变量是effectively final即可)。

public void func() {
    class Inner {
        public int data1 = 1;
    }

    Inner inner = new Inner();
    System.out.println(inner.data1);
}
匿名内部类

匿名内部类是没有名称的内部类,它通常用于简化代码。它通常用于实现接口或继承其他类(只能继承非抽象类)的匿名子类。由于它没有名称,因此你不能直接引用它。匿名内部类常用于只使用一次的简单对象。

interface A {
    void test();
}
public class Test2 {
    public static void main(String[] args) {
        int val = 10;
        //val = 100;

        A a = new A(){
            @Override
            public void test() {
                //默认在这里能访问的是 被final修饰的
                System.out.println("值:"+ val);
                //在匿名内部类当中 能够访问的是 没有被修改过的数据-->变量的捕获
            }
        };
        a.test();


        System.out.println(val);
    }
}


http://www.kler.cn/news/282896.html

相关文章:

  • 浅谈Kafka(三)
  • 深度学习基础--深度学习网络
  • 服务器内存飙升分析小记
  • PostgreSQL遍历所有的表并设置id为自增主键(基于自建函数)
  • FineReport帆软报表:使用JAVA批量更新报表里的数据集连接名
  • 【python量化分析专题】最新整理的已经实测可用的各类免费股票数据接口之实时交易数据
  • 『大模型笔记』林纳斯·托瓦兹(Linux之父):谈论热议与人工智能的未来!
  • Linux 网络技术栈,看这篇就够了!!
  • 【ACM独立出版 | 厦大主办】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024,10月18-20)
  • 基于web 在线影院系统网站设计与实现
  • 交通流量监测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • Qt 调用执行 Python 函数
  • zookeeper服务器动态上下线监听案例
  • 【MySQL数据库管理问答题】第4章 配置 MySQL
  • SpringBoot应用打成ZIP部署包
  • 18.神经网络 - 非线性激活
  • 【机器学习】梯度下降算法
  • 源码编译并安装Squid的方法
  • BEVDet4D:多帧时序信息融合方法详解
  • 富格林:正规方式顺利盈利出金
  • 性能测试的基本概念
  • Pycharm安装报错:Cannot detect a launch configuration 解决办法
  • 吴恩达机器学习笔记 四十五 基于内容的过滤的tensorFlow实现
  • 怎么解决 hash 碰撞,用 C++ 实现 hashMap?
  • Nosql数据库redis集群配置详解
  • Nginx轮询负载均衡配置指南:实现高效请求分发
  • docker常用命令使用dockerfile构建镜像,推送到私有镜像仓库
  • 【AI绘画】Midjourney前置指令/describe、/shorten详解
  • 适配算能BM1684开发板,bmodel推理模型转换
  • 矩阵分块乘法的证明