美文网首页
【JAVA提升】- 关键字

【JAVA提升】- 关键字

作者: 我不是李小龙 | 来源:发表于2017-03-17 23:46 被阅读0次

    1. static

    /**
     * Created by fun on 2017/2/13.
     */
    public class StaticDemo {
        private static String prop = null;
        static{
            prop = "static";
            System.out.println("static code block.......");
        }
        public StaticDemo(){
            prop = "constructor";
            System.out.println("constructor.......");
        }
    
        public static void sayHello(){
    
            System.out.println("sayHello method print the prop="+prop);
        }
        public void sayHello2(){
            prop = "sayHello2";
            System.out.println("sayHello2 method print the prop="+prop);
        }
    }
    
    1. 使用StaticDemo的任何方法(静态或者非静态方法),static代码块仅且执行一次
    2. 非静态成员方法可以操作静态成员变量的值
    3. 构造方法只在new 关键字出现,new新的对象的时候调用,使用类名直接调用静态方法的时候没有调用构造方法
    4. static不能用来修饰普通内部类中的变量,如果内部类本身是static的是可以的

    2. final

    在java中,可能使用到final关键字修饰的有数据、方法和类。

    2.1 final 修饰数据

    有final修饰的数据是用来告诉编译器一块数据是恒定不变的,有时数据恒定不变是很有用的,比如:

    1. 一个永不改变的编译时常量。
    2. 一个在运行时被初始化的值,但是又不希望它被改变。

    编译时常量必须是基本数据类型,并且以关键字final修饰,在对这个常量进行定义的时候必须进行赋值,并且以后不能被改变。

    对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定不变,也就是说某个引用不能再指向其他对象了,但是当前指向的这个对象自身的数据是可以改变的。

    如何理解上面的解释呢,看如下示例:

    public void test(final Student student) {
        // student = new Student() // 这种写法就会报错,因为改变了student的指向,但是student是个final的。
        
        student.setName("123"); // 这种操作是可以的,并且student的name会被成功修改
        
    }
    

    2.2 final修饰方法

    使用final修饰方法的作用是把方法锁定,以防止任何继承类修改它的含义。在继承类中,使用了与父类用final修饰的方法同名的方法时,并没有覆盖父类的该方法,而是生成了一个新的方法。也就是说final修饰的方法不能被重写

    2.3 final修饰类

    当将某个类定义为final时,就表明了你不打算继承该类,也不允许别人继承。

    3. transient

    使用transient 关键字,标记变量不被序列化和反序列化

    谈到序列化,static 变量也是不会被序列化的

    4. volatile

    volatile 可以保证变量对所有线程的可见性,但是不能说是完全的线程,例如++ 操作是个非原子操作,就有可能出现问题

    volatile只保证了可见性,在不满足以下情况的时候,需要加锁(synchronized 或者 java.util.concurrent中的原子类)来保证原子性

    1. 运算结果并不依赖变量的当前值,后者能够确保只有单一线程修改变量的值
    2. 变量不需要同其他的状态变量一起参与不变约束

    volatile 修饰long / double 在多线程的时候可以把他们的读写变成原子的操作(现代的虚拟机已经把64位数据读写作为原子操作了)

    volatile可以防止指令重排序

    相关文章

      网友评论

          本文标题:【JAVA提升】- 关键字

          本文链接:https://www.haomeiwen.com/subject/ktoynttx.html