JAVA基础:static和final

来源:互联网 发布:九龙医院网络预约 编辑:程序博客网 时间:2024/05/17 02:45

static可以用来修饰方法,成员变量,代码块和内部类

成员变量:称之为静态变量,在内存中只有一个,和对象无关。可以通过类名直接访问,如果一个地方修改了,其他地方也会变。静态变量可以不初始化,编译器不会报错,因为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这个标签就表示和类相关联,与对象无关,只存在一个。

final:可以用来修饰类,方法,成员变量,局部变量和方法参数

类:不能继承,比如String,基本类型的包装类,将一个类声明为final,就表明这个类已经不需要子类,并且确定这个类不需要扩展,已经是完美的了。类中的成员方法默认都是final的,不能被重写和覆盖。

方法:当一个类不允许子类覆盖和重写某个方法,就可以把这个方法声明为final。表面这个方法已经被锁定,不允许更改。高效,编译器在遇到final方法时会转入内嵌机制,大大提高执行效率。

变量:表示常量,一旦给定就无法再改变。
1.声明时可以不实例化,但是必须在使用它之前实例化,否则编译器会报错。
2.只能在声明时、构造方法、静态代码块或者构造代码块中实例化。
3.常量是不可变的,如果是基本类型,那么不能进行任何改变它的值的操作;如果是对象,那么可以改变它的值,但是不能改变它的引用。

方法参数:表明你可以读取这个参数的值,但是无法改变他的值。

总结: final就表示不允许再更改了。

0 0
原创粉丝点击