日期:2014-05-20  浏览次数:20775 次

菜鸟求解
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

import javax.swing.JOptionPane;


public class P404 extends Applet{
public void paint(Graphics g){

String input =
JOptionPane.showInputDialog("Tell me the radius please");
double r=Double.parseDouble(input);

Graphics2D src = (Graphics2D) g;
Ellipse2D.Double frontWheel =
new Ellipse2D.Double(0,0,2*r,2*r);
src.draw(frontWheel);

}
}
代码中红色的部分应该是向下转型。。请问在这里是安全的还是危险的?为什么?
代码中蓝色的部分调用了draw方法,但是我发现他是一个抽象方法,请问它是这么变成实体方法的呢?
谢谢各位高手解答,祝新年快乐

------解决方案--------------------
首先回答你向下转型(将基类强转转型为子类):这种做法肯定会有安全问题的,要是穿的对象不是这种类型的话,必抛类型转换异常:java.lang.ClassCastException
举个例子:(天津人→中国人→人类)这三者关系
人类是基类,中国人、天津人都是人类的子类,用人类去实例化中国人或是天津人对象肯定没问题,但是要是反过来,你要是把中国人非要说成是天津人,这个就不一定了吧?中国人还有其他省份的人呢
其次,draw方法,在真正运行的时候到底是有谁去实现的问题:
Graphics2D→Graphics→Object
上述三个类都是抽象类,draw也是抽象方法,那么这个方法的实现到底在哪呢?
兄台,请看你的方法接口public void paint(Graphics g),参数是Graphics ,这个就是问题的关键,你调用该方法的时候传入的Graphics对象肯定是Graphics的子类或是本身,所有draw方法肯定是在这个类里有具体实现
举个例子:
 BufferedImage tag = new BufferedImage(100 / 2, 200 / 2, BufferedImage.TYPE_INT_RGB);
// 绘制缩小后的图
 tag.getGraphics().drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); 
BufferedImage提供getGraphics()返回一个Graphics对象,可以直接当参数传入,具体实现你可以debug跟进去




------解决方案--------------------
向下转型要注意类型安全,当然在这里是安全的。不知楼主注意了没,无论是Graphics,还是Graphics2D,都是抽象类,实际上在JVM中加载的是sun.java2d.SunGraphics2D类,在这个类中实现了draw方法。你可以debug进去看看
------解决方案--------------------
探讨
代码中红色的部分应该是向下转型。。请问在这里是安全的还是危险的?为什么?
代码中蓝色的部分调用了draw方法,但是我发现他是一个抽象方法,请问它是这么变成实体方法的呢?