static 和final
1、static
static关键字可以用来修饰类的变量,方法和内部类。static是静态的意思,也是全局的意思,它定义的东西属于全局,与类相关,不与具体实例相关。就是说它调用的时候,只是ClassName.method(),而不是new ClassName().method()。new ClassName()不就是一个对象了吗?static的变量和方法不可以这样调用的,它不与具体的实例有关。
- class Count {
- private int serialNumber;
- public static int counter = 0; //一个静态变量counter
- public Count() {
- counter++; //创建Counter的时候递增
- serialNumber = counter;
- }
- public int getSerialNumber() {
- return serialNumber;
- }
- }
- class OtherClass {
- public int increment() {
- return Count.counter++;//静态的变量不属于任何实例只能直接用类调用
- }
- }
- public class TestStaticVar {
- public static void main(String[] args) {
- Count[] cc = new Count[10];
- OtherClass o = new OtherClass();
- for (int i=0; i<cc.length; i++) {
- cc[i] = new Count();
- System.out.println("cc["+i+"].serialNumber = "+cc[i].getSerialNumber());
- System.out.println(o.increment());
- }
- }
- }
类的方法中带有static关键字,这个方法就是静态方法。静态方法也是要通过类名,而不是实例访问。子类不能重写父类的静态方法,也不能把父类不是静态的重写成静态的方法。想隐藏父类的静态方法的话,在子类中声明和父类相同的方法就行了。
- class GenerealFunction {
- public static int add(int x,int y){
- return x+y;
- }
- }
- public class UseGeneral {
- public static void main(String[] args){
- //调用时还是用类直接调用
- int c = GenerealFunction.add(19,18);
- System.out.println("结果是"+c);
- }
- }
2、final
final关键字有三个东西可以修饰的,修饰类,方法,变量。
a、在类的声明中使用final
使用了final的类不能再派生子类,就是说不可以被继承了。
b、在方法声明中使用final
被定义为final的方法不能被重写了,如果定义类为final的话,是所有的方法都不能重写。而我们只需要类中的某几个方法,不可以被重写,就在方法前加final了,而且定义为final的方法执行效率要高。
c、在变量声明中使用final
这样的变量就是常量了,在程序中这样的变量不可以被修改的。修改的话编译器会报错的。而且执行效率也是比普通的变量要高。final的变量如果没有赋予初值的话,其他方法就必需给它赋值,但只能赋值一次。