1.final和static变量:
1.1. final只能在类中定义时或者在构造器中进行初始化,且只能使用一种方法,属于对象。不同对象可以有不同的值,一旦赋值之后则不允许修改。 static可在类中定义、构造器、或者通过类名.变量名(对象.变量名)的方式赋值,即可以修改,但修改后所有对象对应的该变量值均相等。二者都在静态存储区。
final修饰的类属性(Field)、实例属性、局部属性能指定初始值的地方:
1)类属性:必须在类的静态初始化块或声明该属性时指定初始值。
2)实例属性:必须在非静态初始化块、声明该属性或构造器中指定初始值。
3)局部属性:局部变量中的属性必须由程序员显示初始化,形参中的final属性不能修改其值。
1.2. 当final修饰引用类型变量时,该引用的对象所引用的地址不可变,即一直指向同一个对象,但该对象中的属性内容可以改变。
static只能修饰类属性或方法。
1.3. 可执行“宏替换”的final变量
条件:1)使用final修饰
2)在定义时指定了初始值。
3)该初始值在编译时就可确定下来。
例如:1)在方法中定义
final int a=5;//即可作为宏替换使用。
2)若被赋值的表达式只是基本算术表达式或者字符串连接,没有访问普通变量或者调用方法,则同样可作为宏替换使用。如:
final string s1="zhang"+88;//可直接将s1认为是“zhang88”,即s1=="zhang88";
final string s2="zhang"+String.valueOf(88);//调用了String的valueOf()方法,不能将s2作为宏替换。若使用==,则时s2!="zhang88"。
2.方法:
fianl:不允许其子类覆盖该方法。
static:只能访问所属类的static成员变量和成员方法以及一些基本数据类型变量。private成员都隐式地指定为final,即不让子类访问。
3.修饰类时:
final:说明不能定义该类的子类。因为此时默认的成员方法全为final
static:不能修饰外部类,但可以定义静态内部类,可以把一个类隐藏在另一个类的内部,以便取消赋值时产生的引用。
4.什么时候定义静态函数/静态变量?
当对象中出现共享数据时,该数据被静态所修饰。(对象中的特有数据要定义成非静态存在于堆内存中)
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义为静态的。