`

java transient(不会序列化)、static关键字的作用

    博客分类:
  • java
 
阅读更多
transient
java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

transient使用小结
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。



用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。

1、static变量
 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

所以一般在需要实现以下两个功能时使用静态变量:
  在对象之间共享值时
  方便访问变量时

2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,
因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。
因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。

静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的

3、static代码块

 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如:

public class Test5 { 
private static int a; 
private int b; 

static{ 
Test5.a=3; 
System.out.println(a); 
Test5 t=new Test5(); 
t.f(); 
t.b=1000; 
System.out.println(t.b); 
} 
static{ 
Test5.a=4; 
System.out.println(a); 
} 
public static void main(String[] args) { 
// TODO 自动生成方法存根 
} 
static{ 
Test5.a=5; 
System.out.println(a); 
} 
public void f(){ 
System.out.println("hhahhahah"); 
} 
}  


运行结果:
3
hhahhahah
1000
4
5

利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。

4、static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。

5.静态导入Static import

静态导入的语法是:

import static 包名.类名.静态成员变量;

import static 包名.类名.静态成员函数;

注意导入的是成员变量和方法名。

缺点:过度地使用静态导入会在一定程度上降低代码的可读性。


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java 对象的序列化与反序列化

    4. **非序列化字段**:有些字段可能不希望被序列化,可以使用`transient`关键字标记。这些字段在序列化过程中会被忽略。 5. **深拷贝与浅拷贝**:序列化实际上是实现了深拷贝,即创建了对象的一个完全独立的副本,...

    深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)

    今天,我们将深入理解Java虚拟机-Java内存区域透彻分析,探讨序列化和反序列化的概念及其使用场景,实现序列化的方式,以及transient关键字的作用。 序列化和反序列化的概念 序列化是指将Java对象转换为二进制数据...

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    Java序列化_Java序列化结构_

    当一个对象被序列化时,其所有字段(包括私有的)都会被包含在字节流中,除非这些字段被`transient`或`static`关键字修饰,这两个关键字声明的字段不会参与序列化。 序列化的过程通常涉及到以下步骤: 1. 创建一个...

    Java之transient关键字.Java

    在Java编程语言中,`transient`关键字是一个非常重要的特性,它用于标记对象的某个成员变量不应该被序列化。当你创建一个可序列化的类(通过实现`Serializable`接口)时,如果你不想某些字段在序列化过程中被保存或...

    java关键字transient

    在Java编程语言中,`transient`是一个非常重要的关键字,它与对象持久化和序列化密切相关。当一个字段被声明为`transient`时,它表明该字段的值不会随着对象的序列化而保存。这通常用于那些不希望或者不需要在序列化...

    java serializable 序列化与反序列化

    - ** transient 关键字**:如果某个字段不需要序列化,可以使用`transient`关键字修饰。序列化时,这些字段会被忽略。 - **readObject() 和 writeObject()** 方法:可以覆盖这两个方法来自定义序列化和反序列化的...

    Java对象的序列化与反序列化Java开发Java经验技巧

    - **用途**:Java提供了`transient`关键字,用于标记类的某个字段不参与序列化和反序列化。 - **应用场景**:例如,某些字段可能包含敏感信息,不适合在网络上传输,或者字段的值可以通过其他方式重新计算得到。 ...

    java序列化实现演示

    - 使用`transient`关键字标记不需要序列化的字段。 - `readObject()`和`writeObject()`方法可以自定义序列化和反序列化的逻辑。 总之,Java序列化是一个强大的工具,但也需要谨慎使用。理解`serialVersionUID`的...

    java自动序列化

    对于类中包含的transient和static修饰的成员变量,它们不会参与序列化过程,因为transient变量表示临时状态,static变量表示类级别的状态,不依赖于对象实例。 四、序列化过程 1. 创建ObjectOutputStream实例,如`...

    Java 文件 序列化 读写

    - 如果某个字段不希望参与序列化,可以使用`transient`关键字标记。这样,序列化时会忽略这个字段。 - 对于静态字段,Java默认也不会序列化。 7. **自定义序列化和反序列化**: - 通过实现`writeObject()`和`...

    Java中的序列化与反序列化.pdf

    此外,如果一个类包含不希望被序列化的字段,可以通过添加`transient`关键字来标记这些字段,它们将不会被包含在序列化过程中。 另外,Java还提供了一个更灵活的序列化接口`Externalizable`,它要求类自己控制序列...

    java 序列化代码示例

    - 需要注意的是,所有字段默认都是可序列化的,如果不想序列化某个字段,可以使用`transient`关键字标记,例如: ```java private transient int temp; // 这个字段不会被序列化 ``` 3. **序列化过程**: - ...

    关于 Java 对象序列化您不知道的 5 件事

    序列化时,只有那些非transient和非static的字段会被写入字节流。 3. **自定义序列化行为** 开发者可以通过重写`writeObject()`和`readObject()`方法来自定义序列化和反序列化的行为。这两个方法在序列化期间允许...

    java序列化全解

    同样,transient关键字用于标记那些不希望被序列化的字段,这些字段的值在反序列化后不会保留。 3. **相关类和接口**:Java提供了一系列的类和接口来支持序列化。例如,`ObjectOutput`接口和`ObjectOutputStream`类...

    Java对象序列化的秘密

    1. **transient关键字**: 使用`transient`修饰的字段不会被序列化,这意味着它们的值不会保存在序列化的字节流中。 2. **serialVersionUID**: 每个可序列化的类都有一个`serialVersionUID`,用于检查序列化版本的...

    07-Java序列化面试题(10题)-新增.pdf

    在变量声明前加上 Transient 关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。 10. 序列化(深 clone 一中实现) 在 Java 语言里深...

    克隆和序列化(Java )

    可以使用`transient`关键字标记不想被序列化的字段。 3. **序列化操作**:使用`ObjectOutputStream`的`writeObject()`方法进行序列化,`ObjectInputStream`的`readObject()`方法进行反序列化。 4. **优点**:序列...

    java对象实现序列化

    3. ** transient 关键字**:`transient`修饰的成员变量不会被序列化。例如,如果一个对象包含数据库连接,这些不应该被序列化,因为它们无法在反序列化时恢复,应该用`transient`修饰。 4. **枚举类型的序列化**:...

Global site tag (gtag.js) - Google Analytics