Java~对于代码块与内部类的理解

news2024/11/23 21:31:47

目录

代码块

普通代码块

构造代码块

静态代码块

内部类 

成员内部类

普通内部类

静态内部类

 局部内部类


代码块

使用“{}”定义的一段代码成为代码块,代码块分为普通代码块、构造代码块、匿名代码块、同步代码块。

普通代码块

定义在方法中的代码,普通代码块中定义的变量仅能在代码块中使用

public class TestDemo3 {
    public static void main(String[] args) {
        {
            int x = 10;
            System.out.println("x1 = " + x);
        }
        int x = 100;
        System.out.println("x2 = " + x);
    }
}

如下图所示,普通代码块中定义的变量仅在代码块中生效 

 

构造代码块

定义在类中的额代码块称为构造代码块(实例代码块),构造代码块一般用于初始化实例成员变量。

public class TestDemo4 {
    //实例成员变量
    private String name;
    private int age;
    private String sex;
    public TestDemo4() {
        System.out.println("构造方法初始化");
    }
    //实例代码块
    {
        this.name = "啊~";
        this.age = 10;
        this.sex = "男";
        System.out.println("实例代码块初始化");
    }
    public void show() {
        System.out.println("name=" + this.name +
                ",age=" + this.age +
                ",sex=" + this.sex);
    }

    public static void main(String[] args) {
        TestDemo4 t1 = new TestDemo4();
        t1.show();
    }
}

实例代码块优先于构造方法执行,因为编译完成后,编译器会将实例代码块的代码拷贝到每个构造方法第一条语句前。

 

静态代码块

使用static定义的代码块成为静态代码块,一般用于初始化静态成员变量

public class TestDemo4 {
    //实例成员变量
    private String name;
    private int age;
    private String sex;
    private static String className;
    public TestDemo4() {
        System.out.println("构造方法初始化");
    }
    //实例代码块
    {
        this.name = "啊~";
        this.age = 10;
        this.sex = "男";
        System.out.println("实例代码块初始化");
    }
    //静态代码块
    static {
        className = "计201";
        System.out.println("静态代码块执行");
    }
    public static void main(String[] args) {
        System.out.println("=======t1=======");
        TestDemo4 t1 = new TestDemo4();
        System.out.println("=======t2=======");
        TestDemo4 t2 = new TestDemo4();
    }
}

· 静态代码块无论new多少个对象,都只会执行一次 

· 静态成员变量是类的属性,在JVM加载类开辟空间时就会初始化静态成员变量

· 如果一个类中包含多个静态代码块,编译器会按照编译的先后次序来合并放在生成的<init>方法中,该方法在类加载时调用,且只执行一次

· 实例代码块只有在创建对象时才会执行

 

内部类 

例如下述代码所示,OutClass是InnerClass的外部类,InnerClass是OutClass的外部类。内部类和外部类共用一个java源文件,但编译过后,内部类会形成单独的字节码文件

public class OutClass {
    class InnerClass {
    }
}

成员内部类

在外部类中,内部类定义的位置与外部类成员所处的位置相同,称该内部类为成员内部类

普通内部类

未被static修饰的成员内部类称为普通内部类

public class OutClass {
    private int a;
    static int b;
    int c;
    public void methodA() {
        a = 10;
        System.out.println("a=" + a);
    }
    public void methodB() {
        System.out.println("b=" + b);
    }
    //成员内部类,未被static修饰
    class InnerClass {
        int c;
        //在内部类中可以直接访问外部类中修饰任意访问限定符修饰的成员变量
        public void innerMethod() {
            a = 100;
            b = 200;
            methodA();
            methodB();
            //如果外部类与内部类成员变量名相同,优先访问内部类的
            c = 300;
            System.out.println("c=" + c);
            //如果要访问外部类同名成员变量时,要使用外部类名称.this.同名成员名字
            System.out.println(OutClass.this.c);
        }
    }

    public static void main(String[] args) {
        //外部类,对象的创建以及成员的访问
        OutClass outClass = new OutClass();
        System.out.println(outClass.a);
        System.out.println(outClass.b);
        System.out.println(outClass.c);
        outClass.methodA();
        outClass.methodB();
        System.out.println("==========内部类的访问=========");
        //要访问内部类中的成员,就要先创建内部类对象
        //普通内部类定义与外部类成员定义位置相同,因此创建普通内部类对象时必须借用外部类对象
        OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();
        //也可以先将外部类对象创建出来,再创键内部类对象
        OutClass.InnerClass innerClass2 = outClass.new InnerClass();
        innerClass2.innerMethod();
    }
}

 

对于普通内部类的总结

1、外部类中的任何成员都可以在普通内部类中被使用

2、普通内部类与外部类成员变量所处位置相同,因此也受public、private等修饰限定符的限制

3、在内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类的成员需要使用外部类名称.this.成员变量名

4、要创建普通内部类对象,必须先创建外部类对象

5、外部类不能直接访问内部类的成员变量,如果要访问,必须先创建内部类对象 

静态内部类

被static修饰的内部成员类称为静态内部类

public class TestOutClass {
    private int a;
    static int b;
    public void methodA() {
        a = 100;
        System.out.println("a = " + a);
    }
    public static void methodB() {
        b = 200;
        System.out.println("b = " + b);
    }

    //静态内部类,被static修饰的成员内部类
    static class TestInnerClass {
        public void innerMethod() {
            //在静态内部类中只能访问外部类的静态成员变量
            //System.out.println(a); //报错,无法访问非静态成员变量
            System.out.println(b);
            //methodA();  //报错,无法访问非静态成员方法
            methodB();
        }
    }

    public static void main(String[] args) {
        //静态内部类对象的创建与其成员的访问
        TestOutClass.TestInnerClass innerClass = new TestOutClass.TestInnerClass();
        innerClass.innerMethod();
    }
}

 

对于静态内部类的总结

1、在静态内部类中只能访问外部类的静态成员变量或方法

2、创建静态内部类对象时不需要先创建外部类对象 

 局部内部类

定义在外部类的方法体或{}中,该种内部类只能在其定义的位置使用

public class OutClass1 {
    int a = 10;
    public void method() {
        int b = 10;
        //局部内部类,定义在方法体内部
        //不能被public private等限定符修饰
        class InnerClass1 {
            public void innerClassMethod() {
                System.out.println(a);
                System.out.println(b);
            }
        }
        InnerClass1 innerClass1 = new InnerClass1();
        innerClass1.innerClassMethod();
    }
}

局部内部类只能在方法体内部使用,不能被修饰限定符所修饰 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【go语言之thrift协议一】

go语言之thrift协议thrift文件shared.thriftSharedStructSharedServiceSharedServiceProcessorSharedServiceGetStructArgsSharedServiceGetStructResulttutorial.thrift基本数据类型引入其他thrift文件自定义类型定义常量enum继承thrift 相对于grpc而言&#xff0c;可能用的不…

逆向-还原代码之max 再画堆栈图 (Interl 64)

// source code #include <stdio.h> void max(int * a, int * b) { if (*a < *b) *a *b; } int main() { int a 5, b 6; max(&a, &b); printf("a, b max %d\n", a); return 0; } // 再画堆栈图 下周一&#xff08;2.27…

JavaEE简单示例——MyBatis关联映射

简单介绍&#xff1a; 在我们之前的案例中&#xff0c;我们进行了简单查询&#xff0c;条件产村&#xff0c;动态SQL的条件查询&#xff0c;但是这些操作都是在一张表中进行的&#xff0c;而在我们之前学习MySQL中还有一个很重要的操作就是多表查询操作&#xff0c;也就是说通…

图像亮度调整

非线性方式 调整图像的方法有很多&#xff0c;最常用的方法就是对图像像素点的R、G、B三个分量同时进行增加&#xff08;减少&#xff09;某个值&#xff0c;达到调整亮度的目的。即改变图像的亮度&#xff0c;实际就是对像素点的各颜色分量值做一个平移。这种方法属于非线性的…

适用于产研团队协作工具有哪些?盘点6大类协同办公软件

团队协作工具在提高团队协作效率、质量和灵活性&#xff0c;降低成本等方面都有着不小的作用。而根据协作内容、团队等特点的不同&#xff0c;团队协作工具可以分为多种类型&#xff0c;常见的包括&#xff1a;即时通讯工具&#xff0c;用于实时交流和沟通&#xff0c;其中又可…

SpringBoot整合JPA+人大金仓(kingbase8)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Jpa框架整合人大金…

Spring Cloud Nacos源码讲解(三)- Nacos客户端实例注册源码分析

Nacos客户端实例注册源码分析 实例客户端注册入口 流程图&#xff1a; 实际上我们在真实的生产环境中&#xff0c;我们要让某一个服务注册到Nacos中&#xff0c;我们首先要引入一个依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><…

Bootstrap入门到精通(最全最详细)

文章目录前言一、Bootstrap是什么&#xff1f;二、Bootstrap安装方式一&#xff1a;将压缩包下载到本地引入使用方式二&#xff1a;使用Bootstrap官方cdn二.Bootstrap容器下面是屏幕宽度在不同大小时不同容器的显示状态三.Bootstrap栅格系统bootstrap网格系统有以下六个类网格系…

上岸!选择你的隐私计算导师!

开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…

剑指 Offer 55 - I. 二叉树的深度

摘要 剑指 Offer 55 - I. 二叉树的深度 一、深度优先搜索 如果我们知道了左子树和右子树的最大深度l和r&#xff0c;那么该二叉树的最大深度即为&#xff1a;max(l,r)1。 而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计…

JTT808jt1078

List item 前言 交通部与2016年10月份推出了JT/T 1078-2016标准&#xff0c;全称是<道路运输车辆卫星定位系统视频通信协议> 实时音视频传输指令 实时音视频传输请求 消息 I&#xff24;&#xff1a;&#xff10;x9101。 报文类型&#xff1a;信令数据报文。 平台向终…

C语言深入知识——(1)整形数据和浮点数据的存储

1、数据类型的介绍 类型的意义&#xff1a; 使用对应类型能开辟对应内存空间的大小&#xff08;使用范围&#xff09;还有C语言对待不同类型&#xff0c;会采用不同的内存空间视角来看待一个数据 C语言中类型的基本归类&#xff1a; 整型&#xff08;内置类型&#xff09;浮点…

SAP ABAP——SAP简介(六)【ABAP技术栈简介】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读&#xff0c;阿里云社区专家博主&#xff0c;华为云社区云享专家&#xff0c;CSDN SAP应用技术领域新兴创作者。   在学习工…

黑吃黑的 Prynt Stealer 在恶意软件中嵌入后门

窃密对于网络犯罪来说&#xff0c;始终都是不可缺少的一部分。攻击者可以通过窃密获取更多信息&#xff0c;来判断攻击目标的价值高低&#xff0c;从而最大化自己的利益。为了使技术不太高的普通攻击者也能够使用&#xff0c;包括 Prynt Stealer 在内的信息窃取类恶意软件通常都…

工赋开发者社区 | 工业数字孪生:西门子工业网络与设备虚拟调试案例(TIA+MCD+SINETPLAN)

PART1案例背景及基本情况新生产系统的设计和实施通常是耗时且高成本的过程&#xff0c;完成设计、采购、安装后&#xff0c;在移交生产运行之前还需要一个阶段&#xff0c;即调试阶段。如果在开发过程中的任何地方出现了错误而没有被发现&#xff0c;那么每个开发阶段的错误成本…

Linux服务:Nginx服务重写功能

目录 一、重写功能 1、重写功能作用 2、rewrite指令 ①if指令 ②return指令 ③ set指令 ④break指令 3、rewrite标志 ①redirect标志 ②permanent标志 ③break标志 ④last标志 ⑤rewrite标志实验 一、重写功能 1、重写功能作用 重写功能(rewrite)用于实现URL的重…

CentOS 8利用Apache安装部署下载服务器

1&#xff1a;部署的目的是做一个类似下面开源镜像网站&#xff0c;把一些软件或者资料上传到服务器上面&#xff0c;减少用户在互联网上下载资料&#xff0c;提高效率&#xff0c;减少病毒。 2&#xff1a;使用下面的命令配置本机的IP地址主机名等信息。后期使用IP地址进行访问…

CRF条件随机场 | 关键原理+面试知识点

&#x1f604; CRF之前跟人生导师&#xff1a;李航学习过&#xff0c;这里结合自己的理解&#xff0c;精简一波CRF&#xff0c;总结一下面试中高频出现的要点。个人觉得没网上说的那么复杂&#xff0c;我看网上很大部分都是一长篇先举个例子&#xff0c;然后再说原理。没必要原…

webservice接口开发详解(.Net)

环境&#xff1a;win10 工具:Visual Studio2015 语言&#xff1a;vb.net WebService: 1.打开vs2015&#xff0c;新建visual basic项目&#xff0c;选择ASP.NET Web应用程序&#xff0c;单击确定 2.右键解决方案&#xff0c;添加新建项-Web-Web 服务(ASMX) 3.生成的WebServi…

Qt QMAKE_MSC_VER

文章目录摘要修改conf文件参考链接关键字&#xff1a; Qt、 QMAKE_MSC_VER 、 conf、 version、 关键字5摘要 今天在又有了新的小项目需要CV一下&#xff0c;但是第三方提供的是COM组件的库&#xff0c;所以第一步还是老实使用VS版本的Qt 来开发&#xff0c;以防不测&#xf…