- 浏览: 5052974 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (2844)
- java (1094)
- hadoop (37)
- jvm (39)
- hbase (11)
- sql (25)
- 异常 (83)
- div css (6)
- 数据库 (95)
- 有趣的code (15)
- struts2 (6)
- spring (124)
- js (44)
- 算法 (65)
- linux (36)
- hibernate (7)
- 中间件 (78)
- 设计模式 (2)
- 架构 (275)
- 操作系统 (91)
- maven (35)
- tapestry (1)
- mybatis (9)
- MQ (101)
- zookeeper (18)
- 搜索引擎,爬虫 (208)
- 分布式计算 (45)
- c# (7)
- 抓包 (28)
- 开源框架 (45)
- 虚拟化 (12)
- mongodb (15)
- 计算机网络 (2)
- 缓存 (97)
- memcached (6)
- 分布式存储 (13)
- scala (5)
- 分词器 (24)
- spark (104)
- 工具 (23)
- netty (5)
- Mahout (6)
- neo4j (6)
- dubbo (36)
- canal (3)
- Hive (10)
- Vert.x (3)
- docker (115)
- 分布式追踪 (2)
- spring boot (5)
- 微服务 (56)
- 淘客 (5)
- mesos (67)
- php (3)
- etcd (2)
- jenkins (4)
- nginx (7)
- 区块链 (1)
- Kubernetes (92)
- 驾照 (1)
- 深度学习 (15)
- JGroups (1)
- 安全 (5)
- 测试 (16)
- 股票 (1)
- Android (2)
- 房产 (1)
- 运维 (6)
- 网关 (3)
最新评论
-
明兜3号:
部署落地+业务迁移 玩转k8s进阶与企业级实践技能(又名:Ku ...
Kubernetes系统常见运维技巧 -
q328965539:
牛掰啊 资料收集的很全面
HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS) -
guichou:
fluent挂载了/var/lib/kubelet/pods目 ...
kubernetes上部署Fluentd+Elasticsearch+kibana日志收集系统 -
xu982604405:
System.setProperty("java.r ...
jmx rmi 穿越防火墙问题及jmxmp的替代方案 -
大漠小帆:
麻烦问下,“获取每个Item相似性最高的前N个Item”,这个 ...
协同过滤推荐算法在MapReduce与Spark上实现对比
final修饰的引用类型,引用不可以改变,但是它所指向的对象的内容可以改变。
public class P { public static void main(String[] args)throws Exception { final B a =new B(); System.out.println(a.o.hashCode()); c2(a); } public static void c2(B a)throws Exception{ Field f = a.getClass().getDeclaredField("o"); f.setAccessible(true); System.out.println(f.get(a).hashCode()); f.set(a, new Object()); System.out.println(a.o.hashCode()); } } class B{ final Object o =new Object(); }结果:
10039797 10039797 18378667
大家怎么看?
评论
6 楼
m635674608
2013-01-14
reason2003 写道
m635674608 写道
reason2003 写道
reason2003 写道
final B a =new B();
这里面的a 指向的是堆里面的 B 对象的实例,还不是指向 O 对象实例。
final 的意思应该是 a 的指向不能改变
B类中的final o属性,和P类型中的final a属性不是一个意思么?我这里值改了B中的final o属性,要改P中的 final a属性页是一样的啊
File的set(Object obj, Object value)方法描述
If the underlying field is final, the method throws an IllegalAccessException unless setAccessible(true) has succeeded for this Field object and the field is non-static. Setting a final field in this way is meaningful only during deserialization or reconstruction of instances of classes with blank final fields, before they are made available for access by other parts of a program. Use in any other context may have unpredictable effects, including cases in which other parts of a program continue to use the original value of this field.
我修改了一下程序,可以看出反射没有改变对象中final的值
public class B { final Object o =new String("1"); }
public class P { public static void main(String[] args)throws Exception { final B a =new B(); System.out.println("o hashCode is "+a.o.hashCode()); c2(a); final B a1 =new B(); System.out.println("new a1.o hashCode is "+a1.o.hashCode()); System.out.println("new a1.o hashCode is "+a1.o.toString()); final B a2 =new B(); System.out.println("new o2 hashCode is "+a2.o.hashCode()); System.out.println("new o2 hashCode is "+a2.o.toString()); } public static void c2(B a)throws Exception{ Field f = a.getClass().getDeclaredField("o"); f.setAccessible(true); System.out.println("before reflect hashcode is "+f.get(a).hashCode()); System.out.println("after reflect value is "+f.get(a).toString()); f.set(a, new String("2")); System.out.println("after reflect hashcode is "+a.o.hashCode()); System.out.println("after reflect value is "+a.o.toString()); } }
o hashCode is 49 before reflect hashcode is 49 after reflect value is 1 after reflect hashcode is 50 after reflect value is 2 new a1.o hashCode is 49 new a1.o hashCode is 1 new o2 hashCode is 49 new o2 hashCode is 1
before reflect hashcode is 49
after reflect value is 1
after reflect hashcode is 50
after reflect value is 2
这不是说明已经该了吗???
5 楼
reason2003
2013-01-14
m635674608 写道
reason2003 写道
reason2003 写道
final B a =new B();
这里面的a 指向的是堆里面的 B 对象的实例,还不是指向 O 对象实例。
final 的意思应该是 a 的指向不能改变
B类中的final o属性,和P类型中的final a属性不是一个意思么?我这里值改了B中的final o属性,要改P中的 final a属性页是一样的啊
File的set(Object obj, Object value)方法描述
If the underlying field is final, the method throws an IllegalAccessException unless setAccessible(true) has succeeded for this Field object and the field is non-static. Setting a final field in this way is meaningful only during deserialization or reconstruction of instances of classes with blank final fields, before they are made available for access by other parts of a program. Use in any other context may have unpredictable effects, including cases in which other parts of a program continue to use the original value of this field.
我修改了一下程序,可以看出反射没有改变对象中final的值
public class B { final Object o =new String("1"); }
public class P { public static void main(String[] args)throws Exception { final B a =new B(); System.out.println("o hashCode is "+a.o.hashCode()); c2(a); final B a1 =new B(); System.out.println("new a1.o hashCode is "+a1.o.hashCode()); System.out.println("new a1.o hashCode is "+a1.o.toString()); final B a2 =new B(); System.out.println("new o2 hashCode is "+a2.o.hashCode()); System.out.println("new o2 hashCode is "+a2.o.toString()); } public static void c2(B a)throws Exception{ Field f = a.getClass().getDeclaredField("o"); f.setAccessible(true); System.out.println("before reflect hashcode is "+f.get(a).hashCode()); System.out.println("after reflect value is "+f.get(a).toString()); f.set(a, new String("2")); System.out.println("after reflect hashcode is "+a.o.hashCode()); System.out.println("after reflect value is "+a.o.toString()); } }
o hashCode is 49 before reflect hashcode is 49 after reflect value is 1 after reflect hashcode is 50 after reflect value is 2 new a1.o hashCode is 49 new a1.o hashCode is 1 new o2 hashCode is 49 new o2 hashCode is 1
4 楼
reason2003
2013-01-14
m635674608 写道
reason2003 写道
reason2003 写道
final B a =new B();
这里面的a 指向的是堆里面的 B 对象的实例,还不是指向 O 对象实例。
final 的意思应该是 a 的指向不能改变
B类中的final o属性,和P类型中的final a属性不是一个意思么?我这里值改了B中的final o属性,要改P中的 final a属性页是一样的啊
AccessibleObject setAccessible方法
Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.
3 楼
m635674608
2013-01-14
reason2003 写道
reason2003 写道
final B a =new B();
这里面的a 指向的是堆里面的 B 对象的实例,还不是指向 O 对象实例。
final 的意思应该是 a 的指向不能改变
B类中的final o属性,和P类型中的final a属性不是一个意思么?我这里值改了B中的final o属性,要改P中的 final a属性页是一样的啊
2 楼
reason2003
2013-01-14
reason2003 写道
final B a =new B();
这里面的a 指向的是堆里面的 B 对象的实例,还不是指向 O 对象实例。
final 的意思应该是 a 的指向不能改变
1 楼
reason2003
2013-01-14
final B a =new B();
发表评论
-
Kryo 使用指南
2017-12-05 20:14 20541、Kryo 的简介 Kryo 是一个快速序列化/ ... -
spring session序列化问题排查
2017-12-01 19:07 6293严重: Servlet.service() for ser ... -
利用junit对springMVC的Controller进行测试
2017-11-30 16:26 1459平时对junit测试service/D ... -
Java内存模型之重排序
2017-11-29 09:44 870在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重 ... -
pmd spotbugs 文档
2017-11-28 10:02 0https://pmd.github.io/pmd/pmd ... -
PMD、FindBug、checkstyle、sonar这些代码检查工具的区别?各自的侧重点是什么?
2017-11-28 10:01 2153可以说都是代码静态分析工具,但侧重点不同。pmd:基于源代码 ... -
阿里巴巴Java代码规约插件p3c-pmd使用指南与实现解析
2017-11-23 17:09 1613阿里巴巴Java代码规约插件安装 阿里Java代码规 ... -
静态分析工具PMD使用说明 (文章来源: Java Eye)
2017-11-23 17:07 1152质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤 ... -
MyBatis 使用 MyCat 实现多租户的一种简单思路
2017-11-20 18:27 2854本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进 ... -
Spring+MyBatis实现数据库读写分离方案
2017-11-20 17:15 1110百度关键词:spring mybatis 多数据源 读写分离 ... -
数据库连接池druid wallfilter配置
2017-11-20 11:38 1360使用缺省配置的WallFilter <be ... -
java restful 实体封装
2017-11-16 09:47 1611package com.mogoroom.bs.commo ... -
dak
2017-11-15 11:21 0package zzm; import jodd.ht ... -
Java内存模型之从JMM角度分析DCL
2017-11-15 09:35 648DCL,即Double Check Lock,中卫双重检查锁 ... -
Java 打印堆栈的几种方法
2017-11-14 09:36 4771java 中可以通过 eclipse 等工具直接打印堆栈, ... -
Servlet Session学习
2017-11-10 09:25 562HTTP 是一种"无状 ... -
浅析Cookie中的Path与domain
2017-11-10 09:26 1069Path – 路径。指定与co ... -
入分析volatile的实现原理
2017-11-08 09:47 696通过前面一章我们了解了synchronized是一个重量级的 ... -
Spring MVC-ContextLoaderListener和DispatcherServlet
2017-11-15 09:35 698Tomcat或Jetty作为Servlet ... -
搭建spring框架的时候,web.xml中的spring相关配置,可以不用配置ContextLoaderListener(即只配DispatcherServl
2017-11-07 18:27 1443搭建spring框架的时候,web.xml中的sprin ...
相关推荐
本文章是关于final部分知识所作的自我总结,内容为final对成员变量和局部变量修饰的简要解答,除了对自我java学习的一个小结,也希望能够帮助到在java路上对该内容疑惑的同行
**final 修饰变量** 1. **final 常量**:当`final`修饰一个成员变量(属性)时,它就变成了一个常量,一旦赋值就不能再次更改。对于基本类型的变量,这意味着值不能改变。对于引用类型的变量,虽然引用本身不能改变...
Java 中局部内部类可以访问它所在方法中定义的 final 修饰的局部变量的合理解释 在 Java 中,局部内部类可以访问它所在方法中定义的 final 修饰的局部变量,这是一个非常重要的知识点。这是因为 JVM 在编译时会将 ...
day11_05_final关键字用于修饰成员变量
Java 中的 final 变量是指不能被改变的变量,它有三个方面的作用:修饰变量、修饰方法和修饰类。在 Java 中,final 变量是一种常量,它只能被赋值一次,赋值后值不再改变。 final 变量的使用方法有多种,例如在变量...
012-JavaSE进阶-final修饰局部变量
一、final修饰变量 1. 当final修饰成员变量(类变量和实例变量)时,这个变量一旦被赋值后,就不能再被修改。对于类变量,final可以在静态初始化块中指定初始值或声明时直接赋值;对于实例变量,可以在非静态初始化...
对于实例变量,必须在构造器中或者初始化块中赋值,对于静态`final`变量,可以在类加载时或静态初始化块中赋值。`final`变量在多线程环境中特别有用,因为它确保了线程安全。 2. 类型转化: - 自动类型转化(隐式...
final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...
标题中的“局部变量用final”的讨论主要聚焦于Java编程语言中的一个特性,即使用`final`关键字修饰局部变量。在Java中,`final`关键字有多种用途,包括但不限于定义不可变对象、创建常量以及限制变量的赋值次数。在...
- **修饰变量**:`final`成员变量一旦赋值就不能再次改变,常用于声明常量。静态`final`变量在类加载时初始化,而非静态`final`变量则在对象创建时初始化。 - **修饰方法**:`final`方法不能被子类覆盖,但可以被...
final修饰变量 - **定义与作用**:当`final`修饰一个变量时,意味着该变量的值一旦被初始化之后就无法改变。这种变量通常被称为常量。 - **语法示例**: ```java final int PI = 31415; ``` - **注意事项**: ...
在Java编程语言中,`final`关键字扮演着重要的角色,它用于声明不可变的变量、方法和类。理解`final`的关键在于其不可变性,这有助于提高程序的效率、稳定性和设计规范。 首先,`final`变量表示常量,一旦赋值后就...
计算机后端-Java-Java核心基础-第15章 面向对象07 26. final修饰局部变量.avi
3. **final修饰局部变量** `final`关键字也可以修饰局部变量,这意味着一旦给局部变量赋值后,它的值就不可改变。例如: ```java public class DemoFinal { public static void main(String[] args) { final ...
day11_04_final关键字用于修饰局部变量
1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.
1. `final`修饰变量: 当`final`修饰一个变量时,它表示该变量一旦被赋值后就不能再次改变。这分为两种情况: - **实例变量**:如果`final`修饰的是实例变量,那么必须在声明时、非静态初始化块或构造器中为其...
**一、final修饰变量** 1. **成员变量**:成员变量分为类变量(`static`修饰)和实例变量。对于类变量,可以在声明时直接初始化或在静态初始化块中赋值,两者选其一。实例变量则可以在声明时、非静态初始化块中或...