static 和 final

static

  1. 修饰成员变量,将这个修饰的成员变量变为类的成员变量也称为类静态成员变量,需要通过 类.变量名 来获取,所有该类实例对象共享该类成员变量,只要该静态成员发生一次变化,那么其他对象中的该静态变量也就改变

  2. 修饰成员方法:修饰之后,该方法就成为类的方法,需要通过 类.方法名字 来获取,注意:在该静态方法中不能使用非静态的方法和成员变量,这也很好理解,static 修饰方法后就成为类的方法,由类来统一管理,如果在类中调用普通的成员变量,那么该变量是属于某个对象的,是在某个对象中设置,而类中自然无法管理到该对象或者方法

  3. 修饰代码块:常用于一些类的初始化工作,无论新建多少个对象,修饰的代码块只会在 JVM 对类初始化的时候执行一次,并且顺序优先于普通代码块和构造方法,如果存在父类的话,会先对父类的静态代码块进行加载

  4. 静态导包用法:例如

import static com.dotgua.study.PrintHelper.*;

public class App 
{
    public static void main( String[] args )
    {
        print("Hello World!");
    }
    /**Output
     * Hello World!
     *///~
}

我们首先将PrintHelper类导入,这里在导入时,我们使用了static关键字,而且在引入类的最后还加上了“.*”,它的作用就是将PrintHelper类中的所有类方法直接导入。不同于非static导入,采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样使用即可

final

  1. 修饰变量
    (1)如果 final 修饰的是一个基本数据类型的变量,那么这个变量只能够在第一次声明该成员赋值时,只能够进行一次赋值操作,之后再再赋值就会抛出异常,该基本数据类型的变量就相当于成了一个常量
    (2)如果 final 修饰的是一个引用类型,那么会保证在 java 虚拟机栈中的局部变量里储存的该引用地址是不可以改变的,但是具体的实例是可以改变的,相当于你记住了一户人家的门牌号,但是你不一定知道里面的人家还是不是原来的人在住,可能原来住的那一户人家搬走了

  2. 修饰方法
    该方法不可以被子类重写(覆盖),有点类似与在某个类中的 private 方法,这些 private 修饰的方法不能够被其他类方法到,那自然也就不能够被重写了

  3. 修饰类
    该类不能够被继承

final 域的内存语义

对于 final 域,编译器和处理器都需要遵守其写/读的重排序规则
(1)写 final 域重排序的规则:禁止写 final 域重排序到构造函数之外,因为在其他线程调用该对象引用之前,要确保 final 域已经正确被初始化过了
(2)读 final 域重排序的规则:一个线程中,初次读一个包含 final 域的对象引用,和在其之后初次读取 final 域,这两个操作之间不能重排序,因为在读一个对象的 final 域之前,一定会先读包含这个 final 域的对象引用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值