Java基础–变量
1. 变量分类
成员变量: 类中定义的变量
局部变量: 方法中定义的变量
类变量: 类中定义且有static修饰的变量
实例变量: 类中定义无static修饰的变量
▶误区: Java无全局变量的概念
●特点: 一、成员变量可以不指定初始值,初始化时自动分配初始值。
[初始值分配]:类型为数值型,初始值为0;
类型为boolean型,初始值为false;
类型为引用类型,初始值为null。
二、局部变量必须先指定初始值才能使用。
2. 变量何时初始化
类变量: 与类息息相关,加载类时,自动分配内存空间进行初始化。
实例变量: 与实例(实例即对象)息息相关,创建对象时,进行初始化。
局部变量: 与方法息息相关,方法被执行时,进行初始化,方法结束变量失效。
3. 变量的访问
如下为代码示例以及提出问题
//Car类
class Car {
String color; //实例变量
double price; //实例变量
static int years; //类变量
}
//CarTest类
public class CarTest {
public static void main(String[] args){
System.out.println(Car.years); //years为Car的类变量,通过类名直接访问,此行输出结果为years的初始值0
Car Benz = new Car();
System.out.println(Benz.color); //color为Car的实例变量,通过new一个Car对象来访问,此行输出结果为color的初始值null
System.out.println(Benz.price); //price为Car的实例变量,同样通过new一个Car对象来访问,此行输出结果为price的初始值0.0
//通过Benz对象对两个实例变量进行赋值
Benz.color = "黑色";
Benz.price = 580000.0;
System.out.println(Benz.color); //输出黑色
System.out.println(Benz.price); //输出580000.0
//通过Benz对象对seats这个类变量进行赋值
Benz.years = 5;
System.out.println(Benz.years); //输出5
Car Porsche = new Car();
Porsche.color = "粉色";
Porsche.price = 970000.0;
System.out.println(Porsche.color); //输出粉色
System.out.println(Porsche.price); //输出970000.0
/*注意*/
System.out.println(Porsche.years); //输出5
/* 提问:代码中没有给Porsche对象的years赋值,为何输出结果是5 */
}
}
问题:代码中没有给Porsche对象的years赋值,为何输出结果是5。
详解如下图:
解释:因为years是Car类的类变量,在被赋值为5后才new的Porsche对象,此后只要是Car类的实例years都为5,如下:
Car Lexus = new Car();
System.out.println(Lexus.years); //输出也是5
Car Audi = new Car();
System.out.println(Audi.years); //输出也是5
4. 总结
<1> 类变量专属于类本身,类加载完就完成初始化。
<2> 实例变量专属于对象本身,new出对象后才完成初始化。
<3> 局部变量依赖于方法本身,当方法被执行时才进行初始化。
<4> 类变量通过→类名.变量名 进行访问。
<5> 实例变量通过→new出该类对象后,对象名.变量名 进行访问。
<6> 注意点:Java语言允许通过对象来访问类变量,作用等同于→类名.变量名 的访问方式。
<7> 为避免混乱,建议:类变量通过类名访问,实例变量通过对象访问,尽量避免通过对象来访问类变量。