static与final关键字
一、static关键字
(1) static内存情况
被static修饰的成员(变量、方法、初始化块)都会被放在静态区(静态区又位于方法区中)
处在于可以共享同一块内存空间。这些成员随着类的加载而加载,优先于对象的存在,被类的所有对象共享。类成员既可以通过类来访问,也可以通过对象来访问。(推荐使用类来访问)。
语法: 类名 . 静态成员(变量、方法)
(2)何时使用static修饰符
如果某个成员变量需要被所有对象共享,就定义为静态
例如:饮水机(共享用的——静态修饰)
水杯(不能共享——不能用静态修饰)
用于表示共性的推荐用static修饰,特性用非static修饰。
(3) 注意事项
① 在静态方法中是没有this关键字的
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
② 静态方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量:只能访问静态变量
成员方法:只能访问静态成员方法
非静态方法:
成员变量:可以是静态的,也可以是非静态的
成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
总结:静态只能访问静态
(4) 静态变量和成员变量的区别
静态变量也叫类变量 成员变量也叫对象变量
①. 所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
②. 内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
③. 内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
④. 调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
(5) main方法介绍
public 被jvm调用,访问权限足够大。
static 被调用,不用创建对象,直接类名访问
void 被jvm调用,不需要给jvm返回值
main 一个通用的名称,虽然不是关键字,但是被jvm识别
String [] args 以前用于接收键盘录入的(现在用Scanner类)
(6) 工具类(推荐使用static)
案例:数组工具类
二、final关键字
(1) 修饰不同成员有不同的含义
修饰类:类不能被继承(String类)
修饰变量:变量一旦获得初始值就不可被改变(常量命名规范:如果是一个单词,所有字母大写,如果是多个单词,所有单词全部大写,单词间用下划线隔开)
修饰方法:方法不能被重写
final修饰变量时一般会与public static一起使用,public为了可以给其他类调用,static为了类加载后就能使用
(2) 修饰局部变量时数据类型的差异
方法局部变量:
基本数据类型:值不能改变
引用数据类型:地址值不能改变,对象中的属性可以改变
(3) 成员变量final初始化时机
(1) 显示初始化
final int num = 10;
注意:被final修饰的成员变量系统是不会进行默认初始化的
(2) 在对象构造完毕前即可
class Demo {
final int num;
public Demo(){
num = 10;
}
public void print(){
System.out.println(num);
}
}



注意:
① 不要同时在final修饰的成员变量进行显示初始化同时在构造器中再进行初始化。
② final修饰的成员变量,系统是不会对其赋默认值。
③ 一定要在定义或构造器中完成对被final修饰的成员变量的初始化,否则会报尚未初始化变量的问题
④ 如果被final修饰的成员变量没有在定义的时候进行初始化,所有的构造器都必须对被final修饰的成员变量进行初始化操作(因为不知道程序员会调用哪个构造器创建对象)