java基础知识—java中static修饰符

static:表示“全局”或者“静态”的意思,开用来修饰变量、方法、代码块。

1.静态变量

按照是否静态对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量

两者的区别是:
(1).对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,它当且仅当在类初次加载时会被初始化,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。static成员变量的初始化顺序按照定义的顺序进行初始化。
(2).对于实例变量,每创建一个实例,就会为实例变量分配一次内存,在创建对象的时候被初始化,实例变量可以在内存中有多个拷贝,互不影响(灵活)。


public class Test{
	public static final int age=10;
	public static void main(String[] args){
		System.out.println(Test.age);//类名.变量
		Test test=new Test();
		System.out.println(test.age);//类的实例.变量
	}
}

类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载。JVM(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件。

类变量,会在加载时自动初始化,初始化规则和实例变量相同。


2.static修饰方法

当static修饰方法时,我们称它为静态方法,此时这个方法成为整个类所公有的方法,可以用类名.方法名访问,也可以通过实例调用。

在使用静态方法时,需要注意以下几点:

(1)static修饰的方法,不直接能访问本类中的非静态(static)成员(包括方法和属性)本类的非静态(static)方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法(下图)。静态方法要慎重使用。在静态方法中不能出现this和super关键字它不依附于任何对象,既然都没有对象,就谈不上this了。

(2)父类中是静态方法,子类中不能覆盖为非静态方法,在符合覆盖规则的前提下,在父子类中,父类中的静态方法可以被子类中的静态方法覆盖,但是没有多态。

(3)父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法覆盖。

(4)因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。


3.static代码块

static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

class Person{
    private Date birthDate;
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        Date startDate = Date.valueOf("1990");
        Date endDate = Date.valueOf("2000");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}
分析发现,该程序的功能是判断一个人是不是1990-2000年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:
class Person{
    private Date birthDate;
    private static Date startDate,endDate;
    static{
        startDate = Date.valueOf("1946");
        endDate = Date.valueOf("1964");
    }
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}
很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。而不需要没判断一个类的对象,都要生成生成startDate和birthDate两个对象,大大节省了空间。
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值