java关键字---final和transient

首先,说说final。

final关键字可以修饰变量,方法,类。

 final变量

需求:

1 需要一个永不改变的编译时常量

2 一个运行时被初始化的值,不希望被更改

好处:

编译时就执行的计算,减轻运行时的负担

扩展:

可以修饰基本类型和引用对象。修饰基本类型的时候,表示数值很定不变。修饰对象引用的时候,一旦引用被初始化指向一个对象,就无法再将它更改指向另一个对象(该对象本身是可以修改的)

空白final

final修饰但又没有给出初始值的域

必须在域的的定义或构造器内用表达式给final赋值(final使用前必须初始化)

注意:

如果一个对象被static和final同时修饰(编译期常量),一般用大写表示,下划线链接单词

修饰参数:

如果final修饰参数,表示该参数可读,但无法修改。

用法示例:

private Random rand=new Random();
	private static  Random random=new Random();
	private final int n1=12;
	private final int number=rand.nextInt(30);
	private  static final int NUMBER2=random.nextInt(40);
	@Test
	public void finalDataTest(){
		System.out.println(n1);
		System.out.println("--------------------");
		System.out.println(rand.nextInt(30));
		System.out.println("--------------------");
		System.out.println("编译初始之后,不会改变:"+number);
		System.out.println("--------------------");
		System.out.println("编译初始之后,不会改变:"+NUMBER2);

	}
	/**
	 * final修饰参数:该参数可读,但无法修改。
	 * @param sk
	 * @return
	 */
	public String finalParam(final String sk){
		//sk="jeyson"; final参数不能被修改
		return sk;

	} 

  final方法:

final也可以修饰方法,表示该方法不能被子类继承。

使用final的好处:

1 JDK1.5以前,效率更高,JDK1.5以后可以忽略

2 方法锁定,确保子类中该方法含义不变,不能被覆盖

用法示例:

 public final String finalMethod(){
             return "Hello World" ;
      }

  

 final类:

不希望被任何类继承,可以使用final修饰类

用法示例:

  public final class FinalClassTx {
   private int k ;

   public void getMyWord(){
         System. out .println("这是一个final类,k的值是" +getK());
   }

public int getK() {
       return k ;
}
public void setK( int k) {
       this .k = k;
}

}

 然后 transient关键字:

 

transient只能修饰变量,表示该变量不能被序列化。

一般我们继承Serializable接口的类,序列化会自动进行,使用transient修饰的变量在该类被序列化的时候,不会序列化到指定目的地。

所以,

1 被transient修饰的变量不再是对象持久化的一部分,该变量内容序列化无法获得访问

2 transient只能修饰变量,不能修饰方法和类

3 一个静态变量无论是否被transient修饰,都不能被序列化

用法示例:

public class TransientEx  {

	public static void main(String[] args) {
		User user=new User();
		user.setUsername("jeyson");
		user.setPassword("123456");
		System.out.println("序列化前:");
		System.out.println("   username="+user.getUsername());
		System.out.println("   password="+user.getPassword());
		//序列化
		try {
			ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("C://MyResource//test1.txt"));
			os.writeObject(user);
			os.flush();
			os.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//反序列化
		try {

			ObjectInputStream is=new ObjectInputStream(new FileInputStream("C://MyResource//test1.txt"));
			user=(User) is.readObject();
			is.close();
			System.out.println("序列化后:");
			System.out.println("   username="+user.getUsername());
			System.out.println("   password="+user.getPassword());

		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("--------------------------------");

	}
}

class User implements Serializable{

	private static final long serialVersionUID = 1L;

	private  String username;
	//使用 transient
	private transient String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}	

}

  扩展:Externalizable

实现了serializable接口的类,所以序列化会自动进行

实现了Externaliazble接口的类,没有任何东西可以自动序列化,无论是否使用transient对结果都没有影响。

此时如果需要序列化,需要在writeExternal方法中上进行手动指定所要序列化的变量。

使用示例:

public class ExternalizableEx implements Externalizable {
	private transient String name="ssss";

	@Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
		name=(String) in.readObject();

	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public static void main(String[] args) {
		 ExternalizableEx ex=new ExternalizableEx();
		 ex.setName("jeyson");
		 System.out.println("Externalizable序列化前:");
		 System.out.println(ex.getName());
		 //序列化
		 try {
			 ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(new File("C://MyResource//test2.txt")));
			 os.writeObject(ex);
			 os.flush();
			 os.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		 //反序列化
		 try {
			 ObjectInputStream is=new ObjectInputStream(new FileInputStream(new File("C://MyResource//test2.txt")));
			 ex=(ExternalizableEx) is.readObject();
			 is.close();
			 System.out.println("Externalizable序列化后:");
			 System.out.println(ex.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 声明:

final大部分来自《java编程思想》第四版

transient相关部分参考自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

时间: 2024-10-29 02:45:33

java关键字---final和transient的相关文章

Java关键字final、static使用总结

Java关键字final.static使用总结 一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表示常量,只能被赋值一次,赋值后值不再改变.        final不

[转] Java关键字final、static使用总结

Java关键字final.static使用总结 一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表示常量,只能被赋值一次,赋值后值不再改变.        final不

转!Java关键字final、static使用总结

Java关键字final.static使用总结 一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的. final方法不能被子类的方法覆盖,但可以被继承. final成员变量表示常量,只能被赋值一次,赋值后值不再改变. final不能用于修饰构造方法. 注意:父类的private成员方法

[Java] 关键字final、static使用总结

一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.final类不能被继承,没有子类,final类中的方法默认是final的.final方法不能被子类的方法覆盖,但可以被继承.final成员变量表示常量,只能被赋值一次,赋值后值不再改变.final不能用于修饰构造方法.注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是

Java关键字final、static使用总结(转)

原文链接:Java关键字final, static一些要点 1. final final类不能被继承,没有子类,final类中的方法默认是final的 final方法不能被子类的方法复盖,但可以被继承 final成员变量表示常量,只能被赋值一次,赋值后不能再被改变 final不能用于修饰构造方法 private不能被子类方法覆盖,private类型的方法默认是final类型的 final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. 注意:final变量定义的时候,可以

Java关键字final、static使用总结(转)

Java关键字final.static使用总结 一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.        final成员变量表示常量,只能被赋值一次,赋值后值不再改变.        final不

对Java关键字final和static的理解

一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的. final方法不能被子类的方法覆盖,但可以被继承. final成员变量表示常量,只能被赋值一次,赋值后值不再改变. final不能用于修饰构造方法. 注意:父类的private成员方法是不能被子类方法覆

【转】Java关键字final、static使用总结

转自:http://lavasoft.blog.51cto.com/62575/18771/ Java关键字final.static使用总结 一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final类不能被继承,没有子类,final类中的方法默认是final的.        final方法不能被子类的方法覆盖,但可以被继承.      

Java关键字final

在Java中可以使用final关键字声明类.属性.方法,在声明时需要注意以下几点:      使用final声明的类不能有子类:      使用final声明的方法不能被子类所覆写,可以被重载: class Person { final void fly() { System.out.println("不能被重写,但能被重载"); } } class Student extends Person { /* * void fly(){ System.out.println("不