請大佬看下為什么代碼的測試類里不能直接使用多態?
/*這是子類——圓類*/
package?com.imooc; import?java.util.Scanner; public?class?Circle?extends?Shape?{ Scanner?in?=?new?Scanner(System.in); public?void?call(){ System.out.println("現在是計算圓的面積和周長"); System.out.println("請輸入圓的半徑"); double?r=in.nextDouble(); double?Pi=3.14; System.out.println("圓的面積:"+Square(r,Pi)); System.out.println("圓的周長:"+Leng(r,Pi)); } public?double?Square(double?a,?double?b)?{ //?TODO?Auto-generated?method?stub double?S; S=b*a*a; return?S; } public?double?Leng(double?a,?double?b)?{ //?TODO?Auto-generated?method?stub double?l; l=b*2*a; return?l; } }
/*這是子類——矩形類*/
package?com.imooc; import?java.util.Scanner; public?class?Rectangle?extends?Shape?{ Scanner?in?=?new?Scanner(System.in); public?void?call()?{ System.out.println("計算矩形的周長和面積"); System.out.println("請輸入兩條邊長"); double?a?=?in.nextDouble(); double?b?=?in.nextDouble(); System.out.println("矩形的面積是:"+Square(a,b)); System.out.println("矩形的周長是:"+Leng(a,b)); } @Override public?double?Square(double?a,?double?b)?{ //?TODO?Auto-generated?method?stub double?S; S=a*b; return?S; } @Override public?double?Leng(double?a,?double?b)?{ //?TODO?Auto-generated?method?stub double?l; l=2*(a+b); return?l; } }
/*這是父類*/
package?com.imooc; public?abstract?class?Shape?{ public?abstract?double?Square(double?a,double?b); public?abstract?double?Leng(double?a,double?b); }
/*這是測試類*/
package?com.imooc; public?class?Initial?{ public?static?void?main(String[]?args)?{ /*Rectangle?rec?=?new?Rectangle(); rec.call(); Circle?cir?=?new?Circle(); cir.call();*/ //以上方法是可行的 Shape?rec?=?new?Rectangle(); ((Rectangle)?rec).call(); Shape?cir?=?new?Circle(); ((Circle)?cir).call(); }//這個方法也是可行的 }
我主要是想知道為什么以下內容會報錯,必須改成上面那兩種才可以
Shape?rec?=?new?Rectangle(); rec.call(); Shape?cir?=?new?Circle(); cir.call()
2019-05-12
因為你的call方法是子類的方法,不是從父類那兒繼承過來的。然后你最后一種方式定義的對象rec和cir,都是Shape的父類,不具有call方法。