Java抽象类和接口

一.抽象类


1. 抽象类的来源

Java是面向对象的语言。在面向对象的概念中,一切事物都是对象,所有的对象都是用类来描述的。事物有个性和共性。描述事物抽取出来的共性的类就是抽象类

事物(对象)事物的个性事物的共性
类(属性+方法)一般类抽象类
举例苹果水果

2.抽象类的特征

  • 抽象类不能实例化。也就是不能创建对象,应该由继承抽象类的子类来进行实例化。抽象类就是为了继承而存在的,天生就是为了当爹。基于这个原因,abstract不能和final并列修饰一个类。
    • final修饰的类不能被继承。子类无法继承抽象类进行实例化。
  • 抽象类的抽象方法必须由继承它的子类重写。如果继承它的子类没有重写抽象类的抽象方法,那么这个子类也一定是抽象类,因为它含有抽象方法。基于这个原因,抽象方法必须是public和protected修饰的,缺省访问权限修饰符情况下, 默认为public。因为abstract不能和private,static,final或native并列修饰抽象方法。原因是
    • private修饰的方法不能被子类继承。子类不能重写这个方法。
    • static修饰的方法叫类方法(静态方法)。子类不必重写这个方法。
    • final修饰的方法可以被继承不能被重写。子类不能重写这个方法。
  • 含有抽象方法的类必然是抽象类。抽象类可以没有抽象方法。
  • 子类的抽象方法不能和父类的抽象方法同名。
  • 抽象类可以有成员变量, 一般方法, 构造方法,与普通类一样。

3.抽象类的示例代码

public abstract Person{
    //属性
    String name;
    //构造方法
    public Person(){
        this.name=name;
    }

    //一般方法
    public void displayName(){
        System.out.println("名字是:"+name);
    }

    //抽象方法
    public abstract void eat(); 
}

二.接口

1.接口的来源

  • 接口是比抽象类还要抽象。接口是抽象类的延伸。Java为了保证数据安全,一个类不能继承多个类。但是Java使用接口弥补了不能多继承的缺陷。一个类可以实现多个接口,这叫“多实现”
  • 接口和继承共同使用,既能保证数据安全,又可以实现多继承。
  • 接口与接口之间是可以多继承的。
//接口继承(inheritance)
interface A{
    void method1();
    void method2();
}

interface B{
    void method3;
}

interface C extends A,B{
    void method4();
}

2.接口的特征

  • 接口不能实例化。不能使用new操作符实例化一个接口,但是可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(Object instanceof Interface){}。
    • 实现接口的非抽象类必须要实现接口中的所有方法。
    • 实现接口的抽象类不必实现接口中的所有方法。
  • 接口中的变量。接口中的变量会被隐式地指定为public static final修饰,使用其他修饰符修饰编译会报错。一般情况下不在接口中定义变量,而是不可变的常量。
  • 接口中的方法。接口中的方法会被隐式地指定为public abstract修饰,使用其他修饰符修饰编译会报错。接口中不存在具体实现的方法,接口中的方法都是抽象方法。

3.接口的示例代码

public interface Demo{
    public static final A;
    public abstract void method1();
    public abstract void method2();
}

三.抽象类和接口的深度剖析

在Java语言中, 抽象类和接口是支持抽象定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。抽象类和接口之间在对于抽象定义的支持方面具有很大的相似性,甚至可以相互替换。

1.语法层次的不同
参考一,二部分。


2.抽象层次的区别
抽象类是对一类事物的抽象。接口是对行为的抽象。
抽象类是对整个类整体的属性,行为进行抽象。
接口是对类局部行为进行抽象。
举例说明:
飞机和鸟是不同的事物,它们拥有共同的行为,会飞。
可以将飞机设计一个类,鸟设计一个类,因为两者都是事物。
但是飞行是个行为特性,不能设计一个类,应该设计成一个接口。


3.描述层次的区别
我们日常生活中可以看到各种”接口”,例如电源插座。制造电源插座的厂商和制造电器的厂两者之间约定了一个生产规则,约定了一个”接口”之后,不同的电器就都能使用电源插座。
由此可知,接口的本质是协议,是对事物之间规则的描述,不是对事物的描述。
在Java中:
1.抽象类也是类,类是对现实事物的描述。
2.接口不是类,接口是用来建立类与类之间的协议。接口是对事物之间规则,行为的描述。


4.设计层次的不同
1.抽象类的设计理念是“is-a”,接口的设计理念是“like-a”,是问题领域不同。
2.抽象类的设计目的是为了提高代码的复用性。是模板式设计。接口的设计目的是为了实现”设计与实现的分离”,降低程序中的耦合性。是辐射式设计
3.在“缺省适配模式”中,声明类型的工作由Java接口承担。但是同时给出一个Java抽象类,且实现了这个接口。而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。也就是说,在层次结构中,Java接口在最上面,然后紧跟着抽象类,然后是普通类。
4.在面向对象程序设计中,对于接口,有一个核心原则就是Interface Segregation Principle(接口隔离原则): 1)使用多个专门的接口比使用单一的总接口要好。2) 一个类对另外一个类的依赖性应当是建立在最小的接口上的。3)一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。


简化总结

抽象类接口
不是类
对事物描述对事物之间规则描述
对类整体抽象对类局部行为抽象
模板式设计辐射式设计
is-a理念like-a理念
目的是提高复用性目的是降低耦合性
为继承而生为多态而生
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值