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 。