java学习笔记(六)----对象的类型转换, 匿名内置类
對象的類型轉換
--? 子類對象可以自動轉換成父類
--? 父類轉換成子類必須使用強制轉換
--? instanceof操作符可以用它來判一個實例對象是否屬于一個類。
class A
{ public void func1()
? {? System.out.println("A func1 is calling") }
? public void func2()
?? { func1(); }
}
class B extens A
{ public void func1()
? { System.out.println("B func1 is calling");}
? public void func3()
? { System.out.println("B func3 is calling");}
}
class C
{?? public static void main(String[] args)
?? { B.b=new B();
???? callA(b);? //編譯器可以自動將子類轉換為父類
???? A.a=b;?? //可以使父類對象等于子類對象
???? callA(new B());// 編譯器可以自動將子類轉換為父類
?? }
?? public static void callA(A a) //子類對象可以自動轉換成父類
?? { a.func1();
???? a.func2();
???? a.func3(); //如果加這個方法的話,編譯就出錯了,因為傳進來的雖然是類B,但接收數據的是類A,類A中不包含func3的方法
??????????????? //如果將以上callA(A a)中的代碼改為B b=a; b.func1(); b.func2(); b.func3(),這樣的話就出錯了,因為,這樣的話編譯就認為是把A類對象給了B類對象,但是A類中沒有func3的方法,所以編譯出錯了。但可以把 B b=a; 改為B b=(B)a; 用強制類型轉換,這樣就沒錯了,
在這個基礎上,? B b=(B)a;
???????????? b.func1();
???????????? b.func2();
???????????? b.func3();
??????????? 如果把main函數中的callA(new B())改為callA(new A())結果就錯了,但在編譯時沒錯,是在運行時錯的,因為編譯時,B b=(B)a;欺騙了編譯器,沒有語法錯誤,而在A類中沒有func3(),所以是在運行時錯了。????
???
??? 為了解決上面的所有問題,可以將這個方法中的所有代碼,改為以下的代碼:
??????? if(a instanceof B)?? //如果對象a確實是一個類B的對象,就執行下面的語句
????????? { B b=(B)a;?????? //instanceof 判斷一個對象是否是某一個類的實例
???????????? b.func1();
???????????? b.func2();
???????????? b.func3();
?????????? }
??????? else
???????? {a.func1();? //否則就不進行轉換
????????? a.func2();
???????? }
????????????????????????????
???? }
?
equals方法,
class Student
{ private String name;
? private int age;
? public Student(String name,int age)
? { this.name=name;
??? this.age=age;
? }
? public boolean equals(object obj)? //如果不加這個方法,下面的Student對象即使里面的內容都一樣輸出的也是not equals, 因為它們不是相同的對象,但是加上這個方法后,就可以判斷這兩個對象中的內容是否相等。
? {? Student st=null;
???? if (obj instanceof Student)
???? {? st=(Student)obj;
??????? if (st.name=name && st.age=age)
????????? return true;
??????? else
????????? return false;
????? }
????? else
????????? return false;
? }
? public static void main(String[] args)
? { Student st1=new Student("zhangshan",20);
??? Student st2=new Student("wangwu",20);
??? if(st1.equals(st2))
??????? System.out.println("equals");
??? else
??????? System.out.println("not equals");
? }
}?
?
接口的應用??? 匿名內置類
interface PCI
{ void start();
? void stop();
}
class NetWorkCard implements PCI
{ public void start()
? { System.out.println("Send...");}
? public void stop()
? { System.out.println("Stop...");}
}
class SoundCard implements PCI
{ public void start()
? { System.out.println("du..du");}
? public void stop()
? { System.out.println("sound stop"); }
}
class MainBoard
{ public void usePCIcard(PCI p)
? {? p.start();
???? p.stop();
? }
}
class Bb
{ public static void main(String[] args)
? {? MainBoard mb=new MainBoard();
???? NetWorkCard nc=new NetWorkCard();
???? SoundCard sc=new SoundCard();
???? mb.usePCIcard(nc);
???? mb.usePCIcard(sc);
????
???? mb.usePCIcard(new PCI())???????? //匿名內置類? (這里的new PIC()是建立一個PCI的子類對象)
??????? { public void start()
?????????? { System.out.println("text start");}
????????? public void stop()
?????????? { System.out.println("text stop");}
???????? });
??? }
}
? 以上的內置類可以寫成下面型式
? class A implements PCI
? { public void start()
??? { System.out.println("text start");}
??? public void stop()
???? { System.out.println("text stop");}
?? }
?? mb.usePCICard(new A());
總結
以上是生活随笔為你收集整理的java学习笔记(六)----对象的类型转换, 匿名内置类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习笔记(五)----super
- 下一篇: java学习笔记(七)----异常