1. static关键字:可以用于修饰属性,也可以用来修饰方法,还是可以用来修饰类
a) 用来修饰属性:分析:
public class StaticTest
{
public static void main(String args[])
{
MyStatic myStatic = new MyStatic();
MyStatic myStatic2 = new MyStatic();
myStatic.a = 5;
System.out.println(myStatic2.a);
}
}
class MyStatic
{
static int a ;
}结果:5
结论:对于属性来说,如果属性被static关键字所修饰,不管一个类生成多少个对象,多个对象,共同使用一个static所修饰的静态成员变量;一个对象对该静态变量进行了修改,其他对象的该静态成员变量的值也会发生相应的变化。
静态变量可通过类名.成员变量名(推荐使用)的方式来使用它。
b) static修饰方法:static修饰的方法叫做静态方法。
分析:public class StaticTest
{
public static void main(String args[])
{
MyStatic.output();
}
}
class MyStatic
{
public static void output()
{
System.out.println("output");
}
}结果:output
结论:对于静态方法来说,可以使用类名.方法名(推荐使用)的方式来访问
2. 静态方法只能继承,不能重写(override),但可以隐藏。
分析:
class M
{
public static void output()
{
System.out.println("M");
}
}
class N extends M
{
public static void output()
{
System.out.println("N");
}
}结论:1)父、子类中均为静态方法,那叫隐藏(加了@override才叫重写,是不允许的),与普通方法利用利用多态(如调用普通方法output(): M m = new N();m.output();,使用多态调用的是子类的方法)不同,静态方法调用的是父类的方法还是子类的方法,与引用所对应的类型一致,而不是与指向的对象一致。如M m = new N();调用的任是M中的方法;2)父类和子类有无静态修饰不一致,则报错(即静态方法不能被覆盖,静态方法不能覆盖普通方法);3)父、子类中均是普通方法,则是重写(允许重写),可根据多态的特性选择调用。
3. final修饰类,当一个类被final所修饰时,表示该类是一个终态类,即不能被继承。分析:
public class FinalTest
{
public static void main(String args[])
{
F f = F();
}
}
final class E //该类不能被继承
{
}
class F extends E
{
}错误:无法从最终类E进行继承。
4. final修饰方法:当一个方法被final所修饰时,表示该方法是一个终态方法。即不能被重写
5. final修饰属性:当一个属性被final所修饰时,表示该属性不能被改写。
总之:final修饰的东西不能再改变。
分析:public class FinalTest
{
public static void main(String args[])
{
People people = new People();
//people.address = new Address();//错误:无法为最终变量分配值
people.address.name = "shanghai";//正确;
}
}
class People
{
final Address address = new Address();
}
class Address
{
String name = "beijing";
}结论:1)address是一个引用变量,它的值指向new Address()对象,由于fianl所修饰的变量值不能改变,即变量address指向的对象不能再改变,因此people.address = new Address();错误;2)而people.address.name = "shanghai";address所指对象的地址没有变,只是其中的内容发生变化,只要最终变量address存储的对象的地址不发生变化,内容是可以变化的
6. 当final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化(比如不能从10变为20);如果final修饰一个引用类型时,表示该引用类型不能再指向其他的对象了,当爱引用所指向的对象的内容是可以变化的。
7. 对于final类型成员变量,一般来说有两种付初值方式:
1)在声明final类型的成员变量时就赋上初值;
2)在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值。
8. Static代码块:静态代码块,静态代码块的作用是完成一些初始化工作。首先执行静态代码块,然后执行构造方法,静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到java虚拟机上,然后由JVM加载这个类来生成对象
9. 类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。
10. 如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层的类的构造方法,一直执行到最底层的构造方法。注意:静态代码块只会执行一次。
11. 不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量;可以在非静态方法中访问静态的成员变量
总结:静态的只能访问静态的,非静态的可以访问一切。
12. 不能在静态方法中使用this关键字,因为:静态方法可由类直接调用。而this是代表对象的,无实例怎会有对象