目录
前言
在Java初阶之类和构造方法中的学习中,我通过总结以及查阅资料,对以下问题有了更深一层的理解。
- 类的作用是什么?(它存储的到底是什么)
- 类中内存区域划分为哪几部分?
- this关键字用来修饰和表示什么?
- this关键字修饰的方法有哪几种?
- static关键字用来修饰什么属性?
如果你在Java初阶之类和构造方法中,也想对这些问题有一个更深的理解,请阅读这篇文章,或许会对你有所启发。
一、类和对象
上篇我们说到了类和对象,这篇我们对类和对象再进行巩固加延伸,类是用class关键字定义的,它的作用主要是用来引用数据类型的,其实类中存储的就是一块堆内存的地址,我们将类中内存区域划分为两部分,栈和堆,栈中存储着方法的临时变量,也就是形参和局部变量,堆中存储着关键字new出来的对象,new出了的对象可是实实在在存在的实体,下面我们来声明一个Student。
代码展示:
class Student{
public String name;
public int age;
public void fun(){}
}
在代码中所展示的这个类是抽象概念,没有实体,类本来就是一个蓝图,模板,规定了该类的所有对象都应该具备的属性,即方法。当使用类来产生具体的对象时,才会开辟内存空间。通常我们会使用关键字new用来产生一个具体的对象,此时这个对象才是实实在在的实体,用下述代码来表现关键字new的作用。
代码展示:
public class Student{
private String name;
private int age;
public static void main(String[] args) {
Student stu=new Student();
stu.name="紫萱";
stu.age=20;
stu.fun();
}
private void fun() {
}
}
在Student stu =new Student()这串代码所示,其中,我们将stu称为Student对象的引用,它的作用是保持了一块堆内存的地址,而new出来的Student就是Studet类的构造方法,它是产生对象时自动调用的。那么我们如何得知到底产生几个对象,其实方法很简单,就看new了几次,简单点说,就是看new出现了几次,每当出现关键字new,就意味着产生了新对象,在堆中开辟了新的空间,我们提到引用时,就不得不提到如何得知一个引用修改的变量对其他引用是否可见,其实是看这个引用和其他引用是否指向同一块地址,简而言之,就是看要比较的引用指向的对象是不是同一个。
二、this关键字
1.修饰属性
this关键字用来修饰属性,表示调用类中的成员变量,一般代码中,调用代码时,编译器要从该位置开始查找最接近对象的属性在哪,这种查找方式使用的就是程序的就近匹配原则,编译器会从调用代码处的最近位置查找有无匹配的变量或者方法,若找到直接使用最近的变量或方法,用下述代码展示Java的就近匹配原则。
代码展示:
public class Student{
public String name;
public int age;
public String sex;
public Student(String name,int age){
name=name;
age=age;
}
}
对于Java编译器而言,当执行name=name时,就会查找最接近的name属性在哪,找到就直接调用,构造方法的形参和类中的成员变量都叫name。但是形参name距离调用处最近,会优先被编译器找到并使用。形参其实是自己调用自己,和类中成员变量name没关系!
但是若用this调用属性时,就可以直接从类中寻找同名的成员变量,this属性名称的作用就是直接从类中寻找成员变量,下述代码展示的便是this调用属性。
代码展示:
public class Student{
public String name;
public int age;
public String sex;
public Student(String name,int age){
//打破就近匹配原则,直接从类中寻找叫name的成员变量
this.name=name;
this.age=age;
}
}
2.修饰方法
(1)this修饰普通的成员方法
代码展示:
public class Student{
public String name;
public int age;
public String sex;
public Student(String name,int age,String sex){
this.name=name;
this.age=age;
this.sex=sex;
}
public void fun(){
System.out.println();
this.show();
}
public void show(){
System.out.println("show成员方法");
}
}
当this修饰普通的成员方法时,this可写可不写,但是推荐大家写上,尤其在之后有继承和多态之后,this.方法名称明确表示调用的是当前类的成员方法。
(2)this修饰构造方法
语法this(构造方法的参数)千万记住没有“.”,加“.”表示调用的类中的构造方法,不加“.”只使用this关键字,来表示构造方法的互相调用过程!
代码展示:
public class Student{
public String name;
public int age;
public String sex;
public Student(){
System.out.println("**************");
}
public Student(String name,int age){
//调用无参构造
this();
this.name=name;
this.age=age;
}
public Student(String name,int age,String sex){
//调用两个参数的有参构造
this(name,age);
this.sex=sex;
}
}
从上述代码中我们还可以得知,this调用构造方法必须放在当前构造方法的首行调用,那是因为在一个构造方法中去调用另一个构造方法,希望借助已经定义好的构造方法帮助我们赋值实现初始化工作,这是由于逻辑上的先后顺序,先调用已有方法再调用自己的操作。值得我们注意的是,对构造方法的调用不能成“环”,必须线性调用,若是调用成环,则会无限循环。
3.表示当前对象的引用
当前是通过哪个对象调用的属性或者方法,this就指代谁。
代码展示:
public class Student{
public String name;
public int age;
public String sex;
public void show(){
System.out.println(this);
}
public static void main(String[] args) {
Student stu=new Student();
System.out.println(stu);
stu.show();
System.out.println("-------------");
Student stu1=new Student();
System.out.println(stu1);
stu1.show();
System.out.println("-------------");
Student stu2=new Student();
System.out.println(stu2);
stu2.show();
}
}
四、static关键字
无论static修饰的是什么,看见static,和对象无关,属于类固有的作用域。static不能直接访问类中的成员域,包括成员属性和成员方法,只能修饰类中的属性,称之为类的静态属性,也叫做类属性,和具体的对象无关,绑定在类上,存储在JVM的方法区,static修饰的属性因为保存在方法区,所有类中的对象,即常量和静态变量,共享同一个方法区,直接使用类名称来访问静态变量,不推荐使用某个对象来访问。
总结
以上就是今天所讲内容,本文简单的介绍了this关键字和static关键字,若在后续过程中,学习到更多的相关知识,也会进行补充,希望大家都能熟练掌握本篇内容!