并不是static final 修饰的变量都是编译期常量

见代码

public class Test {
    public static void main(String[] args){
        // 情况一  基本数据类型
        //System.out.println(Outer.Inner.n);
        // 输出结果 : 10

        //情况二
        //Outer outer = Outer.Inner.outer;
        // 输出结果 : 静态内部类

        //情况三
        System.out.println(Outer.Inner.str);
        // 输出结果: 静态内部类  abc

        //情况四
        System.out.println(Outer.Inner.str01);
        // 输出结果: abc
    }
}
class Outer{
    static class Inner{
        public static final String str = new String("abc");
        public static final String str01 = "abc";
        public static  final Outer outer  = new Outer();
        public static final int n = 10;
        static {
            System.out.println("静态内部类");
        }
    }
}                

String 是一个比较特殊的类(str01:  static final 修饰的变量不可变 , “abc”这个字符串也不可变)

原文地址:https://www.cnblogs.com/DDiamondd/p/10965708.html

时间: 2024-11-08 15:01:41

并不是static final 修饰的变量都是编译期常量的相关文章

final修饰的变量是引用不能改变还是引用的对象不能改变

我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变,还是引用的对象不能变 * StringBuilder 线程不安全 但速度快 * 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变 * @author Tomato * */ public class TestFinal { public static void mai

Java中final与 static final 修饰的常量的区别

喵喵开车,新手上路,多多关照.有任何错误请在评论区指出. ...........................................我是万恶的分界线( ? ?ω?? )?......................................... final:用来修饰类,变量,方法: final修饰的类不能有子类,也不能被继承. final修饰的变量是一个常量,不能重新赋值. final修饰的方法不能重写 现在就说明final修饰的常量① 与 static final 修饰的常

final修饰的变量引用不能变还是对象不可变

两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能只想另外一个对象. 基本数据类型: package cn.yqg.day2; public class StringTest { public static void main(String[] args) { final int a; int b=234; a=b; System.out.println(a); } } 我们看到上面的代码a是final类型的,但是没有被初始化,所以

浅谈final修饰的变量

一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值.一开始我只是用private修饰的,心里想的是如果final修饰的话,应该不能修改了.毕竟被final修饰的变量不可变.今天回家后,做了下面的尝试,彻底暴露出自己基础的不扎实. final的作用 被final修饰的类不可以被继承 被final修饰的方法不可以被重写 被final修饰的变量不可变 实战演示 1.首先看下面代码 public class Fin

final修饰的变量是引用不能变还是对象的内容不能变?

int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final StringBuffer a=new StirngBuffer(); a=new StringBuffer();会报错: a.append("两");没错 这就说明final 修饰的变量是引用不能变,对象的内容可以变的:

Static.final修饰符、super关键字及常量与变量

一.Static static 静态修饰符,用来修饰类的属性或方法 如果类的某个属性,不管创建多少个对象,属性的存储空间只有唯一的一个,那么这个属性就应该用static修饰,称为静态属性. static属性可以使用对象调用,也可以直接用类名调用,静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存中只有一个. static块和static的属性以及方法的性质是相同的,用static修饰的代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块. 静态块只有在类加载的时候被

表达式转型注意事项,和final修饰的变量会被JVM优化

1java中表达式转型需要注意 实例如下: byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6); 问会出现什么状况:A.输出结果:13,B.b6=b4+b5 编译出错   C.b3=b1+b2编译出错   D.运行异常 首先表达式转型注意以下规则: ①所有的byte,short,char型的值将被提升为int型: ②如果有一个操作数是long型,计算结果是long型

final修饰的变量是引用不能改变,还是引用的对象不能改变???

对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final StringBuilder sb = new StringBuilder("haha"); //同一对象的hashCode值相同 System.out.println("sb中的内容是:" + sb); System.out.println(sb + "的哈希编码

Java final修饰符

final的定义: 在英文层面上,final的意思是"最后的","最终的"意思,在Java中也同样表示出此种含义. final的运用对象: final适用于修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. final修饰类: 由于final定以后的对象不能进行修改和重载,用final修饰的类不能被继承,即不能拥有自己的子类.如果视图对一个已经用final修饰的类进行继承,在编译期间或发生错误. final修饰变量: 一旦定义了fi