Java之static和final的使用陷阱

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之static和final的使用陷阱相关的知识,希望对你有一定的参考价值。

  1. 对于final类型的成员变量,一般来说有两种赋初值方式

    1.在声明final类型的成员变量时就赋上初值

    2.在声明final类型的成员变量时不赋初值,但在类的所有结构方法中都为其赋上初值

  2. static代码块:静态代码块

package com.yuanzijain08;

class P{
	static {
		System.out.println("static block");
	}
	public P(){
		System.out.println("p constatictor");
	}
}

public class StaticTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
			P p = new P();
	}

}

执行结果

static block
p constatictor


3.

package com.yuanzijain08;

class P{
	static {
		System.out.println("P static block");
	}
	public P(){
		System.out.println("p contructor");
	}
}
class Q extends P{
	static {
		System.out.println("Q static block");
	}
	public Q(){
		System.out.println("Q contructor");
	}
}
class S extends Q{
	static {
		System.out.println("S static block");
	}
	public S(){
		System.out.println("S contructor");
	}
}
public class StaticTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
			new S();
	}

}

执行结果

P static block
Q static block
S static block
p contructor
Q contructor
S contructor

4.静态代码块。静态代码块的作用也是完成一些初始化工作,首先执行静态代码块,然后执行构造方法,静态代码块在类被在加载的时候执行,而构造方法是在生成对象时候执行,要想在调用某个类来生成对象,首先要将类加载到Java虚拟机上,然后jvm加载这个类来生成对象

package com.yuanzijain08;

class P{
	static {
		System.out.println("P static block");
	}
	public P(){
		System.out.println("p contructor");
	}
}
class Q extends P{
	static {
		System.out.println("Q static block");
	}
	public Q(){
		System.out.println("Q contructor");
	}
}
class S extends Q{
	static {
		System.out.println("S static block");
	}
	public S(){
		System.out.println("S contructor");
	}
}
public class StaticTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
			new S();
			new S();
	}

}

执行结果

P static block
Q static block
S static block
p contructor
Q contructor
S contructor
p contructor
Q contructor
S contructor

5.类的静态代码块只会执行一次,是在类在被加载时候执行的,因为每个类只会被加载一次,所以静态代码块只会被执行依稀,而构造方法则不然,每次生成一个对象的时候都会调用的构造方法,所以new一次就会调用构造方法

6.如果继承体系中既有构造方法,又有静态代码块,那么首先去执行最顶层类的代码块,一直执行到最低成的静态代码块,,然后去执行最顶层类的构造方法,一直执行最底层的构造方法,注意:静态代码块只能被执行一次

7.不能再静态方法中访问非静态的成员变量,可以在静态方法中访问静态的成员变量,可以在非静态方法中访问静态的成员变量

  总结:静态只能访问静态,非静态的可以访问一切方法

8.不能再静态方法中使用this关键字

以上是关于Java之static和final的使用陷阱的主要内容,如果未能解决你的问题,请参考以下文章

一脚踩进java之基础篇19——面向对象 (final,static关键字)

一脚踩进java之基础篇19——面向对象 (final,static关键字)

java学习笔记之面向对象static,final关键字

Java基础之final和static关键字

Java之static与final关键字

面向对象之static与final关键字