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关键字联合使用,定义为常量。