关于final:
在C语言中,为了避免“神仙数字”和提高代码可维护性,引入了宏替换概念。
即#define MAX 100
在java中虽然没有宏替换,但是有final,相当于C中const。被final修饰的变量就是只读变量,可以作为宏替换的替代品。
如下
public final int MIN_ROW = 1;
public final int MAX_ROW = 25;
public void setRow(int row) {
if (row < MIN_ROW || row > MAX_ROW) {
row = 1;
}
this.row = row;
}
这样的写法提高的代码的可读性,可维护性。
用法:
①修饰类:不可继承
②修饰方法:不可重写
③修饰变量:
基本数据类型:被初始化后不可更改
对象:不可改变指向,可改变对象内部内容
关于static:
变量的本质是内存中的一段连续存储空间。
在new的介绍时,new的核心就是申请类实例空间,但类的成员有:数据成员和函数成员,那么
类的每一个实例空间是否都需要具备各自独立的成员和方法呢?
实际对所有类:每一个类实例空间拥有自己的、独立的成员变量,但,所有类实例空间只共享同一份方法副本
静态存储分配模式:
在Java同C语言中,由static修饰的成员,其空间的申请操作远早于非static修饰的成员
称有static修饰的成员和方法叫“静态成员”和“静态方法”。
而JVM对类加载时,就申请了静态成员的空间。
而对静态成员的定义如下:
public static int pointCount;
public static int getPointCount() {
return pointCount;
}
public static void increasePointCount() {
++pointCount;
}
对静态成员的调用如下:
public static void main(String[] args) {
++This.pointCount;
System.out.println(This.pointCount);
This.increasePointCount();
System.out.println(This.getPointCount());
}
注意前两行代码,并没有出现之前常用的pointOne对象,也就是没有任何new过程,直接出现类名称。
这就是静态成员在类外的调用方法:类名称.静态成员
同样的,对静态方法的调用:类名称.静态方法()
总结就是:静态成员是从属于大家的共同财产,不是仅仅从属于某个对象的私有财产。
静态方法不能引用非静态成员和非静态方法:
通过之前说过静态成员的空间申请远早于其他成员,那么不难推出类的静态方法可以在没有实例化该类的任何对象前提下调用
在之前的介绍中说过,对类方法中,直接对非静态成员的引用,事实上都存在一个已经实例化的对象或类方法中出现的“没有前缀的非静态成员”,都可以增加一个“this."前缀
但是静态方法可以在没有实例化的前提下调用,这就引起了静态与非静态之间调用的矛盾(静态方法中可能会调用不存在的对象),所以静态方法不能引用费静态成员和非静态方法。
静态方法中不能出现this
实际同不能引用费静态成员,this作用是指代对象本身,那么静态方法的调用是在对象申请之前的,故this不能出现。
但是下方代码:
public static void printPoint(This point) {
System.out.println(row + col);
System.out.println(this.row + this.col);
System.out.println(point.row + point.col);
}
前两个输出都是有错误的:这两行都违背了不能引用费静态成员的规则
但是第三个输出的数据是输出的是由实参传过来的形参。
故当使用时,先实例化一个This类对象,再调用该静态方法即可使用。