标签:== 方法参数 表示 需要 静态代码块 定义 stat 赋值 虚拟
由于final修饰的String变量不可更改,所以,当一个String变量被final修饰时,这个值在编译期就可以确定,所有将该变量直接替换为它对应的值,如下:
public class test {
public static void main(String[] args) {
final String a = "hello";
String b = "hello"; // String是对象,一旦赋值不可以改变,但是b可以执行其他对象
// b = "test";
final String c = "world";
String d = "hello" + "world";
String e = a + c;
String f = b + c; // 运行时,在堆内分配内存
String g = "helloworld"; // 在字符串常量池内
StringBuilder y = new StringBuilder("test");
y.append("demo");
y.append("good");
System.out.println(g == d);//true,“==”表示判断二者的内存地址是否相同
System.out.println(g == e);//true,“==”号在比较对象时是比较对象在内存中的地址是否一致
System.out.println(g == f);//false
System.out.println(y);
}
}
在编译期,由于a和c的值已经确定并且不会再更改(效果同d),所以e的值能够在编译期就确定下来,直接指向了常量区的g,前两个均为true;再看下f,由于b值的不确定性,所以在编译期不能确定其值,只能在运行时确认,所以二者内存地址不同,(g == f)为false。
public class MainTest {
//-----------------成员变量(实例变量)------------------//
// 初始化方式一(编译时赋值),在定义变量时直接赋值,如果不赋值,不会有默认值,必须后续进行赋值
private final int i = 3;
// 初始化方式二(运行时赋值),声明变量后在构造方法中为其赋值,如果采用用这种方式,那么每个构造方法中都要有j赋值的语句
private final int j;
public MainTest() {
j = 3;
}
// 为了方便我们可以这样写,final变量多于1个时,就没有办法使用这种方式实现了
public MainTest(int int1) {
this(3);
}
// 初始化方式三(运行时赋值),声明变量后在构造代码块中为其赋值,如果采用此方式,就不能在构造方法中再次为其赋值,构造代码块中的代码会在构造方法之前执行,如果在构造方法中再次赋值,就会造成final变量的重复赋值
private final int k;
{
k = 4;
}
//-----------------类变量(静态变量)------------------//
// 初始化方式一,在定义时直接赋值(不赋值使用默认值)
public static int p = 3;
// 初始化方式二,在静态代码块中赋值
public static int q;
static {
q = 3;
}
// 成员变量可以在构造方法中赋值,但是类变量却不可以。因为成员变量属于对象(类的实例)独有,每个对象创建时都必然调用一次构造方法而切只会调用一次构造方法,因此可以保证该成员变量只被初始化一次;而类变量是该类的所有对象共有,如果每个对象创建时都会对该变量赋值,这样就会造成变量的重复赋值。
}
实例变量具有默认值,数值型变量的默认值是0,布尔型变量的默认值是false,应用类型变量的默认值是null
class常量池:位于方法区,存放字面量和符号引用
字面量类似与我们平常说的常量,主要包括:
符号引用:
运行时常量池:class文件中的常量池,它会在类加载后进入方法区中的运行时常量池。并且需要的注意的是,运行时常量池是全局共享的,多个类共用一个运行时常量池。并且class文件中常量池多个相同的整数在运行时只会存一份在字符串常量池
字符串常量池:存在堆中。class文件中的文本字符串在运行时就存在这里。并且class文件中常量池多个相同的字符串在运行时只会存一份在字符串常量池
整数常量池:方法区,在运行时常量池内,范围-128~127
然后看一段代码,问:这里产生了几个对象?:
string s1= new string("abc")
根据上面的意思,我们可以这样说,如果常量池中已经有了abc对象,那么就只会在堆中产生一个对象。如果没有,那么先在常量池中创建一个对象,然后复制到堆内存中再创建一个,所以创建了两个。
https://zhuanlan.zhihu.com/p/42184392
https://zhuanlan.zhihu.com/p/40798413
标签:== 方法参数 表示 需要 静态代码块 定义 stat 赋值 虚拟
原文地址:https://www.cnblogs.com/shengulong/p/11756301.html