java抽象类和接口

类——客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议)。把客观世界中的事物映射到面向对象的程序设计中就是对象。将同一类别的对象归纳总结,就构成类。包括属性和方法、构造属性:记录事物的特征(状态)方法:记录了事物的行为;

  例如:学生

             特征:学号、性别、姓名、年龄

             行为:学习、吃饭

public class Student { 

      int id; 

      String name; 

  int age=20; 

  String sex; 

      public void study(String st){ 

     System.out.println(name+"学习了"+st); 

  public String eat(){ 

    return "ok"; 

  public Student(){} 

     public Student(int id,String name,int age,String sex){ 

      this.id=id; 

       This.name=name; 

       This.age=age; 

        this.sex=sex; 

 } 

抽象方法:仅有定义,没有具体实现的方法体

抽象类:含有抽象方法的类,

抽象类有构造,但是无法调用构造,

抽象类中没有对象,抽象方法不能执行,

抽象类的引用,指向非抽象的子类对象(多态),

抽象方法的调用其实是调用重写以后的非抽象方法,

含有抽象方法的类一定是抽象类,当时抽象类中不一定有抽象方法。

抽象类不能被实例化,也就是说,不能有自己的对象

例如:

一个银行系统中的账户,包括定期账户和活期账户,定期账户和活期账户都是基本的账户,

但是它们计算利息的方法不同,需要不同的实现方法,可以将基本账户定义为抽象类

 

public abstract class Acount { 

//基本账户

  private double total=2000; 

  public Acount(){} 

//抽象方法具有强制性、规范性

   public abstract double get(); 

 //抽象方法

   public void setTotal(double total) { 

     this.total = total; 

  } 

  public double getTotal() { 

    return total; 

  } 

 public class HAcount extends Acount { 

 //活期账户

  public double get() { 

    return this.getTotal()*0.02; 

  } 

  public static void main(String[] args){ 

     Acount a=new HAcount(); 

    System.out.println(a.get()); 

   } 

public class StaticAcount extends Acount{ 

//定期账户

  public double get(){ 

    return this.getTotal()*0.03; 

   } 

   public static void main(String[] args){ 

    Acount a=new StaticAcount(); 

  //抽象类的引用指向非抽象子类对象

     System.out.println(a.get()); 

   //抽象方法的调用其实是调用子类重写以后的非抽象方法

  } 

}

声明接口使用关键字“interface”

 接口中一般只包含一组

public抽象方法(且必须是公有抽象方法,但方法定义中public abstract可省略),因此可以将接口看成特殊的抽象类,接口也可以包含public static final数据(一般不写)

Java一个类只能直接继承(extends)另一个类,不允许一个子类继承多个超类,却允许一个子类继承一个超类并实现(implements)多个接口

强制类型转换成接口时,不检测继承关系,但是如果类型不匹配,会在运行时引发类型转异常。

 例如:

 黄金:

 黄金是一种货币

 黄金也是一种金属

 public interface Jinshu { //定义黄金是金属的接口

   /* private */int i=8; //public static final 常量

   void shine(); 

public interface Huobi { 

 //定义黄金是货币的接口

  void change(); 

 public class Gold implements Huobi,Jinshu{ 

  public void shine(){ 

    System.out.println("黄金闪闪发光!"); 

  } 

  public void change(){ 

     System.out.println("黄金可以交换!"); 

  } 

  public static void main(String[] args){ 

     Jinshu js=new Gold(); 

     js.shine(); 

     Huobi hb=new Gold(); 

     hb.change(); 

     System.out.println(js.i); 

  } 

 类、抽象类、接口之间的联系,可以举例如下:

 一个公司,有老板,老板聘的经理,还有员工,

 类就是员工,抽象类就是经理,接口就是老板。

 接口里就是给个方法,

但是他自己不做,

比如老板说我要那个文件,

给我定个机票,

我要那个策划方案等,都是下面人做。老板只说不做。

 

抽象类给的方法,

有的他自己做,

有的其他人做。

比如经理说我要那个文档,

员工就要发给他,但是他自己也要做点事,比如拿方案给老板看。经理又说又做。

一般类给的方法,就是什么都要做,都要实现。

 抽象类和接口之间的区别和联系:

两者都是抽象类,都不能实例化

 Interface实现类和abstract的子类都必须实现已经声明的抽象方法区别:

 一个类只能继承一个抽象类,但是一个类可以实现多个接口

Interface强调的是功能的实现,而abstract class强调的是所属关系

Interface中的方法都是抽象方法,没有方法体,它的实现类中必须包含实现接口的实现方法,而abstract class的子类中可以有选择的实现抽象方法

Interface是完全抽象的,接口中只能声明方法,且必须是用public abstract,不能是private及protected,interface没有方法体,而abstract class 中可以有非抽象方法,

接口中定义的变量是public static final类型,且必须有初值,实现类中不能重新定义或改变,而抽象类中的变量可以重新定义,可以重新赋值。

举例:

门的动作可以定义开和关两个动作,同时门还可以实现报警的功能

abstract class Door{ 

  abstract void open(); 

  abstract void close();

  interface Alarm{ 

   void alarm(); 

  }

接口和类该怎么定义:

设计差异:

接口:依赖外部可选特征和行为,写到接口中

类:与生俱来的特征和行为,写到类中

例如,门有开、关、锁、门铃、猫眼等属性和行为,我们可以这么想,如果门没有了这些属性和行为,它还是门么,从而可以判断出:

开和关是与生俱来的,门如果没有了开、关行为,它不叫门,只是一个样式而已,所以用类来写;

而锁、门铃、猫眼他们是依赖外部的,没有他们,门还是门,只不过少了这些功能罢了。

posted @ 2016-05-28 23:06  薄灬荷  阅读(167)  评论(0编辑  收藏  举报