JAVA的new对象的存储过程、构造方法、this关键字、static关键字

对象的存储过程

我们在mian方法中进行实例化的时候都是通过new关键字来进行的,那么我们new完对象后的内存过程是什么样子的呢,带大家看一下,下面的图片。
在这里插入图片描述
首先我们在方法区中执行class文件,然后在堆内存中开辟一个空间名字是 new Person的类,然后加载我们类中的所有成员,让我们所有成员都加载完成后,会生成一个引用地址,那地址是一个16进制的hashcode码,生成的地址就放在堆中,等带对象进行引用。
随后在栈内存中开辟一个空间,存储着名为Person类变量名字为p的变量,p这个变量就去找这个引用地址,并调用里面的属性进行赋值,赋值完成后,再去调用我们的对象的方法,在栈内存中执行,当代码执行完成后,就会进行弹栈释放,随后再去调用其他的方法,依然是用完后再进行弹栈释放。
当方法都调用完毕,也释放完毕后,我们这个变量名为p的变量随后也会进行弹栈释放,并放弃当前的引用地址,那么我们堆内存中的对象怎么办呢,当然我们的JAVA是自带垃圾回收器的就是我们的GC,GC垃圾回收器会定时的查看我们堆中的对象是否还在被引用,如果没有被引用,那么我们的GC垃圾回收器就会回收我们这个对象。

构造方法

构造方法是做什么的呢?构造方法就是用来做事情用的,那么怎么做事情呢?它是不必须常见自己的构造方法,而是随着对象被创建而生成的。
我们构造方法也是一个方法,那么也是存在着重写的。比如下面的代码:

public class Person(){
	public Person(){}
	public Person(String name){
		this.name = name;
	}
	public Person(String name,int num){
		this.name = name;
		this.num = num;
	}
}

我们还记得什么是重载的吧,重载的特点就是一个类中的很多个方法,方法名相同,参数类表不同。
我们的构造发方法的要求就是没有static修饰符,不写返回值,名字和类名一致。
那么构造方法的特点都有哪些呢?

  1. 每一个类都有一个默认的无参数的构造方法存在
  2. 若自己在类中创建构造方法 则默认无参数的即被覆盖(即便是自己写的这个与默认的结构一致)
  3. 构造方法也存在方法重载
  4. 不是必须创建自己的构造方法 当你需要在创建对象同时做一些其他操作时可以写构造方法
  5. 在构造方法中传递参数 若 与属性重名 需要利用this来区别属性与变量

调用是通过我们new出来的对象进行赋值的,或者通过我们的有参构造方法进行赋值,代码如下:

public class Test{
	//方法一:通过对象.调用赋值
	Person p = new Person();
	p.name = "张三";
	//方法二:通过有参构造方法赋值
	Person p = new Person("张三");
}

以上是我们是如何调用赋值的。

this关键字

this关键字:

  1. this调用本类中的属性,也就是类中的成员变量;
  2. this调用本类中的其他方法;
  3. this调用本类中的其他构造方法,调用时要放在构造方法的首行

看了几篇关于this关键字的文章,感觉跟多人初学者对于this关键字的使用都是云里雾里,我觉得主要还是要结合代码来看吧。这样理解的更快一点。

引用成员变量

public class Student { 
	String name; //定义一个成员变量name
	private void SetName(String name) { //定义一个参数(局部变量)name
 		this.name=name; //将局部变量的值传递给成员变量
 	}
}

this这个关键字代表的就是对象中的成员变量或者方法。也就是说,如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,而不是指成员方法的形式参数或者局部变量。

调用类的构造方法

public class Student { //定义一个类,类的名字为student。 
	public Student() { //定义一个方法,名字与类相同故为构造方法
		this(“Hello!);
 	}
 	public Student(String name) { //定义一个带形式参数的构造方法
 	}
}

Student方法有两个构造方法,一个没有参数,一个有参数。
在第一个没有带参数的构造方法中,使用了this(“Hello!”)这句代码,这句代码表示使用this关键字调用类中的有一个参数的构造方法。
那么总结一下this关键字的特点:

  1. this是一个对象 可以与之前的对象使用一致
  2. this可以调用一般属性 也可以调用一般的方法 调用一般的方法可以放置在代码的任意位置
  3. this如果调用一般的方法, 可以来回互相调用(写法 编译通过)
    执行代码时会产生错误 StackOverflowError
  4. this可以调用构造方法,写法 :this(参数);
  5. 只能在一个构造方法内调用另外的构造方法
  6. 只能放置在程序执行的第一行
  7. 构造方法是不能来回互相调用

static关键字

在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块。
Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域(只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们),有了这些“固定”的特性,那么JVM就可以非常方便地访问他们。同时如果静态的成员变量和成员方法不出作用域的话,它们的句柄都会保持不变。同时static所蕴含“静态”的概念表示着它是不可恢复的,即在那个地方,你修改了,他是不会变回原样的,你清理了,他就不会回来了。
同时被static修饰的成员变量和成员方法是独立于该类的,它不依赖于某个特定的实例变量,也就是说它被该类的所有实例共享。所有实例的引用都指向同一个地方,任何一个实例对其的修改都会导致其他实例的变化。
那么大家可以去了解一下类中成员变量的加载过程是什么样子的!是谁先出谁后出来。
我也不太去深谈static,我们只是简单粗略的说下static,static是静态的,被它修饰的,全部都是类成员共享,它可以修饰类中的属性、方法、程序块、内部类。
那么总结下来:

  1. 类加载时会出现一个当前类自己的静态元素空间
    类加载时即初始化 只加载一次 全部类对象/类本身可以共享
  2. 类空间不能回收 静态元素空间也不能被GC回收 常驻内存
  3. 可以不用创建对象 通过类名. 直接访问
  4. 静态元素与非静态元素之间的访问关系
    1)、静态成员是可以访问静态成员
    2)、非静态成员可以访问静态成员
    3)、静态成员不能访问非静态成员
    4)、静态成员中不能使用this super关键字

还要补充一点,就是一般我们static修饰符都是和final符修饰一起搭配使用的,那么这就是静态常量,类加载的时候直接初始化了,而且是初始化不可修改的。

public static final int STUDENT_NUM =1234; 

这种写法增强了代码的可读性,那么需要注意的是名字的规范问题,我们静态常量的名字是全部大写的,而且两个单词之间是用“_”来分割的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值