Java中static与final关键字

static关键字

在定义一个类时,只是在描述一类事物的特征和行为,并没有产生具体数据,只有在通过new关键字创建类对象的时候,系统才会为每个对象分配储存空间,在某些时候程序员希望某些特定的数据在内存中只有一份,而且能够被这一个类的所有实例对象共享使用,这时候就会使用到static关键字——引用自《Java基础案例教程》
使用static关键字可以节省内存空间,静态变量在类加载的时候初始化,置入方法区内存中。所以静态方法不能调用非静态的东西,因为非静态的资源在创建对象后才会产生,而静态资源调用的时候,非静态资源可能还没产生!
使用static修饰的属性,方法,代码块可以直接使用类名调用,不需要创建对象。
静态资源只有一份,如果在一个对象中修改了这份资源,后面的对象调用的就是修改后的静态资源

package test;

public class StaticTest2 {
	//创建一个静态代码块
	static{
		System.out.println("静态代码块执行了");
	}
	static int a=10;
	static void test() {
		System.out.println("静态方法:"+a);
	}
	
	public static void main(String[] args) {
		StaticTest2.test();
	} 
}

在这里插入图片描述
由这段代码块可以得知静态资源在实例对象创建前就已经产生了,所以被static修饰的变量和方法可以直接通过类名.属性名/方法名的方式调用。

package test;

public class StaticTest2 {
	//创建一个静态代码块
	static{
		System.out.println("静态代码块执行了");
	}
	static int a=10;
	static void test() {
		System.out.println("静态方法:"+a);
	}
	
	public static void main(String[] args) {
		//创建一个实例对象st1
		StaticTest2 st1=new StaticTest2();
		//修改静态变量a的值
		st1.a=9;
		//创建一个实例对象st2
		StaticTest2 st2=new StaticTest2();
		//打印st2的值
		System.out.println(st2.a);
	} 
}

在这里插入图片描述
运行这段代码就会发现,实例对象st2调用的静态变量a的值就是实例对象st1修改后的值,静态资源只有一份存储在方法区内存中,只要有一个对象修改了,后面对象调用的静态资源都是修改后的!

final关键字

final关键字表示最终的,不可改变的。
被final关键字修饰的变量,只能在定义时或者调用构造方法时赋值一次,赋值一次后就是常量,不能再被修改
被final关键字修饰的方法,可以被继承,但是不能被重写
被final关键字修饰的类,不能被继承。

public class FinalDemo {
	//定义一个final修饰的变量a并赋初始值
	final int a=10;
	//定义一个final修饰的变量b通过构造方法赋初始值
	final int b;
	public FinalDemo(int b) {
		this.b = b;
	}
	public static void main(String[] args) {
		FinalDemo fd=new FinalDemo(9);
		fd.a=1;
		fd.b=2;
	}
}

这段代码运行结果如下:
在这里插入图片描述
被final修饰的变量即为常量,一旦赋值后就不可被改变



public class FinalDemo {
	//定义一个final修饰的方法
	final void test() {
		System.out.println("final");
	}
	public static void main(String[] args) {
		FinalDemo2 fd2=new FinalDemo2();
	}
}
class FinalDemo2 extends FinalDemo{
	//重写父类中的test方法
	final void test() {
		System.out.println("2");
	}
}

在这里插入图片描述
被final修饰的方法不能被重写



public final class FinalDemo {
	//定义一个final修饰的方法
	final void test() {
		System.out.println("final");
	}
	public static void main(String[] args) {
		FinalDemo2 fd2=new FinalDemo2();
	}
}
class FinalDemo2 extends FinalDemo{
	//重写父类中的test方法
	final void test() {
		System.out.println("2");
	}
}

在这里插入图片描述
被final修饰的代码块不能被继承

static与final关键字联合使用

在开发人员编写程序的时候,有时候会需要在一个类的多个对象中用到一些常量,这时候就需要使用static和final联合定义一个常量,其中static与final关键字的顺序不分先后。

public final class FinalDemo {
	public static void main(String[] args) {
		Warehouse wh=new Warehouse();
		for(int i=0;i<=10;i++) {
			wh.deposit();
		}
	}
}

//定义一个仓库类
class Warehouse{
	//定义仓库的最大容量为100立方米
	public static final int MAX_CAPACITY=100;
	//定义一个仓库当前容量
	public int currentCapacity=0;
	//定义一个存入方法
	public void deposit() {
		//先判断,仓库容量是否到最大值
		if(currentCapacity>=MAX_CAPACITY) {
			System.out.println("仓库容量到最大值");
		}else {
			System.out.println("存入10平方米货物");
			currentCapacity+=10;
		}
	}
}

上面代码中,仓库的最大容量是不会改变的,所以适合用static,final关键字联合使用,定义为常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值