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关键字

时间: 2025-01-06 13:39:42

Java之static和final的使用陷阱的相关文章

Java中static、final用法小结(转)

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

Java中static、final用法小结

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

java中static、final、static final的区别

final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值. final修饰的属性表明是一个常数(创建后不能被修改). final修饰的方法表示该方法在子类中不能被重写,final修饰的类表示该类不能被继承. 对于基本类型数据,final会将值变为一个常数(创建后不能被修改):但是对于对象句柄(亦可称作引用或者指针),fin

Java中static 和final的区别

final定义的变量可以看做一个常量,不能被改变: final定义的方法不能被覆盖: final定义的类不能被继承. final static 就是再加上static的特性就可以了 static 和final是没有直接关系的 static 是在内存中分配一块区域,供整个类通用,所有的类的对象都享有它的共同的值 static 和final的区别 一.static : 什么情况下我们要使用static呢? 1.只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创 建对象. 2

Java中static、final用法

一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的

Java的static和final关键字的用法

static关键字的用法 static的意思是"'静态的",在java里面可用于修饰属性和方法. static关键字的应用应注意以下几种情形: 1.static作用于某个字段,一个static字段对每个类来说只有一份存储空间,而非static字段是每个对象有一份存储空间. 2.static作用于方法的重要用法是不需要创建任何对象直接调用该static方法,这对于main()方法很重要. 3.static不能应用于局部变量. 4.Java中禁止使用全局方法,所以引入static方法通过类

java笔记——Java关键字static、final使用小结

static  1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的).对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活). 2

Java关键字static、final使用小结

static  1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的).对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活). 2

java中static,super,final关键字辨析

1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2:super关键字 1)使用super关键字调用父类的成员变量和成员方法. 格式1:super.成员变量 格式2:super.成员方法([参数1,参数2...]) 2)使用super关键字调用父类的构造方法 格式1:super([参数1,参数2...]) 总结:this代表当前对象(可以输出或地址).