一、局部变量和成员变量
1、局部变量,一般是指在方法体内部定义的变量,其作用域是在方法块内部有效。局部变量必须先初始化,才能使用,否则程序无法编译。
2、成员变量,是指在类中定义的变量,也就是属性,其作用域是在整个类中有效。成员变量在定义时可以不指定初始值,系统可以按默认原则初始化。初始化的具体原则如下图所示:
成员变量类型 | 默认初始值 |
---|---|
Byte | 0 |
Short | 0 |
Int | 0 |
Long | 0L |
Boolean | false |
Float | 0.0f |
Double | 0.0d |
Char | '\u0000' |
其他类型(引用类型) | null |
(1)、public、protected、private、static等修饰符可用于修饰成员变量,但不能修饰局部变量。两者都可以使用final修饰。
(2)、成员变量存储在堆内存中,局部变量存储在栈内存中。
(3)、作用域不同,成员变量在整个类中有效,局部变量在方法体中有效,在方法体之外不可见。
(4)、成员变量可以默认初始化,局部变量必须显示初始化。
二、“+”操作符在Java内部是如何实现字符串连接的。
Java不支持运算符重载,但在java内部提供了一些特殊运算符,它们具有重载的特征。例如“+”在实现字符串连接时,操作数可以是两个字符串,也可以是一个字符串和一个其他类型。请看如下的一个例子:
String a = "a";
String b = "b";
String c = a + b;
String d = c + 1;
// 将上述代码编译后再反编译,结果如下
String a = "a";
String b = "b";
String c = (new StringBuilder(String.valueOf(a))).append(b).toString();
String d = (new StringBuilder(String.valueOf(c))).append(1).toString();
从上述代码不难发现,“+”在实现字符串连接过程中,实际上是借助了StringBuilder类及其append()方法。
String类代表大小固定的字符串,一旦声明定义后,内容和大小将不可改变。String类中提供的所有字符串操作方法,都是操作结果创建了一个新的String对象并返回。
为了考虑效率问题,在底层Java采用了StringBuilder类,该类代表大小可变的字符串,利用StringBuilder类的append()和insert()方法可以在原字符串基础上修改。append()和insert()方法被重载过多次,可以接收多种类型的参数。
三、变量之间传值时可分为值传递和引用传递,那么它们有何区别。
1、存储机制。
简单类型变量是直接在栈内存中开辟存储空间存储变量值。
引用类型变量是由引用空间和存储空间两部分构成,引用空间在栈内存中,存储空间在堆内存中,存储空间负责存储变量值,引用空间负责存放存储空间的首地址。引用变量中存放的是地址值,通过地址值可以定义存储位置并修改存储信息。
2、变量传递。
当变量与变量之间赋值时,引用类型变量和简单变量都属于值传递,不同的是简单变量传递的是内容本身,而引用变量传递的却是引用地址。