[HeadFirst] Static Memeber & Final Rules

1. Static Member

static kw标记出不需要类实例的方法。一个静态方法代表说“一种不依靠实例变量也就是不需要对象的行为”。

静态变量 - 静态方法

实例变量 - 实例方法(这里的实例指的是只能通过实例访问的非静态的变量和方法)


1.1 静态方法不能调用实例变量(非静态的变量)

静态的方法是不知道堆上有哪些实例的,因为静态方法没有维护一个对象的引用(即指向堆对象的指针)。

1.2 静态方法也不能调用实例方法(非静态的方法)

non-static method cannot be referenced from a static context.


1.3 静态变量可以被实例方法调用

因为,静态变量是全局变量,为所有实例共享(同一类所有的实例共享一份静态变量),对所有实例可见且值是相同的。


静态变量是在类被加载时初始化的。JVM load 通常是因为第一次有人尝试要创建该类的新实例,或是使用该类的静态方法或变量。

静态项目的初始化欧两项保证:

1. 会在该类的任何对象创建之前就完成了初始化。

2. 会在该类的任何静态方法执行之前就初始化。


如果没有给静态变量赋值(只有static kw,而不是static final的),它就被设定为默认值。


2. 静态的final变量是常数

静态变量的名字应该都是大写字母

2.1 static initializer(静态初始化程序),是一段在加载类时会执行的程序代码,它会在其他程序使用该类之前就执行,所以很适合放静态final变量的起始程序。

如:

public class Foo {
    final static int x;

    static {
        x = 42;
    }
}

上面的static {}就是 static initializer

因此,有两种方式可以初始化static final变量。

第一种就是上面的,第二种就是在声明的时候同时初始化。


注意: 

static还可以用在import语句中,方便引用imported class的实例,例如:

<pre name="code" class="html">import static java.lang.System.*; // new kind of import statement
...
    public static void testTry_catch_finally(){
        try {
            out.println("try block");
            throw new IOException("Test: try-catch-finally");
//            out.println("Exception occurs. Never invoked"); // Java compiler error: unreachable statment
        } catch (IOException e){
            err.println(e.toString());
//            return;
            System.exit(-1);
        }finally {
            out.println("finally block");
        }
    }

 

像上例中,如果频繁引用对象err,out那么就可以使用import static的语法,否着就没有必要了。

2.2. final 的用处

1. static final variable --- 声明常数(如上)

2. non-static final variable --- 表示其值不能被修改

3. final method --- 表示该方法不能被override, 但是可以被overwrite。

        覆盖Override) :若是在父类中调用的办法,在子类中覆盖了这个办法,那么在,在父类调用的办法,其实就是子类的办法。

        覆盖Overwrite):改写现存的文本,删除用新的文本替代现存的文本。

4. final class ---  表示该类不能被继承 

如String

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

如果一个类被标记为final class,那么类的方法就没有必要再加上final了。

final public class Foo { // non-extended
    final int x = 3; // 不能不修改,但每个实例都有属于自己的一个。所以更多倾向于将其声明为static final的变量
    final void testFinal(){ //non-override
        //...
    }
    final static int CONST; // static final的变量,因为不可变,所以可以被所有实例共享
    
    static {
        CONST = 42;
    }   
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值