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类型

解决方案 »

  1.   

    p=(PrinterObject)objects.elementAt(i);
    这时候p是PrinterObject的一个子类的实例变量。
      

  2.   

    作为抽象类,肯定不能实例化,但是引用是可以的。看下面的代码。
    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方法了。子类可以完全当作父类来使用,这也就是你将子类造型成父类,是永远正确的,不会出现运行期错误的。
      

  3.   

    1.可是我一直没找到在类DrawOut 中有extends PrinterObject 的地方2.抽象类 PrinterObject 中的方法本来是抽象的,没用任何实作
      p.draw(g2,pt),这样表示什么意义?
      

  4.   

    声明这样的对象是可以的,但是不能这么做:
    PrinterObject p = new PrinterObject();
    但是p可以用来指向他的子类的实例,比如说subClass extends PrintObject
    那么p就可以指向subClass的实例。这时候你可以用p来引用PrintObject中已经声明过的方法,但不可以引用subClass中特有的方法。明白了么?
      

  5.   

    以上诸位道兄所讲述的关于抽象类问题,所言不虚,  lesn (非色)兄可能没注意到这样一个问题,同一段功能的代码可能有不同的表达,如果你在编程过程中多多注意这一类问题,以后就会少一些疑问了
      

  6.   

    abstract class 鱼 
    {
    abstract void 游泳();
    }class 鲤鱼 extends 鱼 
    {
      void 游泳(){仰泳;}
    }
    class 鲨鱼 extends 鱼 
    {
      void 游泳(){潜泳;}
    }鱼 某鱼1=new 鲤鱼();
    鱼 某鱼2=new 鲨鱼();
    某鱼1.游泳();
    某鱼2.游泳();
    这里虽然都是调用游泳(),但是具体的游法 就不一样了,明白了马?
      

  7.   

    zephyr_zhao(zephyr)  同志说得对啊。当然了,在这里,其实,完整的定义应该还广一些:
    public interface 会游的 {
      public  void 游泳();
    }public abstract class 鱼 implements 会游的{
    }现在,就可以变化了。比如: 
    public class 会游的人 extend 人 implements 会游的 {
      public void 游泳(){
       ;//这个东东会多种游法的,最好再详细分一下。比如,有个游泳类的factory,然后,用这个东东生成一个实例,当然,可能是仰泳,可能是潜泳什么的了。
      }
    }
    使用的时候,就可以这样了:
    会游的 会游的东东1 = new 鲤鱼();
    会游的 会游的东东2 = new 会游的人();
    会游的东东1.游泳();
    会游的东东2.泳();这样,可以做出什么会游的鸡啊,鸭啊什么的了。(不要笑鸡不会游啊。我说它会它就一定会,实在不会的时候,扔个 这只鸡不会游泳异常 .
      

  8.   

    各位兄弟所言极是。我也看到你们每个人都给抽象类添加了子类,在子类实现了抽象类的的抽象方法,但我所提的问题是:在我例子中没有找到抽象类的的子类--对抽象类的抽象方法作实作,再看下面这个例子:
    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里的一个抽象方法。各位大侠,你从这个类里看到有这个方法的实作吗?难道在外
    面某个地方有个子类?谢谢!
         
         
         
      

  9.   

    g2d是由Graphiscs 实例转换来的,所以,用g.scale(double,double)来完成这个操作.当然,Graphics 本身可能是由子类来完成这个操作的 .只是,你的代码里有把父类强制转换成子类的操作,要小心哦.
      

  10.   

    如果你真的想知道,你可以用g2d.getClass().getName();来知道真正的 class名字,在那里,你会找到实现的。
      

  11.   

    这是<<Java专业编程里的例子>>,至于父类强制转换成子类的操作,我不也很清楚
    是不是很好;楼上兄弟说的g2d.getClass.getName(),就可以知道实现scale(double,double)的子类吗?