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的值一并输出。