目录
变量的分类-按位置分:成员变量vs局部变量
成员变量:在类中其它结构外声明的变量
成员变量的分类: 实例变量(属性) vs 类变量
实例变量: 每个对象各自拥有一份。
类变量(用static修饰的属性):所有对象共同拥有一份。
局部变量:在方法中,代码块,构造器,构造器的形参,方法的形参列表中声明的变量都是局部变量
实例变量(属性)
实现和调用
每个对象各自拥有一份。
实例变量(属性)的格式 : [修饰符] 数据类型 变量名 [= 值] 属性怎么调用? 对象名.属性名 属性有什么特点? 每个对象各自拥有一份。(详见属性内存实现机制)
public class FieldTest {
public static void main(String[] args) {
//创建Student对象
Student xiaolongge = new Student();
//调用属性并给属性赋值
xiaolongge.name = "小龙哥";//给变量赋值
Student weige = new Student();
//调用属性给属性赋值
weige.name = "伟哥";
System.out.println("======================");
System.out.println(xiaolongge.name);//输出变量中的值
System.out.println(weige.name);
}
}
class Student{
String name;
}
属性的内存实现机制
每次有新的对象被创建就会在堆中开辟出新的一片内存,对象名储存的是地址指向该内存
这就是为什么不同对象定义同一种属性不会互相影响,因为各自有各自的内存空间
这也是为什么调用某个属性格式为 对象名.属性名()
注!:需要调用某类时需要进行类加载把相应的类信息加载到方法区,下次再加载时只要方法区有该类的类信息时就不会再类加载了,可以直接取类信息
空指针异常
发生空指针异常 原因是对象的值为null根本就没有对象
public class FieldTest3 {
public static void main(String[] args) {
Worker w = null;
//会发生空指针异常 原因是对象的值为null根本就没有对象。
System.out.println(w.id);//会报NullPointerException -- 空指针异常
}
}
类变量
定义与实现
类变量放在方法区的静态域中,类加载时直接读取
类变量(用static修饰的属性):所有对象共同拥有一份。
格式: [修饰符] static 数据的类型 变量名 [=值]
class Person{
String name;//属性
static String country;//类变量
}
public class ClassFieldTest {
public static void main(String[] args) {
//给类变量赋值
Person.country = "中国";
//创建对象
Person dongge = new Person();
//给属性赋值
dongge.name = "东哥";
//创建对象
Person tengge = new Person();
tengge.name = "腾哥";
}
}
说明:
1.类变量的默认值和属性的默认值一样
2.类变量的调用: 类名.类变量名 对象名.类变量名(不建议使用-就算用了在编译的时候也会换成类名.类变量名)
3.类变量是随着类的加载而加载的。实例变量是随着对象的创建加载的。 类加载早于对象的创建。类加载只加载一次(方法区如果已经存在就不加载了)。
4.类变量是在方法区(静态域),实例变量在堆中的对象中。
类变量内存实现机制
类变量是随着类的加载而加载的,实例变量是随着对象的创建加载的。
类变量是在方法区(静态域),实例变量在堆中的对象中