A:在代码中使用transient声明一个实例变量,并把对象序列化的时候不会被存储的
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Person implements Serializable {
//在代码中使用transient声明一个实例变量,并把对象序列化的时候不会被存储的,例如:
private String username;
private transient int age;
Person(String name, int age) {
this.username = name;
this.age = age;
}
public String toString() {
return "username: " + username + "\nage: " + age;
}
public static void main(String[] args) {
Person person = new Person("Hulk", 12);
System.out.println("save object before****************************");
System.out.println(person);
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.txt"));
out.writeObject(person);
out.close();
Thread.sleep(2000);
ObjectInputStream input = new ObjectInputStream(new FileInputStream("person.txt"));
System.out.println("read object***********************************");
person = (Person) input.readObject();
System.out.println(person);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序,成员变量boolValue用volatile修饰会导致程序很快退出:
package linyumin.test.thread;
/**
*
* @author llade
*
*/
public class VolatileObjectTest {
/**
* 成员变量boolValue使用volatile和不使用volatile会有明显区别的。
* 本程序需要多试几次,就能知道两者之间的区别的。
* @param args
*/
public static void main(String[] args) {
final VolatileObjectTest volObj=new VolatileObjectTest();
Thread t1=new Thread(){
public void run(){
System.out.println("t1 start");
for(;;){
volObj.waitToExit();
}
}
};
t1.start();
Thread t2=new Thread(){
public void run(){
System.out.println("t2 start");
for(;;){
volObj.swap();
}
}
};
t2.start();
}
boolean boolValue;//加上volatile 修饰的是时候,程序会很快退出,因为volatile 保证各个线程工作内存的变量值和主存一致。所以boolValue == !boolValue就成为了可能。
public void waitToExit() {
if(boolValue == !boolValue)System.exit(0);//非原子操作,理论上应该很快会被打断。实际不是,因为此时的boolValue在线程自己内部的工作内存的拷贝,因为它不会强制和主存区域同步,线程2修改了boolValue很少有机会传递到线程一的工作内存中。所以照成了假的“原子现象”。
}
public void swap() {//不断反复修改boolValue,以期打断线程t1.
boolValue = !boolValue;
}
}
int 的问题初始化和默认
public class MyField{
int i = 99;
void amethod(){
int i=0;
int[] j = new int[5];
System.out.println(i);
System.out.println(j[0]);
}
public static void main(String argv[]){
MyField m = new MyField();
m.amethod();
}
}
分享到:
相关推荐
首先,Java中的标识符是用于给变量、方法和类命名的重要元素。标识符的规则非常明确:它们可以包含字母、数字、下划线或美元符号,但首字符不能是数字。Java支持Unicode字符集,这意味着它可以处理包括汉字在内的...
- **初始化**: 不强制要求初始化,但建议在创建对象时或之后立即初始化。 ##### 3. 静态变量 - **定义**: 使用`static`关键字声明。 - **作用域**: 在整个类中可见。 - **生命周期**: 类加载时创建,类卸载时销毁...
- **final变量**:对于声明为`final`的变量,一旦初始化就不能再次修改其值。 - **transient关键字**:用于标记对象中的瞬态状态,这些状态在序列化时会被忽略。 - **volatile关键字**:用于确保多个线程之间的可见...
- `transient`: 用于序列化。 - `try`: 用于捕获异常。 - `void`: 用于声明无返回值的方法。 - `volatile`: 用于多线程环境中变量的可见性。 - `while`: 用于创建while循环。 ### 示例代码解析 下面是一个简单的...
由于 `s` 未被显式初始化,默认值为 `null`,因此当尝试打印 `s` 时,将会抛出 `NullPointerException`。正确答案是 **C. 代码不编译,因为 `s` 未初始化**。 #### 题目91: 字符类型声明 **题目描述:** 题目要求...
Java 中的关键字包括但不限于:abstract、assert、boolean、break、byte、case、catch、char、class、const、continue、default、do、double、else、enum、extends、final、finally、float、for、if、goto、...
- **知识点**: Java中的基本数据类型声明及初始化。 - **解析**: - `long l = 0xfffL;` 是正确的声明方式。 - 选项分析: - A. `byte = 128;`: 错误,`byte`的最大值为127。 - B. `Boolean = null;`: 错误,`...
- `const`:常量修饰符(Java中未使用)。 #### 七、变量命名与作用域 - **变量命名规则**: - 类名首字母大写,多个单词组合时,每个单词首字母大写(大驼峰命名法)。 - 小驼峰命名法:首个单词字母小写,后面...
- Java中使用`java.util.regex`包来实现正则表达式的匹配。 31. **什么是懒加载(LazyLoading)** - 懒加载是一种优化技术,在真正需要数据之前不加载数据,从而减少不必要的开销。 32. **什么是尾递归,为什么...
initialize 预置 初始化 [i'niʃәlaiz] instanceof (关键字) 运算符,用于引用变量,以检查这个对象是否是某种类型。返回 boolean 值。 interface (关键字) 接口 ['intәfeis] invoke vt.调用 [in'vәuk]' ( ...
C) 程序能通过编译,运行时将打印出0/0,因为在Java中int型变量day和month默认为0。 D) 以上说法都不正确。 题目10:c 下面关于继承的描述正确的一项是:(选择1项) A) 子类继承父类,那么子类将继承父类的所有...
Java中的关键字 这部分似乎没有给出具体的关键字列表,但通常面试中会涉及如下关键字: - **`class`**, **`interface`**, **`enum`**:用于定义类、接口和枚举。 - **`abstract`**:用于声明抽象类或抽象方法。 - ...
•对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。 •对于实例属性,要么在普通初始化块中指定初始值。要么在定义时、或构造器中指定初始值。 final修饰局部变量 •使用final修饰...