成员变量:称之为静态变量,在内存中只有一个,和对象无关。可以通过类名直接访问,如果一个地方修改了,其他地方也会变。静态变量可以不初始化,编译器不会报错,因为java会默认给值,对象就是null,int就是0。
下面是测试的代码:
public class Test { static int i = 0; public static void main(String[] args) { System.out.println("初始值:"+Test.i); Test.i = 2; System.out.println("通过类名.修改后:"+Test.i); Test t1 = new Test(); System.out.println("通过t1获取:"+t1.i); t1.i = 3; System.out.println("通过t1修改后:"+t1.i); Test t2 = new Test(); System.out.println("通过t1修改后t2的值:"+t2.i); } }对应的输出:
这就说明静态变量与对象是无关的,只存在一个,无论谁修改了它,它都会改变。
方法:称之为静态方法,可以通过类名直接调用,不能是抽象方法,而且静态方法只能调用所属类中的静态成员变量,调用非静态成员变量会报编译错误。
public class Test { //如果这里不给i初始值,int型会默认为0 static int i = 0; private int j = 1; public static void main(String[] args) { A(); } public static void A() { System.out.println(i); //这里会报错 //Cannot make a static reference to the non-static field j System.out.println(j); } }代码块:称之为静态代码块,可以写在除方法以外的任意地方,在类被加载时执行,关于类何时会被加载可以看下这篇文章。
public class Test { public static int y = 0; public Test() { System.out.println("构造方法执行"); } static { System.out.println("Test类---静态代码块未初始化y:" + y); y = 1; System.out.println("Test类---静态代码块初始化y:" + y); } public static void main(String[] args) { Test test = new Test(); Test test2 = new Test(); } }输出结果:
根据以上结果可以得出:静态代码块会在构造方法前执行,但是只会执行一次,在类第一次加载的时候。
内部类:称之为静态内部类,静态内部类同样可以拥有静态方法和静态成员变量以及静态代码块,且只能调用外部类的静态成员变量和方法。静态内部类中的静态代码块同样在加载这个类时被加载。创建的时候不依赖于外部类的对象。
public class Test { public static int y = 0; public static String str; public Test() { System.out.println("构造方法执行"); } static { System.out.println("外部类的静态代码块执行!"); } public static void T() { System.out.println("外部类的静态方法执行!"); } public static void main(String[] args) { // System.out.println(str); X x = new X(); } static class X { private static int x = 0; static { System.out.println("内部类的静态代码块执行!--调用外部类的静态成员变量y" + y); } public X() { System.out.println("内部类的构造方法执行!"); // 在内部类的构造方法中调用外部类的静态方法 T(); } } }输出结果:
通过这个结果我们可以得出结论:静态类可以不依赖外部类的对象,能够直接创建实例,但是会先加载外部类,同时它也可以在代码块、方法、构造方法中调用外部类的静态变量和静态方法。
**总结:**static这个标签就表示和类相关联,与对象无关,只存在一个。
类:不能继承,比如String,基本类型的包装类,将一个类声明为final,就表明这个类已经不需要子类,并且确定这个类不需要扩展,已经是完美的了。类中的成员方法默认都是final的,不能被重写和覆盖。
方法:当一个类不允许子类覆盖和重写某个方法,就可以把这个方法声明为final。表面这个方法已经被锁定,不允许更改。高效,编译器在遇到final方法时会转入内嵌机制,大大提高执行效率。
变量:表示常量,一旦给定就无法再改变。 1.声明时可以不实例化,但是必须在使用它之前实例化,否则编译器会报错。 2.只能在声明时、构造方法、静态代码块或者构造代码块中实例化。 3.常量是不可变的,如果是基本类型,那么不能进行任何改变它的值的操作;如果是对象,那么可以改变它的值,但是不能改变它的引用。
方法参数:表明你可以读取这个参数的值,但是无法改变他的值。
总结: final就表示不允许再更改了。