抽象类就是有方法到子类中实现。
接口是抽象类的一种扩展。
其实这就是oo语言的一种优势。精华。
很多了。到google搜索吧。

解决方案 »

  1.   

    “造型”(Cast)的作用是“与一个模型匹配”。在适当的时候,Java会将一种数据类型自动转换成另一种。例如,假设我们为浮点变量分配一个整数值,计算机会将int自动转换成float。通过造型,我们可明确设置这种类型的转换,或者在一般没有可能进行的时候强迫它进行。
    为进行一次造型,要将括号中希望的数据类型(包括所有修改符)置于其他任何值的左侧。下面是一个例子:void casts() {
    int i = 200;
    long l = (long)i;
    long l2 = (long)200;
    }正如您看到的那样,既可对一个数值进行造型处理,亦可对一个变量进行造型处理。但在这儿展示的两种情况下,造型均是多余的,因为编译器在必要的时候会自动进行int值到long值的转换。当然,仍然可以设置一个造型,提醒自己留意,也使程序更清楚。在其他情况下,造型只有在代码编译时才显出重要性。
      

  2.   

    抽象类和方法
    在我们所有乐器(Instrument)例子中,基础类Instrument内的方法都肯定是“伪”方法。若去调用这些方法,就会出现错误。那是由于Instrument的意图是为从它衍生出去的所有类都创建一个通用接口。
    之所以要建立这个通用接口,唯一的原因就是它能为不同的子类型作出不同的表示。它为我们建立了一种基本形式,使我们能定义在所有衍生类里“通用”的一些东西。为阐述这个观念,另一个方法是把Instrument称为“抽象基础类”(简称“抽象类”)。若想通过该通用接口处理一系列类,就需要创建一个抽象类。对所有与基础类声明的签名相符的衍生类方法,都可以通过动态绑定机制进行调用(然而,正如上一节指出的那样,如果方法名与基础类相同,但自变量或参数不同,就会出现过载现象,那或许并非我们所愿意的)。
    如果有一个象Instrument那样的抽象类,那个类的对象几乎肯定没有什么意义。换言之,Instrument的作用仅仅是表达接口,而不是表达一些具体的实施细节。所以创建一个Instrument对象是没有意义的,而且我们通常都应禁止用户那样做。为达到这个目的,可令Instrument内的所有方法都显示出错消息。但这样做会延迟信息到运行期,并要求在用户那一面进行彻底、可靠的测试。无论如何,最好的方法都是在编译期间捕捉到问题。
    针对这个问题,Java专门提供了一种机制,名为“抽象方法”。它属于一种不完整的方法,只含有一个声明,没有方法主体。下面是抽象方法声明时采用的语法:
    abstract void X();
    包含了抽象方法的一个类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。否则,编译器会向我们报告一条出错消息。
    若一个抽象类是不完整的,那么一旦有人试图生成那个类的一个对象,编译器又会采取什么行动呢?由于不能安全地为一个抽象类创建属于它的对象,所以会从编译器那里获得一条出错提示。通过这种方法,编译器可保证抽象类的“纯洁性”,我们不必担心会误用它。
    如果从一个抽象类继承,而且想生成新类型的一个对象,就必须为基础类中的所有抽象方法提供方法定义。如果不这样做(完全可以选择不做),则衍生类也会是抽象的,而且编译器会强迫我们用abstract关键字标志那个类的“抽象”本质。
    即使不包括任何abstract方法,亦可将一个类声明成“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。
    Instrument类可很轻松地转换成一个抽象类。只有其中一部分方法会变成抽象方法,因为使一个类抽象以后,并不会强迫我们将它的所有方法都同时变成抽象。
      

  3.   

    谢谢 alphazhao(绿色咖啡) :能在帮忙讲解一下接口,抽象类的区别吗?(实际应用中)什么时候应该用接口,什么时候用抽象类??
      

  4.   

    接口
    “interface”(接口)关键字使抽象的概念更深入了一层。我们可将其想象为一个“纯”抽象类。它允许创建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数据类型的数据成员,但它们都默认为static和final。接口只提供一种形式,并不提供实施的细节。
    接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在这个样子”。因此,采用了一个特定接口的所有代码都知道对于那个接口可能会调用什么方法。这便是接口的全部含义。所以我们常把接口用于建立类和类之间的一个“协议”。有些面向对象的程序设计语言采用了一个名为“protocol”(协议)的关键字,它做的便是与接口相同的事情。
    为创建一个接口,请使用interface关键字,而不要用class。与类相似,我们可在interface关键字的前面增加一个public关键字(但只有接口定义于同名的一个文件内);或者将其省略,营造一种“友好的”状态。
    为了生成与一个特定的接口(或一组接口)相符的类,要使用implements(实现)关键字。我们要表达的意思是“接口看起来就象那个样子,这儿是它具体的工作细节”。除这些之外,我们其他的工作都与继承极为相似。
    具体实现了一个接口以后,就获得了一个普通的类,可用标准方式对其进行扩展。
    可决定将一个接口中的方法声明明确定义为“public”。但即便不明确定义,它们也会默认为public。所以在实现一个接口的时候,来自接口的方法必须定义成public。否则的话,它们会默认为“友好的”,而且会限制我们在继承过程中对一个方法的访问——Java编译器不允许我们那样做。
    在Instrument例子的修改版本中,大家可明确地看出这一点。注意接口中的每个方法都严格地是一个声明,它是编译器唯一允许的。除此以外,Instrument5中没有一个方法被声明为public,但它们都会自动获得public属性。如下所示://: Music5.java
    // Interfaces
    import java.util.*;interface Instrument5 {
      // Compile-time constant:
      int i = 5; // static & final
      // Cannot have method definitions:
      void play(); // Automatically public
      String what();
      void adjust();
    }class Wind5 implements Instrument5 {
      public void play() {
        System.out.println("Wind5.play()");
      }
      public String what() { return "Wind5"; }
      public void adjust() {}
    }class Percussion5 implements Instrument5 {
      public void play() {
        System.out.println("Percussion5.play()");
      }
      public String what() { return "Percussion5"; }
      public void adjust() {}
    }class Stringed5 implements Instrument5 {
      public void play() {
        System.out.println("Stringed5.play()");
      }
      public String what() { return "Stringed5"; }
      public void adjust() {}
    }class Brass5 extends Wind5 {
      public void play() {
        System.out.println("Brass5.play()");
      }
      public void adjust() { 
        System.out.println("Brass5.adjust()");
      }
    }class Woodwind5 extends Wind5 {
      public void play() {
        System.out.println("Woodwind5.play()");
      }
      public String what() { return "Woodwind5"; }
    }public class Music5 {
      // Doesn't care about type, so new types
      // added to the system still work right:
      static void tune(Instrument5 i) {
        // ...
        i.play();
      }
      static void tuneAll(Instrument5[] e) {
        for(int i = 0; i < e.length; i++)
          tune(e[i]);
      }
      public static void main(String[] args) {
        Instrument5[] orchestra = new Instrument5[5];
        int i = 0;
        // Upcasting during addition to the array:
        orchestra[i++] = new Wind5();
        orchestra[i++] = new Percussion5();
        orchestra[i++] = new Stringed5();
        orchestra[i++] = new Brass5();
        orchestra[i++] = new Woodwind5();
        tuneAll(orchestra);
      }
    } ///:~代码剩余的部分按相同的方式工作。我们可以自由决定上溯造型到一个名为Instrument5的“普通”类,一个名为Instrument5的“抽象”类,或者一个名为Instrument5的“接口”。所有行为都是相同的。事实上,我们在tune()方法中可以发现没有任何证据显示Instrument5到底是个“普通”类、“抽象”类还是一个“接口”。这是做是故意的:每种方法都使程序员能对对象的创建与使用进行不同的控制。
      

  5.   

    类似楼上 yakuu(享受孤独)所说
    实际运用的时候,你可以将接口看做是抽象类的一个扩展
    什么时候应该用接口,什么时候用抽象类?
    则需要看你的需求了
    大多时候我只是用到接口,比如与数据库连接时结果集ResultSet interface。至于为什么要用它,它能完成你的需求呗,
    至于抽象类,老实说,我用的不多,个人理解是需要扩展某些特殊需要(即系统不存在满足你需求的基础类或者接口时)才会用到它。=========================================================
    如上所言,并非完全正确,请从建议的角度、用怀疑的眼光批判地接收
      

  6.   

    谢谢 alphazhao(绿色咖啡) ,也谢谢 yakuu(享受孤独) 。
    结账。