引发对java关键字的再学习是在项目组遇到的一个问题导致的,通过不同的容器weblogic、ejb访问类中的同一static方法,得出的结果不一样,致使程序运行时产生重大灾难!(本文多处为别处摘录)
一、static
1、static 修饰成员字段
当类被虚拟机加载时,首先按照字段声明的先后顺序对static成员字段进行初始化
2、static 修饰成员函数
该成员函数不能使用this对象
static不能修饰构造函数
static不能修饰函数参数
static不能修饰局部成员变量
3、static 修饰语句块
当类被虚拟机加载时,按照声明顺序先后初始化static成员字段和static语句块
static所修饰的方法和字段是只属于类,所有对象共享
在static所修饰的函数和语句块中不能使用非static成员字段
二、final
1、final 修饰类
表示该类不可被继承
final不可修饰interface接口与abstract类
2、final 修饰方法
表示该方法不可被子类覆盖(即子类不可重写父类的final方法,但可以被继承)
final不可修饰构造函数
3、final 修饰成员属性
表示属性值第一次初始化后不可被修改
final属性可以直接初始化或在构造函数中初始化,如果是直接初始化则其值不可在其他函数中(包括构造函数)修改
4、final 修饰函数参数
参数值不能被函数修改
5、final 修饰函数中的局部变量
局部变量第一次初始化后不可改变其值
使用final的意义
第一、为方法"上锁",防止任何继承类改变它的本来含义和实现。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采用这种做法。
第二、提高程序执行的效率,将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入"嵌入"调用里(内嵌机制)。
在java中定义全局变量是通过static来实现的,常量是通过static final来实现
三、this&&super
this通常指代当前对象,super指代父类
下面给出不完整的示例
public class Father {
//public static int age = 32; static成员和static块加载顺序为声明先后
static{
System.out.println("father的静态块init");
//name="卫庄"; error
age = 30;
//this.age=30; error
}
public Father(){
this.name = "卫庄";
height=180;
//weight = 160; error
System.out.println("father的构造函数初始化");
}
public String name;
public static int age;
public static final String sex = "男";
public final int height;
public final int weight=150;
public void run(){
//static int i = 1; error
System.out.println("father run");
}
public final void sleep(){
System.out.println("father sleep");
}
public static void eat(){
int i = 1;
final int a = 3;
//a = 4 ; error
//this.name = "father"; error
//name = "father"; error
age = 32;
System.out.println("father eat");
System.out.println(age);
}
}
public final class Son extends Father{
static{
System.out.println("son的静态块init");
age = 13;
}
public Son(){
super();
name = "盖聂";
System.out.println("son的构造函数初始化");
}
public void run(){
System.out.println("son run");
}
public static void eat(){
System.out.println("son eat");
}
/* error
* public void sleep(){
System.out.println("son sleep");
}*/
public static void main(String []args){
Father f = new Son();
System.out.println(Father.age);
System.out.println(Son.age);
System.out.println(f.name);
System.out.println(f.height);
Father.eat();
f.sleep();
f.run();
f.eat();
}
}