一个例子总结Java的static和final

下面是我在学习Java SE的时候,写的一个有关static和final的例子:

public class TestDemo {
  public static void main(String[] args) {
    System.out.println(Koo.b); // 输出结果是:0
    Koo.b = 1;
    // Koo.d = 0; // 编译报错,因为final修饰的变量不能再次赋值,哪怕赋的值是一样的也不行
    System.out.println(Koo.add(100, 200)); // 输出300,用类直接调用工具方法
    System.out.println(Koo.b); // 输出结果是:1
    Koo k1 = new Koo();
    System.out.println(Koo.b + ", " + k1.b); // 输出结果是:2, 2
    System.out.println(k1.add(100, 200)); // 输出300,也可以用对象调用工具方法
    // k1.c = 0; // 编译报错,因为final修饰的变量不能再次赋值,哪怕赋的值是一样的也不行
    Koo k2 = new Koo();
    System.out.println(Koo.b + ", " + k2.b); // 输出结果是:3, 3
    System.out.println(k1.a + ", " + k2.a); // 输出结果是:1, 2
  }
}

// 定义一个类Koo
class Koo {
  public int a;
  public static int b; // 用static定义一个类变量,该变量是属于类的,无论有多少个对象,该类变量都是只有一个
  // public final int c; // 这样写是会报错的,final修饰的变量,在定义的时候要赋初始值
  public final int c = 0; // 可以把c看出一个常量,但是这个常量是对象级的,每实例一个对象,就有一个c
  // public static final int d; // 报错,要赋初始值
  public static final int d = 0; // 被final修饰的变量不可修改,被final修饰的类不可继承,被final修饰的方法不可重写。可以把d看出一个常量,这个常量内存中永远只存在一个。

  public Koo() {
    a = b++; // 注意这里,如果换成++b,那么上面的输出结果又会不一样,涉及到先赋值还是先自加的问题
  }

  // 使用static修饰的方法,可以当成工具方法,用类直接调用
  public static int add(int a, int b) {
    int c = a + b;
    return c;
  }

  public final void print() {
    System.out.println("Hello World");
  }
}

// 定义一个类Foo
final class Foo {
  public int a;

  public void print() {
    System.out.println(a);
  }
}

// 定义一个类Goo继承于Foo,编译报错,因为Foo类是final类,无法继承
class Goo extends Foo {

}

// 定义一个类Woo,继承于Koo,不报错
class Woo extends Koo {
  // 继承后,添加一个属于自己的方法
  public void show() {
    System.out.println("show");
  }
}

// 定义一个Yoo,继承于Koo
class Yoo extends Koo {
  // 这里重新了父类的final方法,编译报错,final方法不能重写
  public void print() {
  }
}

一个简陋的堆栈图

图1:一个简陋的堆栈图

如上图1,随手画了一个简陋的Koo类对象化的堆栈图,Koo类中的b、d这两个成员变量由于被static修饰,所以比较特殊,大概就那么个意思,将就着看。

本文标题:一个例子总结Java的static和final

本文链接:http://yedward.net/?id=231

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章