03、类变量、实例变量、局部变量

  • 与所有程序设计语言一样,Java 也使用变量存储值
    • 常量就是 不变变量
  • Java语言是一个 强类型语言
    • 所有变量,必须先声明类型后使用
    • 指定类型的变量只能装该类型对应的数据

1、定义

  • 变量:在程序的执行过程中,它的是可以被改变的。
  • 语法格式:
【修饰符】类型  field名 = 默认值;
  • 变量名的命名规则:
    • 首字母小写,有多个单词组成时,要满足驼峰标识

2、变量的声明、赋值、使用、修改

  • 声明栈内存申请空间
    • 对于基本类型的变量(如:int、float 等),声明时系统会为其分配固定的内存空间。
      • 如:int 类型占用 4 字节,double 类型占用 8 字节‌。
    • 对于引用类型的变量(如:对象、数组等),声明时不会直接分配内存来存储数据
      • 而是分配一个存储引用值的内存空间。
      • 这个引用指向实际对象数组的内存地址‌
  • 赋值向内存中填内容
    • new 指令就是向堆内存申请空间,并为成员变量 赋予默认值,此时对象处于半初始化状态
      • 接着:调用对象的构造方法,为变量赋值
  • 使用通过名字调用内存中的值
  • 修改用新的值替代旧的值
// 变量的声明
int vacationDays;
// 变量的初始化
vacationDays = 12;

// 变量的声明 和 初始化
int vacationDays1 = 12;

3、局部变量(可以有的修饰符:final)


  • 方法中的 参数方法语句块内部定义的变量
    • 方法里的局部变量,仅在该方法内有效。
    • 代码块里的 局部变量 ,仅在代码块内有效。
    • 形参,在整个方法内有效。

  • 规则:
    • 声明一个局部变量后,必须用赋值语句显式地初始化变量。
      • 编译器不会为局部变量分配默认值
    • 在使用局部变量之前,必须显式初始化它们,否则将发生编译错误
public class Example {  
    public static void main(String[] args) {  
        int x;  

        // Compilation error: The local variable x may not have been initialized  
        System.out.println(x); 
    }  
}  
  • 在 Java 10 中,如果可以从变量的初始值推导出变量数据类型
    • 那么,可以用 var 关键字声明局部变量,而无须指定数据类型
      • 即:从等号右边明显看出数据类型,在这种情况下都可以使用 var 表示法。
  • 注意:var 关键字只能用于方法中的局部变量参数字段数据类型必须声明
var date = new Date();

4、实例变量 / 对象属性


  • 从有实例开始,实例变量就存在了。
  • 实例被销毁,实例变量就不存在了。
  • 0~N 个,程序每创建一个实例,系统就为实例变量分配一块内存。

  • 规则:系统会为成员变量执行默认的初始化。
    • 整型初始化为 0
    • 浮点型初始化为 0.0
    • boolean 类型初始化为 false
    • char 类型的初始化为 ‘\u0000’
    • 引用数据类型初始化为 null 。

5、类变量 / 静态属性 / 类属性

  • 从类开始,类变量就存在了。
  • 一个 JVM 里,类信息只有一个。
  • 每个 JVM 最多只加载一个类一次,系统只为类变量分配一块内存。
  • 规则:系统会为成员变量执行默认的初始化。
    • 整型初始化为 0
    • 浮点型初始化为 0.0
    • boolean 类型初始化为 false
    • char 类型的初始化为 ‘\u0000’
    • 引用数据类型初始化为 null 。
public class AboutNull {

    static int staticFiled = 123;
    int ordinaryFiled = 123;

    private static void staticMethod(){ System.out.println("静态方法:staticMethod"); }

    private void ordinaryMethod(){ System.out.println("普通方法:ordinaryMethod"); }

    public static void main(String[] args) {
        AboutNull aboutNull = null;
        // false
        System.out.println(aboutNull instanceof AboutNull);

        // 通过上边 实例变量 来调用静态属性和静态方法,没有抛出 NullPointerException 异常。
            // 验证:当使用实例变量来调用静态元素时,底层实际上是通过委托类来访问的。
        // 输出: 静态方法:staticMethod
        aboutNull.staticMethod();
        // 输出: 123
        System.out.println(aboutNull.staticFiled);

        // 抛出异常:NullPointerException
        System.out.println(aboutNull.ordinaryFiled);
        // 抛出异常:NullPointerException
        aboutNull.ordinaryMethod();

        aboutNull = new AboutNull();
        // true
        System.out.println(aboutNull instanceof AboutNull);
    }
}
  • 注意:当程序通过实例来访问类变量时----由于类变量本身就不属于实例
    • 因此,底层实际上委托为,通过来访问的。

6、为什么成员变量命名不建议用 isXXX?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值