zoukankan      html  css  js  c++  java
  • static、final、static final 用法

    static、final、static final 用法

    转自:http://blog.csdn.net/tengdazhang770960436/article/details/25156743

    1.使用范围:类、方法、变量。

    2.区别和联系:

    2.1.static 含义:静态的,被 static 修饰的方法和属性只属于类不属于类的任何对象。
    2.2.static 用法:
    2.2.1.static 可以修饰【内部类】、方法和成员变量。
    2.2.2.static【不可以修饰外部类】、【不可以修饰局部变量】(因为 static 本身就是定义为类级别的,所以局部级别的变量是不可以用 static 修饰的)。

    2.3 final 含义:【只能赋值一次】的。
    2.2.final 用法:
    2.2.1.final 修饰属性,表示属性【只能赋值一次】,(1)基本类型:值不能被修改;(2)引用类型:引用不可以被修改该。
    2.2.2.final 修饰方法,表示方法不可以重写,但是可以被子类访问(如果方法不是 private 类型话)。
    2.2.2.final 修饰类,表示类不可以被继承。

    3.联合使用 static final
    3.1.适用范围:
    3.1.2.两者范围的交集,所以只能修饰:成员变量、方法、内部类。
    3.2.含义:也是二者交集:
    3.2.1.方法:属于类的方法且不可以被重写。
    3.2.2.成员变量:属于类的变量且只能赋值一次。
    3.2.3.内部类:属于外部类,且不能被继承

    java中static final与final的不同

    如果只是使用final  那你如果想使用这个属性 需要实例化对象 才能使用
    如果加上static 那他就属于类属性 不用实例化 直接使用

    再如以下例子:http://bbs.csdn.net/topics/350037073

    class SelfCounter{
    private static int counter;
    private int id = counter ++;

    public String toString(){
    return "SelfCounter :" + id;
    }
    }

    class WithFinalFields{
    static final SelfCounter wffs = new SelfCounter();
    final SelfCounter wff = new SelfCounter();


    public String toString(){
    return "wff = " + wff + " wffs = " + wffs;
    }
    }

    public class E18_StaticFinal {
    public static void main(String[] args) {
    System.out.println("First Object :");
    System.out.println(new WithFinalFields());
    System.out.println("Second Object: ");
    System.out.println(new WithFinalFields());
    }
    }
    ,运行结果是
    First Object :
    wff = SelfCounter :1
    wffs = SelfCounter :0
    Second Object:
    wff = SelfCounter :2
    wffs = SelfCounter :0

    static的常量在类加载的时候被初始化,而实例常量在实例化的时候被初始化。

    其实上面的过程很简单。

    第一次实例化WithFinalFields的时候,虚拟机发现该类没有被加载,于是先加载类,加载类的同时需要初始化类的所有static无论是变量、常量还是块,于是wffs需要实例化一个SelfCounter对象,这个时候虚拟机发现SelfCounter类也没有被加载,于是加载SelfCounter类,同时初始化static变量counter为0,加载SelfCounter类完毕,开始实例化SelfCounter对象,初始化id为0(此时counter为0),同时counter变为1,这时SelfCounter对象的实例化完毕,并被赋值给WithFinalFields类的wffs常量,加载WithFinalFields类的过程完毕,开始正式实例化WithFinalFields对象,初始化wff常量,又需要实例化一个SelfCounter对象,这时虚拟机发现SelfCounter类已经被加载,于直接开始实例化SelfCounter对象,初始化id为1(此时counter为1),同时counter变为2,实例化WithFinalFields对象完毕,此时wffs的id为0,wff的id为1。

    第二次实例化WithFinalFields的时候,虚拟机发现该类已经被加载,直接实例化,不会初始化static无论是变量、常量还是块,于是直接初始化wff常量,需要实例化SelfCounter对象,该类也已经被加载,于是也直接实例化,初始化id为2(此时counter为2),同时counter变为3,实例化SelfCounter对象完毕,同时实例化WithFinalFields对象完毕,此时wffs的id仍然为0,wff的id为2。

    重点是静态的东西只会被初始化一次,发生在类加载的时候。


    static的常量在类加载的时候被初始化,而实例常量在实例化的时候被初始化。

    final是不可变,但问题是有两个WithFinalFields对象,每个WithFinalFields对象都有它自己的wff常量,而且对于引用类型的常量,所谓不可变仅仅是引用不能重新指向其他对象,而不是对象内部的各种属性的值不可变。

  • 相关阅读:
    SharePoint Forums使用
    使用JS隐藏MOSS菜单
    缓存
    异步委托
    一个层动态放大的例子的一些知识点
    petshop之购物车再思考
    设置防止攻击session(疑惑)
    petshop异步和多线程
    Profile在petshop
    一个简单的显示隐藏知识点
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/7559854.html
Copyright © 2011-2022 走看看