day09 java​成员变量 实例变量(属性)vs类变量 他们的内存实现机制

目录

实例变量(属性)

实现和调用

属性的内存实现机制

空指针异常

类变量

定义与实现

类变量内存实现机制


变量的分类-按位置分:成员变量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.类变量是在方法区(静态域),实例变量在堆中的对象中。

 

类变量内存实现机制

类变量是随着类的加载而加载的,实例变量是随着对象的创建加载的。

类变量是在方法区(静态域),实例变量在堆中的对象中

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值