|
//导入静态成员,不常用
import static java.util.Calendar.AM;
import java.util.HashMap;
public class StaticTest {
//静态成员变量,它只存有一份
private static int i = 123;
private int j = 0;
private static HashMap map = new HashMap();
//静态程序块,用来做一些初始化动作
static {
map.put("userid", "admin");
}
public void printI() {
System.out.println("i=" + i);
}
//静态方法,
public static void s() {
int m = 0;//可以定义非静态变量
staticint n = 0;//错误代码,不能定义静态变量
System.out.println(i);//可以使用静态的成员变量
System.out.println(j);//错误代码,不能使用非静态的成员变量
}
public static void main(String[] args) {
//直接通过类引用静态成员变量和方法
StaticTest.s();
StaticTest.i++;
//test1和test2打印出来的i值一样,因为它只有一份
StaticTest test1 = new StaticTest();
StaticTest test2 = new StaticTest();
test1.printI();//i=124
test2.printI();//i=124
}
} |
|
public class StaticTest2 {
//普通内部类
class InnerClass {
static int i = 0;//错误代码,普通内部类不能使用静态成员变量
static final int j = 0;//正确代码,常量
}
//嵌套类,与普通内部类的区别在于多了static的修饰
static class NestedClass {
static int i = 0;//正确代码
}
} |
final关键字通常表示一个东西是不能改变的,它可以修饰的元素有:
1.修饰数据:通常用来定义常量。对于基本类型,final使数值恒定不变,而对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法把它改为指向另一个对象,然而,对象其本身是可以被修改的。
2.修饰参数:和修饰数据一样。
3.修饰方法:通常用来防止方法被子类覆盖(overriden),一个类中的所有private方法都隐含是final的,因为它无法被子类读取,也就不会被覆盖。另外,编译器针对final方法的调用都采用内嵌(inline)调用,可提高效率,但不是final的主要用途。
4.修饰类:表明该类(class)不能被继承。在final类里,所有的方法都被隐含的指定为final的,因为永远不存在子类,也就不存在子类覆盖一说。final类的字段可以根据个人的意愿选择是或不是final,不论类是否定义为final,相同的规则都适用于final字段。
平日在编程中用的最多的应该是使用final修饰数据,尤其是定义常量。
|
//修饰类,类不能被继承
public final class FinalTest {
//修饰数据,i不能被再次赋值
private final int i = 0;
//修饰方法,该方法不能被子类覆盖
public final void f(String s) {
System.out.println("FinalTest.f");
}
//修饰参数,j不能被重新赋值
public void g(final int j) {
j = 1;//这条语句是错误的
}
} |
|
public class FinalChild extends Final {
//这个方法是错误的,它不能覆盖父类的final方法
public void f(){};
//这个方法正确,重载
public void f(String s){}
}
class Final {
public final void f() {}
} |
|
final int i = 0;
i = 1;//错误的代码,不能重新赋值
final StringBuffer s = new StringBuffer("Java");
s.append("World!");//正确代码,可以改变对象内容
s = new StringBuffer("Hello");//错误的代码,不能给引用重新赋值,它不能指向别的对象 |
|
public class TestFinal {
private int i;//默认值为0。如果是private final int i;程序就会报错
public void print() {
System.out.println(i);
}
} |
|
public class TestFinal {
private final int i;
public TestFinal () {
i = 0;
}
public void print() {
System.out.println(i);
}
} |
一个既是static又是final的字段只占据一段不能改变的存储空间。 带有恒定初始值(即,编译时常量)的static final基本类型全用大写字母命名,并且字与字之间用下划线隔开。如java.lang.byte类里对byte类型的最小值定义:
public static final byte MIN_VALUE = -128;
1561

被折叠的 条评论
为什么被折叠?



