这个常量是什么情况?

chenchengamao 2011-09-09 04:22:23

public class MyJava {
public final int bx = 20;

public static void main(String[] args) {
MyJava obj = new MyJava();
obj.make();
byte b = obj.bx; // 编译失败
}

public void make() {
byte b = bx; // 编译成功
}
}
...全文
309 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
猫蹄 2011-09-15
  • 打赏
  • 举报
回复
-128~127,make()能编译过,应该是跟Integer里面存有一个[-128]到[127]的静态cache数组有关,至于为什么,偶也没想通。。。
Integer在自动装箱(非new)时,数值在-128~127之间,会直接去cache里的,所以同一数值的对象其实是一个对象,只有范围在这个之外才会new Integer

public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}

private static class IntegerCache {
static final int high;
static final Integer cache[];

static {
final int low = -128;

// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}

private IntegerCache() {}
}



[Quote=引用 7 楼 skyparty 的回复:]
发现bx在-128~127之间的时候,make()编译能通过
其他数值都会报损失精度
猜测原因
在类中,因为 public final int bx = 20; 是一个常量,编译期就已经确定他的值了
所以当bx的范围在byte范围中时,make()就不会报错
而byte b = obj.bx;在类的外部,编译器,不知道obj.bx是什么,所以直接报错了
[/Quote]
chenchengamao 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 iambic 的回复:]

编译器不够聪明而已吧。深入讨论意义也不大。
[/Quote]

有可能。。。
chenchengamao 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 ydj552110737 的回复:]

第一行出错是因为加上obj编译器认为那是个对象的属性所以会出错,而下面的直接调用相当于直接调用的常量(bx定义成final就是个常量)也就是20, 20在byte的范围内所以编译不会出错。这是我跟同学老师们讨论出的结果 希望对楼主有帮助
[/Quote]


哇,都叫上同学和老师的,感激不尽啊。。。。哈哈
ydj552110737 2011-09-11
  • 打赏
  • 举报
回复
第一行出错是因为加上obj编译器认为那是个对象的属性所以会出错,而下面的直接调用相当于直接调用的常量(bx定义成final就是个常量)也就是20, 20在byte的范围内所以编译不会出错。这是我跟同学老师们讨论出的结果 希望对楼主有帮助
阳明 to life 2011-09-11
  • 打赏
  • 举报
回复
没头绪 留名学习
li5610 2011-09-11
  • 打赏
  • 举报
回复
用(byte b = obj.bx;)对象调用的是引用类型,(byte b=bx;)是值类型
  • 打赏
  • 举报
回复
final int是编译期常量, 具有不变性。
obj.make();
byte b = obj.bx; // 编译失败
你make()赋一次值,下面一句又赋一次值,
你那相当于重复赋值,当然报错。
iambic 2011-09-11
  • 打赏
  • 举报
回复
编译器不够聪明而已吧。深入讨论意义也不大。
ccamao 2011-09-10
  • 打赏
  • 举报
回复
这个问题确实很奇怪
chenchengamao 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 fainfy 的回复:]

引用楼主 chenchengamao 的回复:
Java code

public class MyJava {
public final int bx = 20;

public static void main(String[] args) {
MyJava obj = new MyJava();
obj.make();
byte b = obj.bx; ……
……
[/Quote]


你改完后正确了吗?你两个星怎么来的啊?
chenchengamao 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fainfy 的回复:]

你在静态方法里面调用常量 ,常量当然也应该是静态。
可是你这里不是,当然编译失败了。
[/Quote]

如果我把bx改成静态的也是一样的结果
chenchengamao 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bijanen19861113 的回复:]

引用 8 楼 chenchengamao 的回复:

引用 7 楼 skyparty 的回复:

发现bx在-128~127之间的时候,make()编译能通过
其他数值都会报损失精度
猜测原因
在类中,因为 public final int bx = 20; 是一个常量,编译期就已经确定他的值了
所以当bx的范围在byte范围中时,make()就不会报错
而byte b = o……
[/Quote]


“this.bx跟obj.bx是一个性质的吧,所以报错啊。而byte b = bx;已经直接知道了bx的类型..”

这句话怎么说 this和obj引用是一个性质?
fainfy 2011-09-09
  • 打赏
  • 举报
回复
你在静态方法里面调用常量 ,常量当然也应该是静态。
可是你这里不是,当然编译失败了。
fainfy 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenchengamao 的回复:]
Java code

public class MyJava {
public final int bx = 20;

public static void main(String[] args) {
MyJava obj = new MyJava();
obj.make();
byte b = obj.bx; ……
[/Quote]

大哥,你两个星怎么来的啊?
public static final int bx = 20;
chenchengamao 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 beiyangxiao 的回复:]

答案是这样的:
在编译的时候,如果能确定赋值时不会损失精确度,就不会报错;如果确定会损失精确度或者不能确定是否损失精确度(非静态方式调用),都会报错。
你把bx的值改成2000,第二个地方同样会报错。
[/Quote]


你的非静态方式调用是什么?能不能举个例子,谢谢
bijanen19861113 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chenchengamao 的回复:]

引用 7 楼 skyparty 的回复:

发现bx在-128~127之间的时候,make()编译能通过
其他数值都会报损失精度
猜测原因
在类中,因为 public final int bx = 20; 是一个常量,编译期就已经确定他的值了
所以当bx的范围在byte范围中时,make()就不会报错
而byte b = obj.bx;在类的外部,编译器,不知道obj.bx是什么,……
[/Quote]

his.bx跟obj.bx是一个性质的吧,所以报错啊。而byte b = bx;已经直接知道了bx的类型..
beiyangxiao 2011-09-09
  • 打赏
  • 举报
回复
答案是这样的:
在编译的时候,如果能确定赋值时不会损失精确度,就不会报错;如果确定会损失精确度或者不能确定是否损失精确度(非静态方式调用),都会报错。
你把bx的值改成2000,第二个地方同样会报错。
Java_sun_888 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenchengamao 的回复:]
Java code

public class MyJava {
public final int bx = 20;

public static void main(String[] args) {
MyJava obj = new MyJava();
obj.make();
byte b = obj.bx; // 这里报错是因为bx不是静态的,在静态的方法里不能引用非静态 ……
[/Quote]
aotian16 2011-09-09
  • 打赏
  • 举报
回复
这么神奇?
来学习下
chenchengamao 2011-09-09
  • 打赏
  • 举报
回复
大师啊,有哪位大师快快现身吧
加载更多回复(9)
内容概要:本文探讨了将人工操作的工业锅炉系统转化为基于可编程逻辑控制器(PLC)与人工智能(AI)的全自动控制系统的设计与实施过程。文章详细介绍了锅炉自动化中的关键控制参数,如温度、压力、水位和流量的监测与调节,并提出了一种融合PLC实时控制能力与AI智能优化能力的分层系统架构。该系统利用传感器采集数据,通过PLC执行底层安全逻辑与控制指令,同时借助AI模型进行预测性维护、燃烧优化、异常检测和能效提升。AI模块基于历史运行数据训练机器学习模型,实现对蒸汽产量、燃料效率的预测及故障分类,并通过OPC UA等工业通信协议与PLC协同工作。系统还集成了SCADA平台用于人机交互与远程监控,提升了操作安全性与响应速度。研究验证了该混合系统的可行性与高效性,在降低能耗、减少停机时间和提高运行稳定性方面具有显著优势。 适合人群:自动化、电气工程及相关专业的研究人员;从事工业控制、能源管理或智能制造领域的工程师和技术人员;具备PLC编程与基本AI知识的从业者。 使用场景及目标:①应用于火力发电厂、化工、食品加工等行业的锅炉自动化升级;②实现从传统PID控制向智能自适应控制的转型;③构建具备预测维护能力和能效优化功能的智能化工业系统。 阅读建议:此文献理论与实践结合紧密,建议读者在掌握PLC基础知识的同时,了解机器学习在工业场景中的应用方式,重点关注系统集成方法、数据流设计以及AI与确定性控制之间的协作机制,以便于实际项目中借鉴与复现。
内容概要:本文介绍了ISO 26262标准的发展现状及其在汽车功能安全领域的应用,重点阐述了该标准针对电子/电气系统因故障行为引发危害的安全要求。文章回顾了标准自发布以来的行业实践经验,指出现有体系虽已成熟,但在实际应用中仍存在对ASIL等级误解、“打勾式”合规等问题。同时,面对软件定义汽车、集中式或区域化架构等新技术趋势,传统基于“功能项”(如制动、转向)的安全边界和干扰隔离方法面临挑战。此外,文中探讨了复用现有软件组件(包括开源软件)的适配性评估、与其他标准(如ISO 21448 SOTIF、ISO/SAE 21434网络安全)的协同与整合问题,并提及正在制定的新版ISO 26262(预计2027年发布)以及支持性技术规范(如ISO/PAS 8926、ISO/PAS 8800)的发展方向。; 适合人群:从事汽车电子电气系统设计、功能安全工程、自动驾驶及AI安全开发的技术人员与管理人员,具备一定功能安全基础知识的研发从业者; 使用场景及目标:①理解ISO 26262在新型车辆架构下的适用挑战;②掌握复杂软件组件的再利用与安全适配方法;③协调功能安全与SOTIF、网络安全等多标准之间的关系;④为参与下一代ISO 26262标准演进提供前瞻性视野; 阅读建议:此资源适用于需要从系统层面把握功能安全发展趋势的专业人士,建议结合实际项目中关于安全边界划分、ASIL分解、软件重用等难点进行深入思考,并关注相关新兴标准的动态进展。
内容概要:本文系统研究了多轴同步5段S型、7段S型与多轴梯形轨迹规划算法,提出以最长运动时间轴为基准、通过位移比例缩放实现各轴同步的核心控制策略,深入阐述了三种算法的设计原理、运动特性及适用场景。研究指出,7段S型轨迹规划在平滑性和同步精度上表现最优,适用于高精度多轴协同控制场合;5段S型在控制性能与实现复杂度之间达到良好平衡,适合大多数工业自动化应用;多轴梯形轨迹规划因结构简单、响应迅速,适用于低速、低成本的应用场景。三者共同构成覆盖全工况需求的多轴同步轨迹规划解决方案,并对未来向智能化、自适应化、嵌入式化的发展方向进行了前瞻性展望。; 适合人群:具备自动化、控制工程或机械电子工程等相关专业背景,从事工业机器人、数控系统、精密装备制造的研发工程师及研究生。; 使用场景及目标:①为工业机器人、数控机床、自动化装配线等多轴联动设备提供轨迹规划算法选型依据;②指导高精度运动控制系统中S型加减速算法的设计与实现;③推动轨迹规划算法在变工况、变载荷条件下的自适应优化研究。; 阅读建议:建议结合Matlab代码实现部分进行仿真验证,重点关注不同算法下的速度、加速度及加加速度曲线对比,深入理解同步控制机制,并尝试在实际控制系统中应用与调优。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧