多型一
前面的文章簡單的分析了動態繫結機制,http://blog.itpub.net/29876893/viewspace-1816523/,但是也許有很多疑問,下面介紹下子類如何呼叫自己的方法或我們阻止多型。
修改的程式碼如下:
上面在Cat,Dog中新增了新的方法,如果用Animal的引用呼叫這些方法,編譯器會提錯,那如果真想呼叫基類的自定義的方法,則需要強制轉換,把Animal 引用強制轉換成Cat,Dog型別,為了防止出現異常,我們用instanceof來檢查,返回布林型別,具體用法:
boolean result = object instanceof class
Result:布林型別。
Object:必選項。任意物件表示式。
class:必選項。任意已定義的物件類。
如果 object 是 class 的一個例項,則 instanceof 運算子返回 true。如果 object 不是指定類的一個例項,或者 object 是 null,則返回 false。
我們透過instanceof的檢查後,基類可以呼叫自定義的方法
如果把父類中的enjoy()定義為static,private,final,那麼就不會出現多型性,方法被定義指定為private隱式的定義為final,類的設計者不希望該方法被繼承修改。被指明為static時,那麼這個方法就是類的通性,不會隨物件的改變而發生變化,那麼也失去了多型。關於這方面,讀者可以參考<>第八章和<>第五章,有很詳細的介紹。
下面給出一個小例子:
我們想出現的結果是os,但是結果是lios,因為父類中的f()方法在子類中不可見,不會出現多型機制,如果清楚多型機制的話,我想原因一目瞭然。
修改上述程式碼:
輸出結果:
0 os
1 super.i=0
可能對於為什麼列印w.i為0,因為在在new子類物件時,堆內分配兩個不同地址的i,一個是從父類繼承的i,一個是基類中的i,此時父類的引用只指向自己的物件中的成員變數,所以結果如上。其他的都很簡單。
修改的程式碼如下:
點選(此處)摺疊或開啟
-
public class Animal {
-
-
public String name;
-
-
Animal(String name){
-
-
this.name = name;
-
}
-
-
public void enjoy(){
-
-
System.out.println("叫聲...");
-
}
-
-
}
-
-
public class Cat extends Animal {
-
-
private String eyesColor;
-
-
Cat(String n,String c){
-
-
super(n);
-
eyesColor = c;
-
}
-
-
public void enjoy(){
-
-
System.out.println("貓叫聲...");
-
}
-
-
public void catcolor(){
-
-
System.out.println(eyesColor);
-
}
-
}
-
-
-
public class Dog extends Animal{
-
-
private String furColor;
-
-
Dog(String n,String c){
-
-
super(n);
-
furColor = c;
-
}
-
-
public void enjoy(){
-
-
System.out.println("狗叫聲。。。");
-
}
-
-
public void dogfurcolor(){
-
-
System.out.println(furColor);
-
}
-
}
-
-
-
public class Test {
-
-
public void cataddr(Animal per){
-
-
System.out.print(per.name + " ");
-
-
if(per instanceof Cat){
-
-
Cat cat = (Cat)per;
-
-
cat.catcolor();;
-
-
}else if(per instanceof Dog){
-
-
Dog dog = (Dog)per;
-
-
dog.dogfurcolor();
-
}
-
else{
-
-
System.out.println("空值");
-
}
-
}
-
-
public static void main(String[] args){
-
-
Test w = new Test();
-
Cat c = new Cat("catname", "bule");
-
Dog d = new Dog("dogname", "black");
-
w.cataddr(c);
-
w.cataddr(d);
-
}
- }
上面在Cat,Dog中新增了新的方法,如果用Animal的引用呼叫這些方法,編譯器會提錯,那如果真想呼叫基類的自定義的方法,則需要強制轉換,把Animal 引用強制轉換成Cat,Dog型別,為了防止出現異常,我們用instanceof來檢查,返回布林型別,具體用法:
boolean result = object instanceof class
Result:布林型別。
Object:必選項。任意物件表示式。
class:必選項。任意已定義的物件類。
如果 object 是 class 的一個例項,則 instanceof 運算子返回 true。如果 object 不是指定類的一個例項,或者 object 是 null,則返回 false。
我們透過instanceof的檢查後,基類可以呼叫自定義的方法
如果把父類中的enjoy()定義為static,private,final,那麼就不會出現多型性,方法被定義指定為private隱式的定義為final,類的設計者不希望該方法被繼承修改。被指明為static時,那麼這個方法就是類的通性,不會隨物件的改變而發生變化,那麼也失去了多型。關於這方面,讀者可以參考<>第八章和<>第五章,有很詳細的介紹。
下面給出一個小例子:
點選(此處)摺疊或開啟
-
class t {
-
-
private void f(){
-
-
System.out.println("diyjie");
-
}
-
public static void main(String[] args){
-
-
t w = new t1();
-
w.f();
-
}
-
}
-
-
public class t1 extends t{
-
-
public void f(){
-
-
System.out.println("os");
-
}
-
- }
我們想出現的結果是os,但是結果是lios,因為父類中的f()方法在子類中不可見,不會出現多型機制,如果清楚多型機制的話,我想原因一目瞭然。
修改上述程式碼:
點選(此處)摺疊或開啟
-
class t {
-
-
public int i = 0;
-
-
public void f(){
-
-
System.out.println("lios");
-
}
-
}
-
-
public class t1 extends t{
-
-
public int i =1;
-
-
public void geti(){
-
-
System.out.print(super.i);
-
}
-
public void f(){
-
-
System.out.println("os");
-
}
-
-
public static void main(String[] args){
-
-
t w = new t1();
-
System.out.print(w.i + " ");
-
w.f();
-
-
t1 w1 = new t1();
-
System.out.print(w1.i +" "+"super.i=");
-
w1.geti();
-
-
}
-
- }
0 os
1 super.i=0
可能對於為什麼列印w.i為0,因為在在new子類物件時,堆內分配兩個不同地址的i,一個是從父類繼承的i,一個是基類中的i,此時父類的引用只指向自己的物件中的成員變數,所以結果如上。其他的都很簡單。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1816807/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多型。多型
- 多型~多型
- 多型多型
- Java多型Java多型
- 11 #### 多型多型
- 多型性多型
- 多型,向上向下轉型多型
- 多型中的轉型多型
- 什麼是Java多型?如何實現Java多型?Java多型
- 再談多型--多型的應用舉例: (轉)多型
- C++編譯期多型與執行期多型C++編譯多型
- 20-多型多型
- C++多型C++多型
- 多型性概述多型
- C++——多型C++多型
- java多型特性Java多型
- java多型demoJava多型
- 多型的概述多型
- 瞭解多型多型
- Java 的多型Java多型
- 談談多型多型
- OC多型 - OC多型
- 多型的理解多型
- 多型消除if else多型
- java多型-向上轉型和向下轉型Java多型
- [一、基本語法]8stateStyles:多型樣式多型
- 剖析C++多型:用C實現簡單多型C++多型
- 多型體驗,和探索爺爺類指標的多型性多型指標
- 實現多型多對多 幾個注意點多型
- Java多型的一個簡單入門的例子Java多型
- java中的多型Java多型
- 封裝和多型封裝多型
- 多型和抽象類多型抽象
- 封裝,特性,多型封裝多型
- Java學習-多型Java多型
- 小例子理解多型多型
- PHP中有多型麼PHP多型
- C# 多型性C#多型