JAVA抽象类和接口

2017-12-12  本文已影响0人  Jason_M_Ho

抽象类

使用abstract关键字修饰的类叫做抽象类
定义抽象类的语法格式: [访问修饰符] abstract class <类名>
普通类可以实例化,抽象类不能实例化,但是可以创建子类实例对象。

使用abstract关键字修饰的方法叫做抽象方法
定义抽象类的语法格式: [访问修饰符] abstract <返回值类型><方法名>([参数列表])
普通方法有方法体,抽象方法没有方法体。

几个要点:

示例:

public abstract class Person{  //定义了抽象类
   String name;  //在抽象类中可以定义成员变量
   private int age;
   
   public abstract void eat(); //在抽象类中可以定义抽象方法,抽象方法没有方法体
   
   public void sleep(){  //在抽象类中也可以定义普通方法
      System.out.print("正在睡觉......");
   }
}

class Test{
    public static void main(String[] args) {
      Person p = new Person(); //这种写法是错误的,抽象类不能直接被实例化,只能实例化子类对象
    }
}

接口

接口(interface)是一系列方法的声明,是抽象方法的集合。一个接口只有方法的特征,没有方法的实现。
面向接口编程就是只关心实现类有何能力,不关心实现细节;面向接口的约定,不考虑接口的具体实现。

  1. 接口是一种功能,是一种能力。一个类可以实现一个接口,使用关键字implements,实现一个接口就必须实现接口里声明的方法。如果说继承是一种is a的关系,那么接口就是一种has a的关系,实现一个接口就是拥有某种能力。

  2. 接口是一种标识,是一种约束。一个接口可以只有一个名字,接口里面什么也没有,方法的声明也没有,这种接口叫做标识接口,作用是标识一种身份。如java中的Serializalbe接口,接口里面什么也没有,只实现了这个接口,才能被序列化。

接口和类相似,但他们是不同的概念,类描述对象的属性和方法; 接口声明了一些方法的特征。

public interface MyInterface{ //定义一个接口
    public static final COUNT = 100; //定义一个变量,只能是静态常量
    public abstract void eat();      //定义一个方法,只能是public的抽象方法

}
//一个类只能继承一个父类,但是可以实现多个接口
class Studnet extends Person implements A,B,C{

}

接口示例:

public interface Lock {//定义一个接口,功能是上锁和开锁
    public void lock();
    public void unlock();
}

public interface Camera  {//定义一个接口,功能是拍照
    public void takePhoto();

}

public abstract class Gate {//定义一个抽象类,门
    public abstract void open();//定义抽象方法,开门和关门
    public abstract void close();

}
//防盗门类,继承门类,实现锁和拍照功能
class ProofGate extends Gate implements Lock,Camera{
  //实现抽象类的方法
    public void open() {
        System.out.println("门开了");
    }

    public void close() {
        System.out.println("门关了");
    }
 //实现接口中声明的方法
    public void lock() {
        System.out.println("门锁了");
        
    }

    public void unlock() {
        System.out.println("门开锁了");
    }

    public void takePhoto() {
        System.out.println("拍一下张来访者照片");
    }

}

class Test {
    public static void main(String[] args) {
        ProofGate pg = new ProofGate();
        pg.close();
        pg.lock();
        pg.takePhoto();
        pg.unlock();
        pg.open();
    }
}

标识接口示例:

public interface Human {//定义一个标识接口,标识人类

}
public interface Animal {//定义一个标识接口,标识动物

}
class Chinese implements Human{//实现标识接口

}
class American implements Human{//实现标识接口

}
class Wolf implements Animal{//实现标识接口

}
class Bear implements Animal{//实现标识接口

}

class Hunt {
    void hunt(Object obj){
    //用标识判断识别身份,是人类就不能开枪
        if(obj instanceof Human){
            System.out.println("不能开枪,这是人类");
        }else if(obj instanceof Animal){    //是动物就开枪
            System.out.println("砰砰砰,开枪......"+obj.getClass().getName()+"被打死了");
        }
    }
    
    public static void main(String[] args) {
        Hunt hunt = new Hunt();
        Chinese man1 = new Chinese();
        American man2 = new American();
        Wolf wolf = new Wolf();
        Bear bear = new Bear();
        hunt.hunt(man1);
        hunt.hunt(man2);
        hunt.hunt(bear);
        hunt.hunt(wolf);
    }
}

几个要点:

抽象类和接口的区别

相同点:

  1. 都代表了系统的抽象层,都很抽象
  2. 都不能被实例化
  3. 都能包含抽象方法

不同点:

  1. 抽象类中可以为部分方法提供默认实现,接口中只包含抽象方法,没有方法的实现。
  2. 一个类只有一个直接父类,但一个类可以实现多个接口。
  3. 已经存在的继承树,可以方便的抽取接口,担抽取抽象类不容易。
上一篇 下一篇

猜你喜欢

热点阅读