Java 教程 在线

1307Java 修饰符

transient

当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

//定义一个需要序列化的类

class People implements Serializable{
    String name; //姓名
    transient Integer age; //年龄
    public People(String name,int age){
        this.name = name;
        this.age = age;
    }

    public String toString(){
        return "姓名 = "+name+" ,年龄 = "+age;
    }

}

public class TransientPeople {
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        People a = new People("李雷",30);
        System.out.println(a); //打印对象的值
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d://people.txt"));
        os.writeObject(a);//写入文件(序列化)
        os.close();
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("d://people.txt"));
        a = (People)is.readObject();//将文件数据转换为对象(反序列化)
        System.out.println(a); // 年龄 数据未定义
        is.close();
    }
}

运行结果如下:

姓名 = 李雷 ,年龄 = 30
姓名 = 李雷 ,年龄 = null

volatile

volatile可以用在任何变量前面,但不能用于final变量前面,因为final型的变量是禁止修改的。

使用的场景之一,单例模式中采用DCL双锁检测(double checked locking)机制,在多线程访问的情况下,可使用volatitle修改,保证多线程下的可见性。缺点是性能有损失,因此单线程情况下不必用此修饰符。

class Singleton{
    private volatile static Singleton instance = null;
    private Singleton() {
    }

    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

1306Java 修饰符

关于修饰符

1.分为“访问修饰符”和“非访问修饰符”。顾名思义,“访问修饰符”就是和访问权限有关得修饰符。

2.访问修饰符中一些值得注意得地方:

Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据;

被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问;

protected 访问修饰符可以修饰类及其方法,但是接口及接口的成员变量和成员方法不能声明为 protected;

3.关于static修饰符的理解

怎么理解静态变量呢?简单来说静态变量就是一个类的公有属性。在这里可以打个拙劣的比方:假设“班里的学生”是一个类,班里的任何一个同学都相当于一个对象。那么所有学生的学费是一样的对吧?”学费“就相当于一个”静态变量“,其特征是它不属于任何一个”对象“(即学生)的专有属性,是大家”公有“的,若是变了,那就所有的同学的学费都会变。我们假设每个同学都有修改学费的权力,那么任何一个同学修改了学费(这个静态变量),所有同学的学费就都会变。

另外:静态方法只能使用类的静态变量。

1305Java 修饰符

静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

1304Java 修饰符

static全局变量与普通的全局变量:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

1303Java 修饰符

整个世界都打包成一块,同时划分为四个层次: 联合国(public)【其他包】、国家(protected)【继承子孙】、洲际(default)【同一包】、个人(private)【当前类】。

联合国制定规则所有人都可以用,国家制定的只有在国家内可以用,各联邦洲因地制宜有制定当地民法,个人制定的就给个人使用。