day11_类中成员之变量

通过以前的学习,我们知道了成员变量是类的重要组成部分。对象的属性以变量形式存在,下面我们就来详解的学习一下类中的变量

成员变量

成员变量的分类

  • 实例变量:没有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 + "迈的速度行驶...");
    }
}
复制代码

成员变量和局部变量的主要区别如下:

定义的位置不同: 

  • 成员变量定义在类中方法外,
  • 局部变量定义在方法中或者是方法声明上

在内存中的位置不同: 

  • 成员变量是在堆区,
  • 局部变量是在栈区

生命周期不同:

  • 成员变量是随着对象的创建而存在,随着对象的销毁而销毁
  • 局部变量是随着方法的调用而存在,随着方法调用完毕而销毁

默认值不同:

  • 成员变量有默认值
  • 局部变量没有默认值,不赋值不能直接使用

成员变量初始化方式

  1. 成员变量有默认值
  2. 显式赋值
  3. 代码块
  4. 构造器建议只为实例变量初始化,不为静态类变量初始化
  5. 使用setXxx(参数列表)赋值
posted @   我的脚印  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示