小弟是初学者,对抽象类有些不理解。
子类必须实现抽象超类中的抽象方法,那么为什么不在子类中直接按特性不同自己写这个方法呢?非要把这方法抽象出来,放在超类中做成抽象类吗?我明白抽象方法是子类共同的特性,但要根据需要做不同的实现,反正都要实现,那在子类里自己根据需要实现自己的方法不就可以了吗?抽象超类仅仅是为了面向对象的意义才要被抽象的吗?还是这个类在抽象方法被实现之前,不想被实例化呢?想来想去也想不明白,希望大大们指教啊,谢谢```

解决方案 »

  1.   

    抽象最大的好处在于实现了OOP中一个重要的特性 多态性
    示例
    //Shapes.javaclass Shape { 
      void draw() {}
      void erase() {} 
    }class Circle extends Shape {
      void draw() { 
        System.out.println("Circle.draw()"); 
      }
      void erase() { 
        System.out.println("Circle.erase()"); 
      }
    }class Square extends Shape {
      void draw() { 
        System.out.println("Square.draw()"); 
      }
      void erase() { 
        System.out.println("Square.erase()"); 
      }
    }class Triangle extends Shape {
      void draw() { 
        System.out.println("Triangle.draw()"); 
      }
      void erase() { 
        System.out.println("Triangle.erase()");
      }
    }public class Shapes {
      public static Shape randShape() {
        switch((int)(Math.random() * 3)) {
          default: // To quiet the compiler
          case 0: return new Circle();
          case 1: return new Square();
          case 2: return new Triangle();
        }
      }
      public static void main(String[] args) {
        Shape[] s = new Shape[3];
        s[0]=new Circle();
        s[1]=new Square();
        s[2]=new Triangle();
        
        s[0].draw();
        s[1].draw();
        s[2].draw();
      }
    }
      

  2.   

    public abstract class Arithmetic{
        private String sum;
        public abstract int getValue(int i,int j);
    }public class Sum extends Arithmetic{
        public Sum(String sum){this.sum=sum;}
        public int getValue(int i,int j){
             return i+j;
        }
    }public class Sub extends Arithmetic{
        public Sub(String sub){this.sub=sub;}
        public int getValue(int i,int j){
             return i-j;
        }
    }Arithmetic暴露了一个抽象方法,你可以知道,但是他的子类如何实现这个方法,你可以毫不关心,上面实现了加法和减法,如果又有别人出了一个实现乘法的子类,你会不会用呢?答案是肯定的
    只要这样用就可以
    Arithmetic a=new 乘法("");
    a.getValue(1,2)最大的好处不就体现在这里了吗?你根本就不用知道乘法是怎么实现的,拿来用就没问题。
    第二就是它可以有多种实现。这样使用起来不是更加灵活吗?
      

  3.   

    多态性!
    打个比方
    抽象父类:交通工具 有一个方法是 去上海
    子类: 飞机 轮船 火车 各用不同方法实现了 去上海当你要去上海,做计划时,只是决定去上海就可以了,至于去时用什么交通工具,看情况决定就行了。
    如果计划定死了,一定要做飞机。结果发生暴风雨,飞机不能飞火车能走,你也只能等飞机。
    交通工具 去上海 = new 火车();
    交通工具 去上海 = new 轮船();
    交通工具 去上海 = new 飞机();
      

  4.   

    有些明白了,多谢大大们指教哈
    初学JAVA总感觉OOP有点怪,继续努力
      

  5.   

    抽象类虽然是抽象的(即不能实例化),但它首先仍然是一个类,既然是类,那就意味着它的子类和它是一种“is a”的关系!
    以下摘自 http://www.cjsdn.net/post/view?bid=29&id=164878
    ---------------------------------------------
    首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为。(为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。)
    ---------------------------------------------