static和final关键字

static关键字


static的字面意思是:静止的

1、静态变量

在Java语言中,按照是否静态可以对成员变量分为两种:

一种是被static修饰的变量,叫静态变量或类变量;

另一种是没有被static修饰的变量,叫实例变量。

JVM在加载类的过程中完成静态变量的内存分配,可用类名.方法名直接调用,当然也可以通过对象来访问(但是这是不推荐的)。

对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响

2、静态方法

声明为static的方法有以下几条限制: 
它们仅能调用其他的static 方法; 
它们只能访问static数据;
它们不能以任何方式引用this 或super。

非静态的方法与特定的对象关联 

static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的

静态方法的调用和静态变量的调用相同。

Java中的main就是一个静态的方法。

3、静态代码块

静态代码块是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

4、一个简单的例子:

代码参考:http://www.cnblogs.com/lzq198754/p/5767066.html(感谢楼主)

class Value3 {
    static int c = 0;
    Value3(int i) {
        c = i;
    }
A.    static {
        StaticDetail.prt("First Value3.c = "+Value3.c);
        Value3.c = 5;
    }
    static void inc() {
        c++;
    }
}

public class StaticDetail {
    public static void prt(String s) {
        System.out.println(s);
    }
    Value3 v = new Value3(10);
    static Value3 v1, v2;
B.    static {
        prt("Second Value3.c = "+Value3.c);
        prt("v1.c=" + v1.c + "  v2.c=" + v2.c);
        v1 = new Value3(27);
        prt("v1.c=" + v1.c + "  v2.c=" + v2.c);
        v2 = new Value3(15);
        prt("v1.c=" + v1.c + "  v2.c=" + v2.c);
    }

    public static void main(String[] args) {
        StaticDetail ct = new StaticDetail();
        prt("ct.c=" + ct.v.c);
        prt("v1.c=" + v1.c + "  v2.c=" + v2.c);
        v1.inc();
        prt("ct.c=" + ct.v.c);
        prt("v1.c=" + v1.c + "  v2.c=" + v2.c);

    }
}

分析:

首先执行A处的静态代码块,输出初始化的c的值0,然后把c的值修改为5;

然后执行B处的静态代码块:

输出修改的c的值5;

通过实例对象访问静态变量,分别输出c的值;

执行main函数,在创建对象的过程中再次修改静态变量的值;

执行静态方法,再次修改静态变量的值。

程序执行结果:

First Value3.c = 0
Second Value3.c = 5
v1.c=5  v2.c=5
v1.c=27  v2.c=27
v1.c=15  v2.c=15
ct.c=10
v1.c=10  v2.c=10
ct.c=11
v1.c=11  v2.c=11

final关键字

根据字面意思,final的意思是:最终的、最后的、无法改变的

final变量(常量

final关键字可以修饰静态变量、成员变量和局部变量

final常量的特点是 :final变量一旦被初始化,就不可以被更改,也就相当于常量

final方法和final类

特点:final方法行业final类不能被继承,如果我们不希望扩展这个类以及类中的方法,可以直接声明该类是final类

常见的final类:java.lang.Boolean、java.lang.Math、java.lang.String等

final参数

当函数参数被final关键字修饰时,该参数无法被修改

public void showStatic(final int a){
        a++;
    }
在java中,这种试图修改final参数的做法是不被允许的

总结:

public和static一起修饰的变量相当于全局变量

public、final和static一起修饰的变量实际上是一个全局常量,例如:public static final double PI












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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值