Java类中final/static修饰的成员变量初始化问题

2023-05-16

文章目录

  • 问题1:final修饰基本数据类型(final修饰成员变量的初始化方法)
    • 1.代码
    • 2.分析
  • 问题2:final修饰静态成员变量的初始化方法
    • 1.代码
    • 2分析
    • 3.问题2.1
  • 问题3:final修饰引用类型的初始化以及注意点
    • 1.代码
    • 2分析
  • 问题4:为什么对于一个public类型的final的成员变量,一般都要声明为static的?

问题1:final修饰基本数据类型(final修饰成员变量的初始化方法)

1.代码

  • 问下述代码能否编译通过
public class Demo01 {

    private final int a;

    private String name;

    public Demo01(){
        a = 3;
    }

    public Demo01(String name){
        this.name = name;
    }

}

2.分析

  • 上述代码无法编译通过

在这里插入图片描述

  • 关于final修饰的成员变量的初始化有两种方法

    • 1.在定义的时候就赋予一个值
    • 2.在构造函数中完成初始化,因为当实例化该类的一个对象的时候,一定会调用一个构造方法,但是这也带来了一个问题,就是我们无法事先知道,会调用哪一个构造方法,如果采用这种方式,就一定要保证在每一个构造函数中都对该final变量进行初始化
  • 修改上述代码,在每一个构造函数中都对final修饰的变量初始化后可以正常编译
    在这里插入图片描述

问题2:final修饰静态成员变量的初始化方法

1.代码

  • 问下述代码能否编译通过,一个静态的final变量的初始化问题
public class Demo01 {

    private static final int a;

    private String name;

    public Demo01(){
        a = 3;
    }

    public Demo01(String name){
        a = 3;
        this.name = name;
    }

}

2分析

  • 无法编译通过

在这里插入图片描述

  • 一个静态变量在类加载完之后,实例化为对象之前就被加载了,而此时又被final修饰,所以必须要求有值!,所以这种情况下只能显式的进行初始化
  • 如果把代码改成下述看能否编译通过呢?

3.问题2.1

public class Demo01 {

    private static final int a = 3;

    private String name;

    public Demo01(){
        a = 3;
    }

    public Demo01(String name){
        a = 3;
        this.name = name;
    }

}
  • 也无法编译通过
    在这里插入图片描述

  • 至于原因,图中提示得很清楚了,不能给一个final修饰的变量赋值

  • 因为在构造方法一定会被调用的,所以一定会发现给一个final修饰的变量赋值的情况,所有只有改成下面的方式才可以编译通过

在这里插入图片描述

问题3:final修饰引用类型的初始化以及注意点

1.代码

  • 问下述代码能否编译通过
public class Demo02 {
    
    public static final StringBuffer s = new StringBuffer();
    
    public static void main(String[] args){
        s.append("hello");
    }
    
}

2分析

  • 可以编译通过
    在这里插入图片描述

  • 对于final修饰的引用类型变量来说,不变指的是引用不变,而不是这个引用指向的对象内容不变

  • 这个也很容易理解,final修饰的是引用s,这个s是什么呢?就是指向内存中某个对象的地址,所以这个地址不能变。但是这个地址对应的对象中的内容,是否改变,final这个修饰符就鞭长莫及了,管不到那么宽的

  • 所以,问下述代码能否编译通过

public class Demo02 {

    public static final StringBuffer s = new StringBuffer();

    public static void main(String[] args){
//        s.append("hello");
        s = new StringBuffer();
    }

}
  • 显然是不能的,s的地址变了
    在这里插入图片描述

问题4:为什么对于一个public类型的final的成员变量,一般都要声明为static的?

  • 为了节省内存
    在这里插入图片描述

  • static修饰的变量,在对象创建之前,类加载之后就在内存里了,而且不管这个类被实例化为了多少个对象,内存都只有这一个变量

  • 如果不被static修饰,仅仅是final修饰,那么创建100个对象,这个变量就会在内存中有100份,而被final修饰的初衷就是拿来读的,所以只需要1份就够了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java类中final/static修饰的成员变量初始化问题 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文

随机推荐

  • 树莓派上手实战之SSH下配置VNC服务器实现远程桌面(可以实现开机自启动vncserver)

    VNC是linux下面常用的远程桌面 xff0c 用它可以在windows或者unix主机上方便的通过网络操作远程主机而不需要一个额外的显示器 xff0c 非常实用 这篇教程将会详细讲解安装配置VNC服务器开启远程桌面服务的全部过程 首先
  • N2N(docker方式安装)实现远程访问家里群晖

    N2N xff08 docker 安装 xff09 实现远程访问家里群晖 前言部署阿里云ECS安装n2n supernode 及 edge 节点在黑群晖上安装 edge节点windows 安装edge节点 测试遇到的问题检查tun模块状态测
  • 深入浅出话事件(下)

    深入浅出话事件 xff08 下 xff09 二 xff0e 事件的由来 在传统的面向对象的概念中是没有 事件 这个概念的 传统的面向对象概念中只有数据 xff08 Data xff0c 也称为 field 域 成员变量 xff09 和方法
  • 凤凰涅槃

    涅槃 xff0c 涅槃 xff0c 太阳般灿烂 xff0c 黑色的凤凰飞入烈火 xff0c 一切腐朽烧干 涅槃 xff0c 涅槃 xff0c 大海般坦然 xff0c 红色的凤凰浴火重生 xff0c 一切希望复燃 涅槃 xff0c 涅槃 xf
  • 转:make cmake和catkin_make的区别

    程序在cmake编译是这样的流程 cmake指令依据你的CMakeLists txt 文件 生成makefiles文件 make再依据此makefiles文件编译链接生成可执行文件 catkin make是将cmake与make的编译方式做
  • 前端开发踩坑-npm install 时报错---持续更新

    1 npm ERR fatal unable to access https github com adobe webplatform eve git Failed to connect to github com port 443 Ope
  • μC/OS II 任务调度详解(一)

    UC OS II 是一个多任务操作系统 xff0c 从宏观角度来看 xff0c 当前系统中可以有多个任务同时运行 xff1b 但从微观角度来看 xff0c 某一个时刻只能有一个任务处于运行状态 xff08 单CPU情况 xff0c 事实上在
  • IMU参数详解

    1 加速度计 1 1Full Scale Range 1 指加速度计能测量到的正反方向最大加速度的额定值范围 常见有 xff08 2g 4g 8g 16g up to 400g 2 地球重力加速度为1g 61 9 8m s 2 16g 61
  • Registry注册机制

    前言 不管是Detectron还是mmdetection xff0c 都有用到这个register机制 xff0c 特意去弄明白 xff0c 记录一下 首先看Registry代码 Copyright c Facebook Inc and i
  • 计算机网路:<3>连接外网(多层交换机)

    上一期我们讲到如何用多层交换机将不同的子网连接起来 xff0c 我们是用到了多层交换机的路由功能 xff0c 那么这个路由功能可以不以创建路由表并且与路由器相连 xff0c 与外网相连呢 xff1f 答案是肯定的 xff0c 这一期我们就做
  • c++ vector指针访问vector元素的方法

    c 43 43 使用 vector指针访问vector元素时 xff0c 不能简单的类似于c中数组和指针的方式 需要使用迭代器 int main vector lt int gt s vector lt int gt p 61 amp s
  • PHP中的设计模式及其实际应用浅析

    设计模式在各种语言中都有很重要的应用 xff0c 每种设计模式都有其特有的优点以及使用场景 接下来 xff0c 将从单例模式 工厂模式 组合模式以及策略模式四个模式 xff0c 介绍设计模式及其实际项目中的简单应用 一 单例模式 单例模式的
  • ECMAScript6(6):数组的扩展

    数组的扩展 Array from 将类数组对象和可遍历对象转化为真正的数组 span class hljs keyword var span arrayLike 61 span class hljs string 39 0 39 span
  • 嵌入式stm32f429上成功跑通主流Linux 4.13

    楼主是个闲的蛋疼的大学僧 xff0c 在高中和大学的社团 工作室中长期搞单片机和 嵌入式系统开发 刚接触树莓派时候是惊叹不已的 xff0c 然后眼看香蕉派杨梅派橙子派荔枝派醋鳖派等等等等的 开源硬件 相继登场 xff0c 也是一阵的兴奋 x
  • 【视频】零基础学Android开发:蓝牙聊天室APP(一)

    零基础学Android开发 xff1a 蓝牙聊天室APP第一讲 1 Android介绍与环境搭建 xff1a 史上最高效Android入门学习 1 1 Google的大小战略 1 2 物联网与云计算 1 3 智能XX设备 1 4 Andro
  • 飞行控制器Pixhawk简介

    作者 xff1a 华清远见讲师 Pixhawk是一款由PX4开源项目设计并由3DR公司制造生产的高级自动驾驶仪系统 其前身是APM xff0c 由于APM的处理器已经接近满负荷 xff0c 没有办法满足更复杂的运算处理 xff0c 所以硬件
  • Altium Designer 10 介绍、原理图及其模板常规设计

    作者 xff1a 卢老师 华清远见嵌入式学院讲师 1 Altium Designer 10 入门知识 1 1 1 什么是 Altium Designer Altium Designer 提供了统一的应用方案 xff0c 是 Protel x
  • ubuntu18配置PX4编译环境

    Ubuntu 18 04系统下搭建PX4 Pixhawk原生固件编译环境 经参考总结CSDN上多位开发者的文章 xff0c 经调整亲测可行 xff01 参考文章 xff1a 7条消息 搭建无人机仿真环境之PX4安装中出现的一些问题的解决 T
  • F450机架 Pixhawk飞控实现自动避障(2019.11.29)

    之前进行无人机项目 xff0c 实现避障 巡航 定点 航拍等功能 xff0c 项目结束 xff0c 在这里进行分享经验 xff0c 项目所用器件为自己使用的 xff0c 仅供参考 xff0c 实际实现须结合自己实际情况 1 传感器选择 权盛
  • Java类中final/static修饰的成员变量初始化问题

    文章目录 问题1 final修饰基本数据类型 xff08 final修饰成员变量的初始化方法 xff09 1 代码2 分析 问题2 final修饰静态成员变量的初始化方法1 代码2分析3 问题2 1 问题3 final修饰引用类型的初始化以