Java基础进阶-1-变量与对象(回收+内存占用)

目录

1、定义

1.1、原始数据类型

1.2、引用变量

2、对象的声明、创建与赋值

3、对象的回收

4、一个对象的内存

5、数组对象

6、方法参数

7、封装

8、实例变量与局部变量


1、定义

变量就是用一个数据类型和一个名字声明的。比如: String  name; name就是一个变量。

变量有两种:原始数据类型 和引用。

1.1、原始数据类型

原始数据类型指的是 8种数据类型:byte、char、short、int、long、float、double、boolean。

注意:float f=32.5f。 其中“f”。除非加上f,否则所有带小数点的值,都会被Java当成double来处理。

1.2、引用变量

  1. 事实上没有对象变量这种东西;
  2. 只有引用(reference)到对象的变量;
  3. 对象引用变量保存的是存取对象的方法;
  4. 它并不是对象的容器,而是类似指向对象的指针,或者可以说是地址。但在Java中我们不会也不该知道引用变量中实际装载的是什么,它只是用来代表单一的对象。只有Java虚拟机才会知道如何使用引用来取的该对象。
  5. 对象只存在于可回收的垃圾堆上。
  6. 原始数据类型变量是以字节来代表实际的变量值。但对象引用用字节来表示取的对象的方法,也就是保存着对象的地址。

2、对象的声明、创建与赋值

  • 声明一个引用变量: Dog myDog;

该过程会要求虚拟机分配空间给引用变量,并将此变量命名为myDog。次引用变量将永远被固定为Dog类型。

注意:对对象的引用,其实就是一个机器地址,一个机器地址所需内存一般是8字节(64位架构的计算机,32为架构的是4字节),而且所有的对象引用大小都一样。

  • 创建对象:   new Dog();

该过程会要求Java虚拟机分配堆空间给新建立的Dog对象。

  • 赋值: Dog myDog=new Dog();

将新创建的Dog赋值给myDog这个引用变量。

3、对象的回收

public class Student {
    String name;
    int age;

    public static void main(String[] args) {

        Student s1=new Student();   //创建对象1
        Student s2=new Student();   //创建对象2
        
        s1=null; //s1置空,这样 对象1没有被引用,可以被GC回收,但是s1可以引用其他相同类型的变量
        
        s1=s2;   //s1引用的对象变为 对象2 ,对象1 也没有被引用,可以被GC回收
        
        s2=null; //s2对对象2没有引用,但是s1对对象2有引用,所以不会被GC回收
    }
}

4、一个对象的内存

一个对象的内存=所有实例变量使用的内存+对象本身的开销(一般是16字节)

对象本身的开销=一个指向对象类的引用+垃圾回收信息+同步信息

另外一般内存的使用都会被填充为8字节(64位计算机中的机器字)的倍数。不够8的倍数,填充为8的倍数。

      Integer对象内存(24字节)= 对象开销(16字节)+int(4字节)+填充字节(4字节)

      Date对象内存(32字节)=对象开销(16字节)+3*int(12字节)+填充字节(4字节)

     Counter对象内存(32字节)=对象开销(16)+String(8)+int(4)+填充字节(4)、

     Node内存(40)=对象开销(16)+额外开销(8)+Item的引用(8)+Node的引用(8) 

因为Node是一个非静态的内部类,所以它持有对外部类的引用,额外开销就是来之于对外部类的引用。

对对象的引用,其实就是一个机器地址,一个机器地址所需内存一般是8字节(64位架构的计算机,32为架构的是4字节)

5、数组对象

数组也是对象,而且数组中的每个元素都是变量,要么是原始数据类型的变量,要么就是对对象的引用。

        int[] ages=new int[20];
        Student[] s=new Student[20];

6、方法参数

当我们创建有参数的方法时,我们方法里边的参数是形参,调用方法的一方会传入实参。

在Java中对于原始数据类型,调用方法进行传参时,它是通过拷贝来进行传递的,在方法中该边原始数据类型的值,不会改变传入方的值;但是对象的引用在传递的时候,会将形参和实参指向同一个对象,这时候在方法中改变对象中的值,是会影响到传入方对象的值的。

7、封装

封装的基本原则就是:将对象的实例变量标记为私有的,然后提供公有的setter和getter方法空控制存取动作。

8、实例变量与局部变量

实例变量永远都会有默认值,如果你没有明确的赋值给实例变量,或者没有调用setter,实例变量还是会有值。

int----0; float ----0.0; boolean---false ; 对象引用-----null;

局部变量没有默认值,如果在变量没有被初始化前就使用的话,编译器会显示错误。如下如的count;

 

 

 

 

 

 

 

 

 

 

 

原创文章 120 获赞 34 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/105078541
今日推荐