⑴ Java中怎麼讓子類通過父類的方法去調用子類的方法
子類的對象在調用方法時,先在子類中查找,若方法不存在,則到父類中進行查找。
在調用父類中的方法時,在方法中繼續調用方法,對這個方法的調用者為子類對象,還是按照上面的步驟尋找方法。
所以,子類在調用方法時,調用的都是本類方法,沒有這個方法時,再調用父類中的方法。
⑵ java父類調用子類方法
//保存為Shape.java
import java.util.ArrayList;
public abstract class Shape {
public abstract void draw();
public static void main(String[] args) {
ArrayList shapes = new ArrayList();
shapes.add(new Square());
// shapes.add(new Shape()); // ERROR ONE
((Square)shapes.get(0)).draw();
// shapes.get(0).draw(); // ERROR TWO
}
}
//保存為Square.java
public class Square extends Shape {
public void draw () {
System.out.println("The square is being drawn.");
}
}
⑶ java指向子類的父類對象到底能不能調用子類的方法
你這個問題你問的沒有太明確,我來大概解釋一下吧。
首先你要知道多態的概念,有編譯時多態(前期綁定),還有運行時多態(後期綁定),注意:C語言中只有編譯時多態,但是java兩者都有,java中除了static方法和final方法,其他所有的方法都是後期綁定,類成員變數也是前期綁定的,如果你對java的類初始化順序有所了解就會明白,所以我們寫程序的時候不必去指定是否應該去進行後期綁定,它是自動進行的
注意只有普通方法才可以是多態的,java中類的final方法,static方法,類成員變數,都是在編譯的時候已經確定的,如果用父類引用指向子類對象,那麼你可以自行代碼測試,結論如下:
1.通過父類引用調用子類中重寫父類的方法,那麼會調用子類的重寫方法,
2.通過父類引用調用子類中獨有的方法,那麼必須把父類引用強制轉化成子類類型的引用才能進行調用。
3.通過父類引用調用子類重寫父類的靜態方法(子類中的這個方法和父類中的這個方法返修飾符,返回類型,方法名,參數列表完全相同,假定認為靜態方法也可以重寫吧),通過父類引用調用靜態方法,不會有多態的特徵,調用的還是父類的靜態方法,因為java中靜態方法和類是綁定的,而不是和單個對象綁定的。
4.通過父類引用調用子類和父類中同名的public變數,那麼調用的是父類的成員變數,因為當子類對象轉型為父類引用的時候,訪問局部變數的操作都由編譯器解析,因此不是多態的。子類對象中包含了兩個同名的public變數(debug的時候你會看到子類對象中有兩個變數),他自己的和他從父類得到的,所以通過父類引用指向子類對象而調用父類和子類同名的public 變數,那麼會調用父類的public變數,而不是子類的public變數,因為是前期綁定,編譯時候已經確定了調用哪一個,而不是通過父類引動態地選擇用到底該調用哪一個變數。
反正記住一點,如果父類引用指向了子類對象,那麼通過父類引用調用子類重寫父類的普通方法,那麼可以直接調用,如果通過父類引用調用子類獨有的方法那麼就得強制轉換。
⑷ java 子類重寫了一個方法,如何在父類中調用
java子類繼承父類、方法的重寫(覆蓋)在程序中,如果想聲明一個類繼承另一個類,需要使用extends關鍵字。格式:class子類 extends父類
⑸ java父類對象可以調用子類獨有的方法嗎
可以的,要子類重寫父類方法
packagedisruptor.demo2;
/**
*Createdbyhcqon2017/6/1.
*/
publicabstractclassFather{
privateStringname;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidsysf(){
sysout();
}
publicabstractvoidsysout();
}
這個是父類,注意sysout()是虛擬方法
packagedisruptor.demo2;
/**
*Createdbyhcqon2017/6/1.
*/
publicclassSonextendsFather{
@Override
publicvoidsysout(){
System.out.println(getName());
}
}
這個是子類重寫了父類的sysout()方法
packagedisruptor.demo2;
/**
*Createdbyhcqon2017/6/1.
*/
publicclassSonTest{
publicstaticvoidmain(String[]args){
Fatherfather=newSon();
father.setName("123");
father.sysf();
father.sysout();
}
}
這個是測試類,首先對象一定是子類的對象,子類沒有的方法調用父類的,父類調子類的方法要先定義一遍
⑹ Java中父類調用子類地方法
餓 一樓不要誤人子弟啊 那個方法不行的
用父類的引用創造子類對象時(new),只能訪問子類所重寫(overwrite)的方法,父類不存在的方法是不可以訪問的。