java中的final,static,成员变量,常量
一:final
final:不可改变
1.修饰变量,变量不能被改变
2.修饰方法:方法不可以被重写
3.修饰类:类不可以被继承
final修饰成员变量有两种方式:
1.声明的同时初始化
2.在构造方法中初始化
代码解析:
public class Demofinal extends Foo{
//final int age=18;声明的同时初始化
final int age;
public Demofinal(){//在构造方法中初始化
age=18;
}
public void test(){
//age=10; 错误,不能被改变,因为变量加了final
}
//public void test(){//编译错误,因为父类中的test2()加了final,不能被子类重写
//}
}
class Foo{//extends Eoo编译错误,因为Eoo加了final,不能被继承
final public void test2(){
System.out.println("foo");
}
}
final class Eoo{
}
二:static;静态的
1.静态变量:
1.由static修饰
2.属于类,存储在方法区中,只有一份
3.常常通过类名点来访问(在本类中中可以省略类名,编译器会默认提供,但跨类访问必须加上类名)
4.何时用:所有对象共享数据时
public class Demostatic {
static int age=15;
public static void main(String[] args) {
System.out.println(age);
}
}
class Goo{
public void test(){
System.out.println(Demostatic.age);
}
}
静态变量和成员变量的对比:
public class Demostatic2 {
int a;//成员变量
static int b;//静态变量
public Demostatic2(){
a++;
b++;
}
public void test(){
System.out.println(a+" "+b);
}
public static void main(String[] args) {
Demostatic2 p=new Demostatic2();
p.test();
Demostatic2 p2=new Demostatic2();
p2.test();
}
}
运行结果:
1 1
1 2
不难看出静态变量和成员变量的生命周期如何。
2.静态方法:
1.由static修饰
2…属于类,存储在方法区中,只有一份
3…常常通过类名来访问
4.静态方法没有this传递
5.何时使用:方法的操作仅与参数相关,而与对象无关;
public class DemostaticMethod {
int a;
static int b;
public void test(){
System.out.println(this.a);
System.out.println(b);
}
public static void test2(){
//System.out.println(this.a);
/*编译错误,原因静态方法没有this传递
* 而实例变量(成员变量)a必须通过对象来点访问,所以静态方法中不能直接访问实例变量
*/
System.out.println(b);
}
public static void main(String[] args) {
System.out.println(b);
}
}
3.静态块:static{};
1.由static修饰
2.属于类,在类加载期间自动执行,因为类只执行一次,所以,静态块只执行一次;
3.静态块中要比构造方法执行快
4.何时用:加载/初始化静态资源(图片,音频,视频)
public class Demostatic3 {
public static void main(String[] args) {
ioo p=new ioo();
ioo p2=new ioo();
ioo p3=new ioo();
ioo p4=new ioo();
}
}
class ioo{
public ioo(){
System.out.println("构造方法");
}
static{
System.out.println("静态块");
}
}
运行结果为:
静态块
构造方法
构造方法
构造方法
构造方法
可以看出静态块比构造方法执行快,并且执行一次。
三:成员变量
成员变量与局部变量的认识:
1.实例变量:没有static属于对象的,存储在堆中,有几个对象就有几个对象名点来访问。
2.静态变量:有static修饰,属于类;存储在方法区中,只有一份通过类名点来访问
栈:局部变量及其方法参数(开辟栈帧)
堆:new出来的对象(包括成员变量)
方法区:class字节码文件(包括方法,静态数据)
成员变量与局部变量的差别如下:
局部变量:
1.定义在方法中:
2.没有默认值;必须自己设定初值;
3.方法被调用时,存在栈中,方法调用结束,从栈中清除(生命周期)
成员变量:
1.,定义在类中,方法外
2.有默认值可以不被初始化
3.所有类被初始化后存储在堆中,对象被回收时,成员变量失效(生命周期)
四.常量:static final
1.必须声明并同时初始化,不能改变并且可以通过类名点来直接访问;
2.建议:常量名所有字母都大写,多个单词用_分隔
3.在编译时被自动替换为具体的值,效率高
4.何时用:一个数永远不变,反复使用
public class Demostaticfinal {
public static void main(String[] args) {
//Koo.PI=2.3;编译错误
System.out.println(Koo.PI);
}
}
class Koo{
//public static final double PI;编译错误,必须声明并同时初始化
public static final double PI=3.14;//(常量一定要用大写(显得专业))
}
执行过程:
1.加载koo.class到方法区中。
2.pi一并存储在方法区中。
3.到方法区中获取pi的值一并输出。