通过以前的学习,我们知道了成员变量是类的重要组成部分。对象的属性以变量形式存在,下面我们就来详解的学习一下类中的变量
成员变量的分类
- 实例变量:没有static修饰,也叫对象属性,属于某个对象的,通过对象来使用
- 类变量:有static修饰,也叫类变量,属于整个类的,不是属于某个实例
如何声明成员变量
属性的类型可以是Java的任意类型,包括基本数据类型、引用数据类型(类、接口、数组等)。
例如:声明一个中国人的类
class Chinese{ static String country;//类变量 String name;//默认值 char gender = '男';//显式赋值 }
如何在类外面访问成员变量
成员变量/实例变量
代码示例
class Chinese { static String country; String name; char gender = '男'; } public class Demo { public static void main(String[] args) { //System.out.println(Chinese.name);错误,非静态成员变量必须通过对象.进行访问 //创建对象 Chinese c1 = new Chinese(); //对象名.非静态成员变量 System.out.println(c1.name);//null //对象名.非静态成员变量 System.out.println(c1.gender);//男 //类名.静态成员变量,推荐 System.out.println(Chinese.country);//null //静态的成员变量也可以通过对象.进行访问,不推荐 System.out.println(c1.country);//null } }
成员变量有默认值
类变量的值是所有对象共享的,当类变量发生改变的时候,任何此类的对象访问该变量都会发生改变。而实例变量的值是每个对象独立的。
代码示例
class Chinese { static String country; String name; char gender = '男'; } public class Demo { public static void main(String[] args) { //创建对象c1 Chinese c1 = new Chinese(); //创建对象c2 Chinese c2 = new Chinese(); //给对象c1的name属性赋值张三 c1.name = "张三"; //给对象c2的name属性赋值李四 c2.name = "李四"; //给对象c2的gender属性赋值女 c2.gender = '女'; //给类变量赋值 Chinese.country = "中国";//推荐 //访问各个对象的成员变量 System.out.println("c1.country = " + c1.country); //中国 System.out.println("c1.name = " + c1.name); //张三 System.out.println("c1.gender = " + c1.gender);//男 System.out.println("c2.country = " + c2.country); //中国 System.out.println("c2.name = " + c2.name);//李四 System.out.println("c2.gender = " + c2.gender);//女 } }
成员变量的内存图
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理,每一片区域都有特定的处理数据方式和内存管理方式。
静态成员变量和实例变量的异同
相同点:
- 位置类中方法外
不同点:
有无static修饰
- 静态变量被static修饰
- 实例变量不能被static修饰
内存中的分数不同
- 类变量:内存中只有一份,当前类创建的对象共享
- 实例变量:每创建一个该类对象都会开辟一份空间,来存储不同对象的实例变量。
调用方式不同
- 类变量: 可以使用对象名.属性名和类名.属性名调用,推荐使用类名.属性名调用调用
- 实例变量:对象名.属性名
生命周期不同:
- 类变量:随着类的加载而加载 随着类的消亡而消亡
- 实例变量:随着对象的创建 对象消失(当对象没有引用指向时) 被垃圾回收器回收
存储的位置不一样
- 类变量:方法区
- 实例变量:堆中
成员变量和局部变量的区别
查看下面代码
public class Car { String color;// 成员变量 // 成员方法 public void drive(String name) { //声明在方法上的name和定义在方法里的speed都是局部变量 int speed = 80; System.out.println("汽车正在以" + speed + "迈的速度行驶..."); } }
成员变量和局部变量的主要区别如下:
定义的位置不同:
- 成员变量定义在类中方法外,
- 局部变量定义在方法中或者是方法声明上
在内存中的位置不同:
- 成员变量是在堆区,
- 局部变量是在栈区
生命周期不同:
- 成员变量是随着对象的创建而存在,随着对象的销毁而销毁
- 局部变量是随着方法的调用而存在,随着方法调用完毕而销毁
默认值不同:
- 成员变量有默认值
- 局部变量没有默认值,不赋值不能直接使用
成员变量初始化方式
- 成员变量有默认值
- 显式赋值
- 代码块
- 构造器建议只为实例变量初始化,不为静态类变量初始化
- 使用setXxx(参数列表)赋值