JAVA static和Final

 

1 Static 关键字
       

        Static
可以用来修饰属性、方法、构造静态块。

 
        1.
static 修饰属性时,可以创建具体的对象来调用该属性,也可以直接通过类名调用该属性。当创建对象调用该属性时,每个对象共同拥有一个静态成员 变量,也就是说当其中任何一个对象修改该属性的值时,其他对象的属性值也同时改变。这也就是可以直接通过类名调用该属性的原因,因为无论创建多少对象,所 有对象都共用一个相同静态成员变量。既然每个对象的该属性都有相同的值,直接通过类名调用就显得更简单明了一些。

 

        2.Static 修饰方法时与修饰属性时相类似,可以创建具体的对象调用该方法,也可以直接通过类名调用该方法。


       
值得注意的一点,当static 修饰方法时,方法中的若有属性,则属性也应该是静态的,或者为常量。

 

当运行该程序时,程序报错,错误原因是因为属性name 不是静态的。究其原因,我们会发现如果直接能通过类名调用一个方法,就说明用该类创建的所有对象共 用一个相同的方法,方法的输出结果必须是相同的,当你改变属性值,该方法就会有不同的输出结果,与能直接用类调用该方法相矛盾。所以String name 应该改为static String name


      
静态的方法可以被隐藏但不能被重写, 静态属性,静态方法都没有多态( 可以参考一下jave 的官方文档http://download.oracle.com/javase/tutorial/java/IandI/override.html)


      3.
静态块在类被加载时级执行,优先于主函数。


      4.
关于主函数要加static 的一点看法


当类被加载时,静态的属性和方法即被加载,而非静态成员只有在创建对象时才被加载,这也就是为什么主函数要加static 的原因。由于非静态成员 只有在创建时被加载,当一个类中没有static 修饰的方法时,类加载时所有的方法都不会被加载,直接导致程序无法运行,所以必须找到一个入口,当类加载 时,该入口即被加载,在方法体中才会创建对象,调用方法,程序才能正常运行。

 

 

 

当一个类被加载后,它的静态变量生命周期是什么,是整个应用程序执行结束(比如java web程序,从类加载到服务器关闭还是该线程执行完毕)还是别的什么?


静态变量在内存中只有一个,JAVA虚拟机加载类的时候为其分配内存,位于方法区,被类的所有实例共享,其生命周期取决于类的生命周期。。。当类被卸载。。。静态变量也被销毁
取决于类加载器。如果换了一个类加载器,这个类会被重新加载,相对应的,类中的static也会重新初始化。不过这种情况,对大部分人来讲,在平时写代码的时候,不会碰到,所以如果搞不清楚,那就直接理解成一直存在,直到服务器关闭
和线程无关

 

 

静态变量

 

静态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量, 内存 中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现单例模式时,为了实现只有一个类对象存于内存中,我们把内对象定义为一个静态变量;为了确保这个执行过程中,只有一个 Connection 对象村与内存中,我们把 Connection 定义为类静态变量。

 

静态代码块

 

静态代码块是以变量 static 表示的一段代码块,他是在第一次创建该类对象或第一次调用该类静态方法时执行,整个程序运行过程中最多执行一次。

 

静态方法

 

静态方法跟静态变量有点类似,也可以说是从属于类的方法,不用定义类实例对象就可以通过类名调用该方法。因此,我们也很容易知道,静态方法只能操作类的静态成员(包括静态变量和静态方法)或者其自己定义的内部成员。

 

非静态变量

 

非静态变量是属于特定类实例对象的,每个对象都有一个自己的副本。区别于静态变量的所有对象共用一个副本

 

非静态方法

 

非静态方法也可以说是属于对象的,只有类定义的对象才可以调用它,非静态方法可以操作静态变量,非静态变量及静态方法。

 


2 Final 关键字


      final
可以修饰属性、方法、类。  


     1
.当一个类被final 修饰时,该类是一个终态类不能被继承。


     2
.当一个属性被final 修饰时,该属性是一个常量,定义时需要赋初值,或者在所有的 构造器方法里赋值。当以对象作为final 修饰的属性时,对象的地址不能改变,但对象的内容可以改变。

 

     

public class test {
	private static final User user = new User();
	public static void main(String argc[]){
		//user里面的属性可以改变,不错
		user.setName("test");
		//user的地址不能变,报错
		user = new User();
	}
}

class User{
	private String name;
	public String getName() {
    	return name;
    }
	public void setName(String name) {
    	this.name = name;
    }
}
 

     3 .当一个方法被final 修饰时,该方法不能被重写,即override

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值