構造有限個數的有效三角形
/*創建一個三角形類,包含屬性:private int a,b,c;分別代表三角形的三條邊,設計是需要滿足如下需求:
a. 在創建物件輸入三條邊,三邊取值必須合法(三邊均為正值,且任意兩邊之和大于第三邊),否則將無法創建物件;
b.為使類更易于維護,必須單獨設計一個boolean limit(…)函式,實作對三條邊的限制檢查,符合創建條件則回傳真,否則回傳假,
c.該類有一個public boolean setEdges(int x, int y, int z)方法(注:此方法為非靜態方法),將a/b/c的值替換成x/y/z,回傳true,
但當x,y,z的值不滿足三角形限制條件時,將不予替換,并回傳false;
d. 三角形至多能創建3個,
設計該三角形類,并驗證上述需求, */
public class Triangle {
private int a,b,c;
static int total = 3,count = 0;
private Triangle(int x,int y,int z){
a = x;b = y;c = z;
count++;
}
static boolean limit(int x,int y,int z) {
if(x>0 && y>0 && z>0 && x+y>z && x+z>y && y+z>x) {
return true;
}
return false;
}
public static Triangle setTri(int x,int y,int z) {
if(limit(x,y,z) && count<total) {
return new Triangle(x,y,z);
}
return null;
}
public boolean setEdges(int x,int y,int z) {
if(limit(x,y,z)) {
a = x;b = y;c = z;
return true;
}
return false;
}
public String toString() {
return "(" + a + "," + b + "," + c + ")";
}
}
class App1{
public static void main(String[] args) {
Triangle[] t = new Triangle[5];
t[0] = Triangle.setTri(2, 2, 1);
t[1] = Triangle.setTri(1, 2, 1);
t[2] = Triangle.setTri(3, 4, 5);
t[3] = Triangle.setTri(2, 4, 4);
t[4] = Triangle.setTri(6, 8, 10);
for(int i = 0; i<5; i++)
System.out.println(t[i]);
}
}
注:
- count++要放在建構式中,只要呼叫了建構式就會創建物件
- 類中的toString()方法必須用public修飾,不能改小權限,且該方法會被物件自動呼叫
- 靜態方法只能使用類中的靜態成員,所以limit()方法和total,count變數要為靜態的
形狀識別器
使用抽象類實作
/*實作智能識別器,可針對圓形、矩形、三角形、梯形不同形狀,提供如下服務:
a. 識別形狀的面積;
b. 輸出形狀屬性資訊:型別和各種引數,如:梯形,上底:20,下底:30,高:10)--- 考慮toString()*/
import static java.lang.Math.PI;
abstract class Shape {
private String type;
Shape(String t){
type = t;
}
String getType() {
return type;
}
abstract double getArea();
}
class Circle extends Shape{
private int r;
Circle(String s,int R){
super(s);
r = R;
}
double getArea() {
return PI*r*r;
}
public String toString() {
return "半徑:" + r;
}
}
class Rectangle extends Shape{
private int w,h;
Rectangle(String s,int x,int y){
super(s);
w = x;h = y;
}
double getArea() {
return w*h;
}
public String toString() {
return "寬:" + w + ",高:" + h;
}
}
class Trigon extends Shape{
private int s,h;
Trigon(String t,int x,int y){
super(t);
s = x;h = y;
}
double getArea() {
return s*h/2;
}
public String toString() {
return "底:" + s + ",高:" + h;
}
}
class Trapezoidal extends Shape{
private int a,b,h;
Trapezoidal(String s,int x,int y,int z){
super(s);
a = x;b = y;h = z;
}
double getArea() {
return (a+b)*h/2;
}
public String toString() {
return "上底:" + a + ",下底:" + b + ",高:" + h;
}
}
class Recognizer{
public static void identify(Shape s) {
System.out.println(s.getType() + "," + s.toString() + ",面積:" + s.getArea());
}
}
class App2{
public static void main(String[] args) {
Shape[] s = {new Circle("圓形", 2),
new Rectangle("矩形", 3, 4),
new Trigon("三角形", 4, 2),
new Trapezoidal("梯形", 2, 4, 3)
};
for(int i = 0;i<4;i++)
Recognizer.identify(s[i]);
}
}
注:
- 私有屬性可以通過類中的方法回傳得到
- abstract類中不一定要有抽象方法,但抽象方法所屬類一定是抽象類
- 抽象方法不能有方法體
- 該識別器基于超類編程,實作即插即用的功能,添加子類很方便
使用介面實作
/*【介面實作】實作智能識別器,可針對圓形、矩形、三角形、梯形不同形狀,提供如下服務:
a. 識別形狀的面積;
b. 輸出形狀屬性資訊:型別和各種引數,如:梯形,上底:20,下底:30,高:10)--- 考慮toString()*/
import static java.lang.Math.PI;
interface Shapein {
public abstract String getType();
public abstract double getArea();
}
class yx implements Shapein{
private int r;
private String type;
yx(String s,int R){
r = R;
type = s;
}
public String getType() {
return type;
}
public double getArea() {
return PI*r*r;
}
public String toString() {
return "半徑:" + r;
}
}
class jx implements Shapein{
private int w,h;
private String type;
jx(String s,int x,int y){
w = x;h = y;
type = s;
}
public String getType() {
return type;
}
public double getArea() {
return w*h;
}
public String toString() {
return "寬:" + w + ",高:" + h;
}
}
class sj implements Shapein{
private int w,h;
private String type;
sj(String s,int x,int y){
w = x;h = y;
type = s;
}
public String getType() {
return type;
}
public double getArea() {
return w*h/2;
}
public String toString() {
return "底:" + w + ",高:" + h;
}
}
class tx implements Shapein{
private int a,b,h;
private String type;
tx(String s,int x,int y,int z){
a = x;b = y;h = z;
type = s;
}
public String getType() {
return type;
}
public double getArea() {
return (a+b)*h/2;
}
public String toString() {
return "上底:" + a + ",下底:" + b + ",高:" + h;
}
}
class Identifier{
public static void identify(Shapein s) {
System.out.println(s.getType() + "," + s.toString() + ",面積:" + s.getArea());
}
}
class App3{
public static void main(String[] args) {
Shapein[] s = {new yx("圓形", 2),
new jx("矩形", 3, 4),
new sj("三角形", 4, 2),
new tx("梯形", 2, 4, 3)
};
for(int i = 0;i<4;i++)
Identifier.identify(s[i]);
}
}
注:
- 介面中只能定義常量,且常量都有public static final修飾,介面中的方法都有public abstract修飾
- 在main函式中,用的是介面參考指向實作類的物件,Java在利用介面變數呼叫其實作類的物件的方法時,該方法必須已經在介面中被宣告,而且實作類的物件對該方法進行了重寫,
兵種游戲設計
/*兵種包括轟炸機、直升機、重型坦克、輕型坦克、音波坦克、步兵、飛行兵
b.轟炸機、直升機、飛行兵屬于空軍;步兵、輕型坦克、重型坦克屬于陸軍,音波坦克屬于水陸兩棲;
c.輕型坦克、步兵只能攻擊陸軍,音波坦克只能攻擊空軍,轟炸機可攻擊陸軍、海軍;重型坦克可攻擊陸軍、空軍,直升機、飛行兵可攻擊海軍、陸軍、空軍;
并驗證設計效果,(即向兵種變數填入海/陸/空軍兵種,檢測a.attack(b)的輸出)*/
interface 陸軍{}
interface 空軍{}
interface 海軍{}
interface 可攻擊陸軍{
default void attack(陸軍 x) {System.out.println("可攻擊陸軍");}
}
interface 可攻擊空軍{
default void attack(空軍 x) {System.out.println("可攻擊空軍");}
}
interface 可攻擊海軍{
default void attack(海軍 x) {System.out.println("可攻擊海軍");}
}
interface 可攻擊陸軍海軍 extends 可攻擊陸軍,可攻擊海軍{}
interface 可攻擊陸軍空軍 extends 可攻擊陸軍,可攻擊空軍{}
interface 可攻擊陸軍空軍海軍 extends 可攻擊陸軍,可攻擊空軍,可攻擊海軍{}
abstract class 兵種{
private String type;
public String getType() {return type;}
兵種(String x){
type = x;
}
public abstract void attack(兵種 x);
public String attackinfo(兵種 x) {
return getType() + "遇見" + x.getType() +":";
}
}
class 轟炸機 extends 兵種 implements 空軍,可攻擊陸軍海軍{
轟炸機(){
super("轟炸機");
}
public void attack(兵種 x) {
if(x instanceof 陸軍) {
System.out.print(attackinfo(x));
attack((陸軍)x);
}else if(x instanceof 海軍) {
System.out.print(attackinfo(x));
attack((海軍)x);
}else {
System.out.println(attackinfo(x) + "不能攻擊!");
}
}
}
class 直升機 extends 兵種 implements 空軍,可攻擊陸軍空軍海軍{
直升機(){
super("直升機");
}
public void attack(兵種 x) {
if(x instanceof 陸軍) {
System.out.print(attackinfo(x));
attack((陸軍)x);
}else if(x instanceof 海軍) {
System.out.print(attackinfo(x));
attack((海軍)x);
}else {
System.out.print(attackinfo(x));
attack((空軍)x);
}
}
}
class 飛行兵 extends 兵種 implements 空軍,可攻擊陸軍空軍海軍{
飛行兵(){
super("飛行兵");
}
public void attack(兵種 x) {
if(x instanceof 陸軍) {
System.out.print(attackinfo(x));
attack((陸軍)x);
}else if(x instanceof 海軍) {
System.out.print(attackinfo(x));
attack((海軍)x);
}else {
System.out.print(attackinfo(x));
attack((空軍)x);
}
}
}
class 重型坦克 extends 兵種 implements 陸軍,可攻擊陸軍空軍{
重型坦克(){
super("重型坦克");
}
public void attack(兵種 x) {
if(x instanceof 陸軍) {
System.out.print(attackinfo(x));
attack((陸軍)x);
}else if(x instanceof 空軍) {
System.out.print(attackinfo(x));
attack((空軍)x);
}else {
System.out.println(attackinfo(x) + "不能攻擊!");
}
}
}
class 音波坦克 extends 兵種 implements 陸軍,海軍,可攻擊空軍{
音波坦克(){
super("音波坦克");
}
public void attack(兵種 x) {
if(x instanceof 空軍) {
System.out.print(attackinfo(x));
attack((空軍)x);
}else {
System.out.println(attackinfo(x) + "不能攻擊!");
}
}
}
class 輕型坦克 extends 兵種 implements 陸軍,可攻擊陸軍{
輕型坦克(){
super("輕型坦克");
}
public void attack(兵種 x) {
if(x instanceof 陸軍) {
System.out.print(attackinfo(x));
attack((陸軍)x);
}else {
System.out.println(attackinfo(x) + "不能攻擊!");
}
}
}
class 步兵 extends 兵種 implements 陸軍,可攻擊陸軍{
步兵(){
super("步兵");
}
public void attack(兵種 x) {
if(x instanceof 陸軍) {
System.out.print(attackinfo(x));
attack((陸軍)x);
}else {
System.out.println(attackinfo(x) + "不能攻擊!");
}
}
}
class App4{
public static void main(String[] args) {
兵種[] x = {
new 轟炸機(),new 直升機(),new 重型坦克(),new 輕型坦克(),new 音波坦克(),new 飛行兵(),new 步兵()
};
for(int i = 0;i<x.length;i++) {
x[i].attack(x[x.length-1-i]);
}
}
}
注:
- 陸軍、海軍和空軍都是空介面,僅起到標簽作用
- 介面中的attack()方法不是抽象方法,有預設實作,子類可以不重寫
- 通過instanceof來判斷兵種的具體型別,并在attack()中進行強制型別轉換
PCI
/*展示介面實作“功能擴展”
【需求】主板預留PCI插槽,不可能知道該插槽將插裝什么硬體,
主板做的事情只能是:加電、啟動、run、停止,主板類預留5個PCI插槽,如何實作?
提示:5個插槽,就是5個變數,
* */
interface PCI {
void start();
void run();
void stop();
}
class NetCard implements PCI{
public void start() {System.out.print("\n網卡啟動 ");}
public void run() {System.out.print("網卡運行");}
public void stop() {System.out.print("\n網卡停止");}
}
class SoundCard implements PCI{
public void start() {System.out.print("\n聲卡啟動 ");}
public void run() {System.out.print("聲卡運行");}
public void stop() {System.out.print("\n聲卡停止");}
}
class DisplayCard implements PCI{
public void start() {System.out.print("\n顯卡啟動 ");}
public void run() {System.out.print("顯卡運行");}
public void stop() {System.out.print("\n顯卡停止");}
}
class MainBoard{
PCI[] pci = new PCI[5];
public void add(PCI x) {
for(int i = 0;i<pci.length;i++)
if(pci[i] == null){
pci[i] = x;
return;
}
System.out.print("插槽已滿!");
}
public void start() {
for(int i = 0;i<pci.length;i++)
if(pci[i] != null) {
pci[i].start();
pci[i].run();
}
}
public void stop() {
for(int i = 0;i<pci.length;i++)
if(pci[i] != null) pci[i].stop();
}
}
class Computer{
MainBoard mb = new MainBoard();//電腦中有一塊主板,主板插裝何種板卡通過引數傳入
Computer(PCI[] x){
for(int i = 0;i<x.length;i++) {
mb.add(x[i]);//依次將PCI板卡插入主板
}
}
void start() {mb.start();}
void stop() {mb.stop();}
}
class App5{
public static void main(String[] args) {
PCI[] pci = {new NetCard(),new SoundCard(),new DisplayCard()};
Computer c = new Computer(pci);
c.start();c.stop();
}
}
互斥
/*執行緒類T定義方式為:class T implements Runnable{ int data; ...}
執行緒體實作依次輸出data的1~10倍資料,
在main中,構造和啟動執行緒的方式形如: T t=new T(2); t.start();
構造data分別為2、3、5的執行緒,執行緒名分別為t2、t3、t5,要求:t2、t3、t5分3行輸出,且輸出結果不得交叉,
* */
class D{
int x;
}
class T implements Runnable {
D d;
int data;
Thread t;
T(int x,D y){
data = x;
d = y;
t = new Thread(this);
}
public void run() {
synchronized(d) {
for(int i = 1;i<=10;i++) {
System.out.print(data*i + " ");
}
System.out.println();
}
}
void join() {
try {t.join();}catch(Exception e) {;}
}
void start() {
t.start();
}
}
class App6{
public static void main(String[] args) {
System.out.println("main執行緒開始");
D d = new D();
T t2 = new T(2,d);
T t3 = new T(3,d);
T t5 = new T(5,d);
t2.start();t3.start();t5.start();
t2.join();t3.join();t5.join();
System.out.println("main執行緒結束");
}
}
注:
- 類D僅用來充當物件鎖和共享資源,所以不同執行緒傳入的D要相同
- 該程式中join()用于讓main執行緒在t2、t3和t5執行緒結束后結束
- t2、t3和t5并不是執行緒物件,但其內部包含執行緒物件
同步
/*執行緒類T定義方式為:class T implements Runnable{ int data; ...}
執行緒體實作依次輸出data的1~10倍資料,
在main中,構造和啟動執行緒的方式形如: T t=new T(2); t.start();
構造data分別為2、3、5的執行緒,執行緒名分別為t2、t3、t5,要求:t2、t3、t5輸出結果按2 3 5 4 6 10...特定順序輸出,
* */
class Flag{
private int flag = 0;
void ChangeFlag(int x,int y) {
while(flag!=x) try {wait();}catch(Exception e) {;}
flag = y;notifyAll();
}
}
class Th implements Runnable{
private Flag flag;
int data,x,y;
Thread t;
Th(int h,int m,int n,Flag f){
t = new Thread(this);
data = h;flag = f;x = m;y = n;
}
public void run() {
synchronized(flag) {
for(int i = 1;i<=10;i++) {
try {Thread.sleep(1000);}catch(Exception e) {}
flag.ChangeFlag(x, y);
System.out.print(data*i + " ");
}
}
}
void start() {t.start();}
}
class App7{
public static void main(String[] args) {
Flag f = new Flag();
Th t2 = new Th(2,0,1,f);
Th t3 = new Th(3,1,2,f);
Th t5 = new Th(5,2,0,f);
t2.start();t3.start();t5.start();
}
}
注:
- Flag類用于狀態標志不同執行緒的執行順序,如果輪到t2執行,則將狀態改為下一個執行執行緒的狀態,并喚醒所有執行緒,否則等待
- 判斷標志時不能用if,因為可能會存在偽喚醒,放在回圈體中可避免這種情形
- 執行緒定義中的建構式需要傳入四個值:要進行操作的資料、當前狀態、下一個狀態、共享資源
委托事件處理模型
/*做一個簡單的計算器,[1][+][2]=[3],[]為文本框,點擊=按鈕計算出結果,最后一個文本框不可點擊(enable(false)),并借助標簽顯示出錯資訊
* a.當運算元文本框/運算子文本框中的字串,在剔除首尾空格后,若字串長度為0,則拋出自定義例外NoneException,提示“運算元為空”/“運算子為空”
* b.當運算子框中的字串s剔除首尾空格(s.trim())后,若包含多個字符/不是+-* /等字符時拋出自定義例外OpCharException,提示“運算子過多”/“無法識別的運算子”
* c.對Double.parseDouble(s),如果無法將s轉換成正確的double值,若s是“1.2.3”、“a.b”、“a3b”或是轉換后的數值越界時,將拋出非檢查型例外NumberFormatException,
* 提示“資料格式有錯”;產生除零錯時將拋出非檢查型例外ArithmeticException,提示“除零錯”
*/
import java.awt.*;import java.awt.event.*;import javax.swing.*;
class NoneException extends Exception{
public NoneException(String msg){super(msg);}
}
class OpCharException extends Exception{
public OpCharException(String msg){super(msg);}
}
public class GUI extends JFrame implements ActionListener {
private JTextField op1,op2,opchar,result;//對應運算元1、2、運算子、運算結果
private JButton bt_eq;//=按鈕
private JLabel t_la;//顯示錯誤資訊
public GUI(){
super("計算器");
setSize(500,100);
setLocation(500,500);
setLayout(new FlowLayout());
op1 = new JTextField(5); add(op1);
opchar = new JTextField(2); add(opchar);
op2 = new JTextField(5); add(op2);
bt_eq = new JButton("="); add(bt_eq);
result = new JTextField(5);
result.setEnabled(false);
add(result);
t_la = new JLabel(" ");
add(t_la);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //設定點擊關閉按鈕
bt_eq.addActionListener(this);
}
private double getDouble(JTextField jf,int num) throws NoneException{
//檢測jf是否為合法的運算元
String s = jf.getText().trim();double val;
if(s.length() == 0) throw new NoneException("第"+ num + "個運算元為空");
try {
val = Double.parseDouble(s);
}catch(NumberFormatException e) {
throw new NumberFormatException("第"+ num + "個運算元格式有錯");
}
return val;
}
private char getOpChar(JTextField jf) throws NoneException,OpCharException{
//檢測jf是否為合法的運算子
String s = jf.getText().trim();
if(s.length()==0) throw new NoneException("運算子為空");
if(s.length()>1) throw new OpCharException("運算子過多");
if("+-*/".indexOf(s)<0) throw new OpCharException("無法識別的運算子");
return s.charAt(0);//回傳字串第0位置的字符
}
private double compute(double a,double b,char op) {
//進行運算
if(b==0 && op == '/') throw new ArithmeticException("除零錯");
if(op == '+') return a+b;
if(op == '-') return a-b;
if(op == '*') return a*b;
if(op == '/') return a/b;
return -1;//實際上為通過編譯而設定
}
public void actionPerformed(ActionEvent e) {
double x,y;
char z;
// if(e.getCommand() == bt_eq) {
if(e.getActionCommand().equals("=")) {//確定事件源的兩種寫法
try {
x = getDouble(op1,1);y = getDouble(op2,2);z = getOpChar(opchar);
result.setText(compute(x,y,z)+"");
}
catch(Exception c) {
result.setText(" ");
t_la.setText(c.getMessage());
}
}
}
}
class App8{
public static void main(String[] args) {new GUI();}
}
注:
- 自定義例外類必須是Throwable類的子類,一般以Exception作為超類,且可以通過super()將出錯資訊傳給超類,Exception類也可以通過getMessage()方法顯示出錯資訊
- 委托事件處理模型:
- 處理者(GUI物件)要實作ActionListener介面
- 類中要重寫介面中的actionPerformed()方法,方法中的引數為ActionEvent,在該方法中執行處理程序
- 將事件源(bt_eq按鈕)與處理者相關聯(通過addActionListener()方法)
- 將處理程序分成多個部分,使處理程序更加清晰
- “±* /”.indexOf(s)回傳的是指定子字串s在字串"±*/"中第一次出現處的索引
復制檔案
逐個字符讀/寫檔案
public class FileCopy {
public static void main(String[] args) {
File inF = new File("a.txt");//關聯當前檔案夾中的檔案a.txt,作為讀出源頭
File outF = new File("b.txt");//關聯當前檔案夾中的檔案b.txt,作為寫入目標
try {
int ch;
FileReader in = new FileReader(inF);//建立閱讀器物件in
FileWriter out = new FileWriter(outF);
System.out.println("檔案開始復制");
while((ch = in.read())!=-1)
out.write(ch);//從流in中讀取字符ch并寫入流out
in.close();out.close();//關閉流,釋放相關資源
System.out.println("檔案復制結束");
}catch(FileNotFoundException e) {
System.out.println("檔案未找到!\n" + e);
}catch(IOException e) {
System.out.println("File read error!\n" + e);
}
}
}
注:
- a.txt要和src放在同一目錄下,否則會找不到檔案,當然也可以用絕對路徑
按字符流整體讀/寫檔案
public class FileCopy {
public static void main(String[] args) {
File inF = new File("a.txt");
File outF = new File("c.txt");
char[] ca = new char[(int)inF.length()];
try {
FileReader in = new FileReader(inF);
FileWriter out = new FileWriter(outF);
System.out.println("檔案開始復制");
in.read(ca);out.write(ca);
in.close();out.close();
System.out.println("檔案復制結束");
}catch(FileNotFoundException e) {
System.out.println("檔案未找到!\n" + e);
}catch(IOException e) {
System.out.println("File read error!\n" + e);
}
}
}
基于緩沖區讀/寫檔案
public class FileCopy {
public static void main(String[] args) {
String s;
File inF = new File("a.txt");
File outF = new File("d.txt");
try {
FileReader in = new FileReader(inF);
FileWriter out = new FileWriter(outF);
BufferedReader br = new BufferedReader(in);
BufferedWriter bw = new BufferedWriter(out);
System.out.println("檔案開始復制");
while((s = br.readLine()) !=null) {//讀取一行,并賦值給字串s
bw.write(s,0,s.length());//將s中從0至s.length()的所有字串寫入bw
bw.newLine();//添加行分隔符
}
br.close();bw.close();
System.out.println("檔案復制結束");
}catch(FileNotFoundException e) {
System.out.println("檔案未找到!\n" + e);
}catch(IOException e) {
System.out.println("File read error!\n" + e);
}
}
}
防止出現亂碼
class Utf_8_to_GBK {
public static void main(String args[] ){
BufferedReader br=null;
BufferedWriter bw=null;
String s;
try{ //按UTF-8格式讀,按GBK格式寫
br=new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), "UTF-8"));
bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e.txt"), "GBK"));
System.out.println("檔案開始復制");
while((s=br.readLine())!=null){
bw.write(s,0,s.length());
bw.newLine();
}
br.close(); bw.close();
System.out.println("檔案復制結束");
}
catch(UnsupportedEncodingException e){ System.out.println("不支持的編碼格式!\n"+e); }
catch(FileNotFoundException e){ System.out.println("檔案沒找到!\n"+e); }
catch(IOException e){ System.out.println("File read error!\n"+e); }
}
}
序列化與反序列化
import java.io.*;
class C{
public int x;
}
class B{
public int x;
public C c;
public B(int n,C c1) {x = n;c = c1;}
}
class A implements Serializable{
int x;
transient B b;//b參考物件將不被序列化
}
class ReadObject{
public static void main(String[] args) {
C c = new C();A a =new A();a.x = 10;a.b = new B(5,c);
System.out.println("序列化前 a.b.x=" + a.b.x);
A new_a = null;
try {
FileOutputStream fo = new FileOutputStream("serialObj.bat");
ObjectOutputStream obj_o = new ObjectOutputStream(fo);
obj_o.writeObject(a);obj_o.close();
FileInputStream fi = new FileInputStream("serialObj.bat");
ObjectInputStream obj_i = new ObjectInputStream(fi);
new_a = (A)obj_i.readObject();obj_i.close();
}catch(Exception e) {e.printStackTrace();}
System.out.print("恢復物件 new_a.b.x=" + new_a.b.x);
}
}
注:
- 本例將產生空指標例外,因為未對B物件序列化,在恢復時就沒有創建相應的物件,當參考該屬性域時會出錯
- transient是成員修飾符,不能修飾類
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/246821.html
標籤:java
上一篇:可變引數串列“...“
