目录
一、关于this
关于this在Java类中主要有两种作用,一个作用是指代一个对象,另一个作用是用于区分局部变量与成员变量。还有额外的一点,当this后加()时,this()的含义是指构造方法。
1、指代对象
public void show() {
System.out.println("this.col = " + this.col + ", this.row =" + this.row);
this.setCol(INITIAL_COL);
this.setRow(INITIAL_ROW);
}
众所周知,类的成员以及方法的调用需要对象,对象.成员、对象.方法( ) 是常见的调用成员与方法的手段。而在类中使用this可以很好的代替掉未知的类实例化的对象,从而实现方法的调用。
2、区分变量
public void setRow(int row) {
if(row < 0 || row >= 80) {
row = 1;
}
//row = row;
this.row = row;
}
如上图所示,“row = row;”与“this.row = row;”相比,后者多了this作为变量的修饰,这个this的含义在与明确指明这个row变量是类的成员变量,而不是方法所给出的形参变量。
3、构造方法-this()
public MyPoint() {
this(INITIAL_COL, INITIAL_ROW);
}
public MyPoint(int col) {
this(col, INITIAL_ROW);
}
public MyPoint(int col, int row) {
this.col = col;
this.row = row;
}
this()代表构造方法,例如上面给出的“this(INITIAL_COL, INITIAL_ROW);”就代表了调用了MyPoint类的双参构造,无参构造及其他构造方法同理。当this()作为构造方法时需要注意以下要点:
1、参数个数决定其调用的是何种构造方法。
2、this()只能出现在构造方法中,且只能在构造方法的首行。
3、this()不允许递归调用问题(当然Java编译器也不允许递归构造的出现)。
使用this()调用构造方法的目的及好处是可以避免代码重复的问题,使代码更简洁明了。在之后的修改方面需要修改的地方也会很少。
二、关于final
在C语言中存在“宏替换”方法来避免代码中出现让人摸不到头脑的数字问题,而Java中并没有宏这个定义的,但是存在与之相似的final关键字。final与C语言中的const很类似,final修饰的变量被称为“只读变量”或“常变量”。如下所示:
private static final int INITIAL_COL = 1;
private static final int INITIAL_ROW = 1;
private int col;
private int row;
public MyPoint() {
this(INITIAL_COL, INITIAL_ROW);
}
final的存在可以使代码的可读性提高,含义更明显。
三、关于static
1、类实例空间
“ 变量的本质是一段连续的存储空间 ”这个概念对于Java的成员变量依然适用。提到static就不得不提到类实例空间。在实例化一个类的对象时会申请生成一个类实例空间,类由成员与方法构成,类的每一个类实例空间都应该具备各自独立的成员与方法吗?答案是否定的,有一份就够用的信息坚决不重复,但是必须做好区分,于是类实例空间的各实例空间拥有各个独立的成员,但是共用同一份方法副本。
2、静态存储分配模式
Java中的static关键字继承了C语言中static的基因,static修饰的变量称为静态变量,其修饰的方法称为静态方法。
public static void main(String[] args) {
MyPoint point1 = new MyPoint(2, 5);
MyPoint point2 = new MyPoint();
point1.OK = 2;
System.out.println("point1的OK:" + point1.OK);
System.out.println("point2的OK:" + point2.OK);
}
如图所示,静态成员的空间被所有实例化的对象共用,当然上图中对于静态成员的调用不太正确,目的仅仅是为了说明静态空间只需申请一份,被所有对象所共用。
而static所修饰的方法称为静态方法,静态方法不能引用非静态成员和非静态方法。原因是JVM在加载类的时候就申请了静态成员的空间,所以如果在静态方法中引用非静态成员会遇到非法访问的错误,无法正常实现。
静态方法与静态变量的调用不需要对象来调用,使用类.方法()来直接调用,无需new一个类的对象。而且在静态方法中不可以出现this,因为this指代对象本身,而静态方法在JVM加载类时就申请空间了,没有对象生成。故不允许静态方法中出现this。