PrinterObject p; //可以这样定义抽象类的对象吗? 可以
但不可以p=new PrinterObject();必然有SubClassA extends PrinterObject;
SubClassA sa=new SubClassA();
objects.add(sa);
之类的代码p=(PrinterObject)objects.elementAt(i);
objects.elementAt(i)已经得到instance了,(PrinterObject)objects.elementAt(i)把instance转成PrinterObject类型
但不可以p=new PrinterObject();必然有SubClassA extends PrinterObject;
SubClassA sa=new SubClassA();
objects.add(sa);
之类的代码p=(PrinterObject)objects.elementAt(i);
objects.elementAt(i)已经得到instance了,(PrinterObject)objects.elementAt(i)把instance转成PrinterObject类型
这时候p是PrinterObject的一个子类的实例变量。
class MyPrinter extends PrinterObject {
public void draw(Graphics g,Point p){
System.out.print("myPrinter");
}
}PrinterObject po = new MyPrinter(); //这是可以的,因为MyPrinter继承了PrinterObject,所以这是允许的。po.draw(g2,pt)
自然你在使用PrinterObject时,使用的具体的某一个子类,由于子类已经把抽象方法具体化了,所以就可以调用了。上述例子中就会调用MyPrinter中的draw方法了。子类可以完全当作父类来使用,这也就是你将子类造型成父类,是永远正确的,不会出现运行期错误的。
p.draw(g2,pt),这样表示什么意义?
PrinterObject p = new PrinterObject();
但是p可以用来指向他的子类的实例,比如说subClass extends PrintObject
那么p就可以指向subClass的实例。这时候你可以用p来引用PrintObject中已经声明过的方法,但不可以引用subClass中特有的方法。明白了么?
{
abstract void 游泳();
}class 鲤鱼 extends 鱼
{
void 游泳(){仰泳;}
}
class 鲨鱼 extends 鱼
{
void 游泳(){潜泳;}
}鱼 某鱼1=new 鲤鱼();
鱼 某鱼2=new 鲨鱼();
某鱼1.游泳();
某鱼2.游泳();
这里虽然都是调用游泳(),但是具体的游法 就不一样了,明白了马?
public interface 会游的 {
public void 游泳();
}public abstract class 鱼 implements 会游的{
}现在,就可以变化了。比如:
public class 会游的人 extend 人 implements 会游的 {
public void 游泳(){
;//这个东东会多种游法的,最好再详细分一下。比如,有个游泳类的factory,然后,用这个东东生成一个实例,当然,可能是仰泳,可能是潜泳什么的了。
}
}
使用的时候,就可以这样了:
会游的 会游的东东1 = new 鲤鱼();
会游的 会游的东东2 = new 会游的人();
会游的东东1.游泳();
会游的东东2.泳();这样,可以做出什么会游的鸡啊,鸭啊什么的了。(不要笑鸡不会游啊。我说它会它就一定会,实在不会的时候,扔个 这只鸡不会游泳异常 .
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
import java.swing.table.*;public class TablePrinter implements Printable{
protected JTable table;
public TablePrinter(JTable tbl){
table=tbl;
}
public int print(Graphics g,PageFormat pf,int index){
if(index==0){
g.translate((int)(pf.getImageableX()),(int)(pf.getImageabl()));
Graphics2D g2d=(Graphics2D)g;
double pageWidth=pf.getImageableWidth();
double pageHeight=pf.getImageableHeight();
double tableWidth=table.getWidth();
double tableHeight=table.getHeight();
double scaleX=pageWidth/tableWidth;
double scaleY=pageHeigth/tableWidth;
double scaleFactor=Math.min(ScaleX.scaleY);
g2d.scale(scaleFactor,scaleFactor); // 问题的关键??
table.paint();
return Printable.PAGE_EXISTS;
}
return Printable.NO_SUCH_PAGE;
}
}这是一个完整的类,scale(scaleFactor,scaleFactor)是抽象类Graphics2D里的一个抽象方法。各位大侠,你从这个类里看到有这个方法的实作吗?难道在外
面某个地方有个子类?谢谢!
是不是很好;楼上兄弟说的g2d.getClass.getName(),就可以知道实现scale(double,double)的子类吗?