Java中的static和final

18次阅读

共计 1402 个字符,预计需要花费 4 分钟才能阅读完成。

java 中的 static 和 final

此篇文章是记录我在学习 Java 中 static 和 final 关键字的笔记。

static:

一、static 变量:

按照是否静态的对类成员变量进行分类可分两种:一种是被 static 修饰的变量,叫静态变量或类变量;另一种是没有被 static 修饰的变量,叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM 只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

二、static 方法:

  1. static 方法就是没有 this 的方法。在 static 方法的内部不能调用非静态方法,反过来,非静态方法可以在方法的内部调用 static 方法。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法。这里有点像全局方法。
  2. 声明一个方法为 static 至少有三重含义:

       1)声明这个方法时,应该使用类名做前缀,而不是某一个具体的对象名。2)要注意,在调用已被 static 定义的类、方法和属性时,如果一处地方修改了其相应的值,当另外一个地方在调用这些类、方法和属性时,其对于的值就是已被修改的值,而不是它们刚开始被定义或者系统自动赋的值。3)static 方法只能修改 static 数据,因为 static 是全局变量,所以它不能修改某个特定区域的特定数据。

三、static 块:

Static 块仅在该类被加载时执行一次,例如下面代码:

public class StaticTest {public static void main(String[] args) {
        // TODO Auto-generated method stub
        A a = new A();
        B b = new B();
        A a1 = new A();
        System.out.println("do nothing!");
    }
}

class A {
    static {System.out.println("aaaa");
    }
}

class B {
    static {System.out.println("bbbbb");
    }
}
最后只输出:aaaa
bbbbb
do nothing!
并没有再输出一遍 aaaa。

final:

谈到 final 关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到 final 关键字。

  1. 修饰类

     当用 final 修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用 final 进行修饰。final 类中的成员变量可以根据需要设为 final,但是要注意 final 类中的所有成员方法都会被隐式地指定为 final 方法。
  2. 被 final 修饰的变量不能再改变变量的值。例如:

    // 错误代码,test1 的值不能再更改
    public final String test1 = "aaa";
    test1 = "bbb";
    
  3. 使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

    final StringBuffer a=new StringBuffer("immutable"); 
    // 执行如下语句将报告编译期错误:a=new StringBuffer(""); 
    // 但是,执行如下语句则可以通过编译:a.append("broken!");

正文完
 0