随笔-126  评论-247  文章-5  trackbacks-0

   
一、static

static 可以用来修饰变量、方法、代码块。

1. static 修饰变量:

   被 static 修饰的变量叫静态变量类变量, 没有被 static 修饰的变量叫实例变量
  
   在运行时期, JVM 在加载类的时候将完成对静态变量/类变量分配一次内存空间, 且在内存上只存在一份拷贝, 类的所有实例将共享这份拷贝。

   静态变量/类变量独立于该类的任何对象, 它不依赖类的特定实例, 可以通过类名来访问得到, 也可以通过实例名来访问(不建议)。

   而对于实例变量, 是每次创建类的实例的时候都会为实例变量分配一次内存空间, 实例变量在内存上可能存在多个拷贝, 但它们之间互不影响。

2. static 修饰方法

   被 static 修饰的方法称为静态方法, 与静态变量相似的, 它独立于该类的任何对象, 它不依赖类的特定实例。
 
   因此静态方法中不能使用 this、super 关键字, 也不能调用非静态的变量或方法(因为非静态是需依赖于具体的实例, 如果调用, 则不能保证其被正确初始化,

   而 Java 编译器是不允许你这么做的)。静态方法可以通过类名来访问得到, 也可以通过实例名来访问(不建议)。

3. static 修饰代码块

   被 static 修饰的代码块叫静态代码块, JVM 在加载类的时候就会执行这些静态代码块, 而且只会被执行一次, 因此静态代码块会比类的构造方法优先执行。

   如果一个类中的静态代码块有多个,JVM 将按照它们在类中出现的先后顺序依次执行它们。

二、final

final 译成中文是最终的和不可更改的意思, 它可以用来修饰非抽象类, 非抽象成员方法和变量。

1. final 修饰类

   final 不能用来修饰 abstract 的类, 不能被继承, 它是顶级类, 没有子类, 像我们常用的 String 类

2. final 修饰变量

   final 用来修饰变量, 那就意味着该变量一旦初始化完成, 那么它的值就不能够再被改变。

   因此, final 修饰的变量必须由程序员手动去做初始化给变量赋值, 而且初始化的位置只能是: 定义处、构造方法、普通代码块(不能是静态代码块)。

   而且这三个位置中只能选择一处来做初始化。

   [小延伸: 普通代码块实际上会被提取到构造方法中来执行, 而且会比构造方法体内的代码优先执行。]

3. final 修饰方法

   final 用来修饰方法表示不允许其子类来覆盖这个方法。

   final 不能用来修饰构造器(构造方法、构造函数、构造子), 因为父类的构造器不能够被继承, 类内的 private 方法也不能够被子类继承,

   也就不存在覆盖之说法, 覆盖仅适用于成员方法, private 修饰的方法实际上默认也是 final 类型的。

三、transient

这个比较陌生, 其实我压根就没用过.... -_-|| 在 java 源码里见到过, 不过没有用到的东西向来学了就忘的很干脆, 这次是为了找工作, 重新整理一遍。

@Transient 相信很多人都认识这个, 在编一个实体类写 JPA(Java Persistence API, Java 持久化 API)注解的时候, 会常常用到这个注解。

而这里的 transient 和 @Transient 的作用很相似:

Java 的 Serializable 提供了一种持久化对象实例的机制。当一个对象发生持久化时, 可能会有一些特殊的数据成员,

是我们不希望用 Serializable 机制来保存的。为了在一个特定对象的一个或多个域上关闭持久化, 可以在这个域前加上关键字 transient。
  
transient 是 Java 的关键字, 用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候, 被声明成 transient 的变量的值

不会包括在串行化里面。 

示例:

  
package test;

import java.io.Serializable;

public class Admin implements Serializable{

    
private static final long serialVersionUID = 1L;
    
private String name;
    
private transient String nickname;
    
    
public String getName() {
        
return name;
    }
    
    
public void setName(String name) {
        
this.name = name;
    }
    
    
public String getNickname() {
        
return nickname;
    }
    
    
public void setNickname(String nickname) {
        
this.nickname = nickname;
    }
    
}
  

 


   
package test;
/**
 * <!--
 * Author : fancy
 * Email  : fancydeepin@yeah.net
 * Date   : 2013-02-07
 * --!>
 
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class AdminTest {

    
public static void main(String[] args) throws Exception{
        
        Admin admin 
= new Admin();
        admin.setName(
"店小三");
        admin.setNickname(
"小菜一叠");
        writeObject(admin);
        System.out.println(
"<------------- 序列化之前 ------------->");
        System.out.println(
"姓名: " + admin.getName());
        System.out.println(
"昵称: " + admin.getNickname());
        admin 
= (Admin)readObject();
        System.out.println(
"<------------- 反序列化后 ------------->");
        System.out.println(
"姓名: " + admin.getName());
        System.out.println(
"昵称: " + admin.getNickname());
        
/**
         * 控制台执行输出结果:
         * 
         * <------------- 序列化之前 ------------->
         * 姓名: 店小三
         * 昵称: 小菜一叠
         * <------------- 反序列化后 ------------->
         * 姓名: 店小三
         * 昵称: null
         
*/
    }
    
    
//序列化
    public static void writeObject(Object obj) throws Exception{
        ObjectOutputStream oos 
= new ObjectOutputStream(new FileOutputStream("admin.ser"));
        oos.writeObject(obj);
    }
    
    
//反序列化
    public static Object readObject() throws Exception{
        ObjectInputStream ois 
= new ObjectInputStream(new FileInputStream("admin.ser"));
        
return ois.readObject();
    }
}
   


 



  
posted on 2013-02-07 12:14 fancydeepin 阅读(1892) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: