今天刚看到这,感觉有点糊涂,收集众家所言汇总于此,以备忘
2.abstract:强制要求其继承者重写。声明时不提供其自身的实现,抽象类不能被实例化;
3.interface:接口就是协议,其声明的成员(属性,方法,事件和索引器)必须由其继承的类实现。接口不能直接被实例化。
虚方法与抽象方法的区别在于,虚方法提供自身的实现,并且强制要求子类重写;而抽象方法不提供自身的实现,并且强制子类重写。
抽象类与接口很相似,但是思路不一样。接口是公开类的成员,而抽象类则是抽象类成员以要求子类继承并实现。
1. 抽象类和接口的比较
| 抽象类 | 接口 |
1 | 使用abstract关键字来定义抽象类。 | 使用interface关键字来定义接口。 |
2 | 在抽象类中可以定义抽象方法,也可以定义非抽象方法。 | 在接口中只能定义默认的抽象方法,不能定义非抽象的方法。接口实际上是一个纯抽象类。 |
3 | 在抽象类中定义的抽象方法,没有方法体。 | 在接口中定义的方法,没有方法体。 |
4 | 在抽象类中能定义常量、变量、静态方法和构造函数。 | 在接口中只能定义静态常量和实例方法,不能定义实例常量、静态变量、实例变量、静态方法和构造函数。 |
5 | 抽象类本身不提供它所定义的抽象方法的实现。 抽象类能被继承,由它的子类来实现在抽象类中定义的所有抽象方法。 | 接口本身不提供它所定义的方法的实现。 接口能被实现,由它的实现类来实现在接口中定义的所有方法。 |
6 | 在子类中必须覆盖它的抽象类定义的所有抽象方法。 | 在实现类中必须实现它的接口定义的所有方法。 |
7 | 抽象类可以从另一个抽象类继承。 | 接口可以从另一个接口继承。 |
8 | 当一个抽象类继承于另一个抽象类时,可以不用实现在基类(抽象类)中定义的抽象方法。 | 当一个接口继承于另一个接口时,不用也不能实现它的父接口中定义的方法,因为在接口中定义的方法是隐式的抽象方法,是没有方法体的。 |
9 | 抽象类不能实例化。 | 接口不能实例化。 |
10 | 定义抽象类时不能使用final关键字。 | 定义接口时不能使用final关键字。 |
11 | 一个类只能继承一个抽象类。 | 一个类可以实现多个接口。 |
(1) 抽象类主要用作基类,共享某些公共的成员和行为。
(2) 接口主要用于类,在接口中定义这些类都具有的功能。
(3) 好的接口定义应该具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只需要实现接口中的一个功能,而不得不去实现接口中的其它方法,这就叫接口污染。
(4) 抽象类主要用于一系列关系密切的对象;而接口适合为不相关的类提供通用功能。
(5) 示例1:
飞机会飞,鸟会飞,F22战斗机属于飞机(抽象类),鸽子属于鸟(抽象类),但它们都实现了同一个接口“飞”。
(6) 示例2:
就像铁门和木门都是门(抽象类),你想要门,我给不了(抽象类不能实例化),但我可以给你个具体的铁门或木门(多态性);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口),也可以有门铃(另一个接口,多实现)。门(抽象类)定义了是什么,锁(接口)规定了能做什么,一个接口最好只能做一件事,你不能要求锁也发出声音(接口污染)。
1. 抽象类和接口的比较
| 抽象类 | 接口 |
1 | 使用abstract关键字来定义抽象类。 | 使用interface关键字来定义接口。 |
2 | 在抽象类中可以定义抽象方法,也可以定义非抽象方法。 | 在接口中只能定义默认的抽象方法,不能定义非抽象的方法。接口实际上是一个纯抽象类。 |
3 | 在抽象类中定义的抽象方法,没有方法体。 | 在接口中定义的方法,没有方法体。 |
4 | 在抽象类中能定义常量、变量、静态方法和构造函数。 | 在接口中只能定义静态常量和实例方法,不能定义实例常量、静态变量、实例变量、静态方法和构造函数。 |
5 | 抽象类本身不提供它所定义的抽象方法的实现。 抽象类能被继承,由它的子类来实现在抽象类中定义的所有抽象方法。 | 接口本身不提供它所定义的方法的实现。 接口能被实现,由它的实现类来实现在接口中定义的所有方法。 |
6 | 在子类中必须覆盖它的抽象类定义的所有抽象方法。 | 在实现类中必须实现它的接口定义的所有方法。 |
7 | 抽象类可以从另一个抽象类继承。 | 接口可以从另一个接口继承。 |
8 | 当一个抽象类继承于另一个抽象类时,可以不用实现在基类(抽象类)中定义的抽象方法。 | 当一个接口继承于另一个接口时,不用也不能实现它的父接口中定义的方法,因为在接口中定义的方法是隐式的抽象方法,是没有方法体的。 |
9 | 抽象类不能实例化。 | 接口不能实例化。 |
10 | 定义抽象类时不能使用final关键字。 | 定义接口时不能使用final关键字。 |
11 | 一个类只能继承一个抽象类。 | 一个类可以实现多个接口。 |
(1) 抽象类主要用作基类,共享某些公共的成员和行为。
(2) 接口主要用于类,在接口中定义这些类都具有的功能。
(3) 好的接口定义应该具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只需要实现接口中的一个功能,而不得不去实现接口中的其它方法,这就叫接口污染。
(4) 抽象类主要用于一系列关系密切的对象;而接口适合为不相关的类提供通用功能。
(5) 示例1:
飞机会飞,鸟会飞,F22战斗机属于飞机(抽象类),鸽子属于鸟(抽象类),但它们都实现了同一个接口“飞”。
(6) 示例2:
就像铁门和木门都是门 (抽象类) ,你想要门,我给不了 (抽象类不能实例化) ,但我可以给你个具体的铁门或木门 (多态性) ;而且只能是门,你不能说它是窗 (单继承) ;一个门可以有锁 (接口) ,也可以有门铃 (另一个接口,多实现) 。门 ( 抽象类 ) 定义了是什么,锁 ( 接口 ) 规定了能做什么,一个接口最好只能做一件事,你不能要求锁也发出声音 (接口污染) 。1. 抽象类和接口的比较
| 抽象类 | 接口 |
1 | 使用abstract关键字来定义抽象类。 | 使用interface关键字来定义接口。 |
2 | 在抽象类中可以定义抽象方法,也可以定义非抽象方法。 | 在接口中只能定义默认的抽象方法,不能定义非抽象的方法。接口实际上是一个纯抽象类。 |
3 | 在抽象类中定义的抽象方法,没有方法体。 | 在接口中定义的方法,没有方法体。 |
4 | 在抽象类中能定义常量、变量、静态方法和构造函数。 | 在接口中只能定义静态常量和实例方法,不能定义实例常量、静态变量、实例变量、静态方法和构造函数。 |
5 | 抽象类本身不提供它所定义的抽象方法的实现。 抽象类能被继承,由它的子类来实现在抽象类中定义的所有抽象方法。 | 接口本身不提供它所定义的方法的实现。 接口能被实现,由它的实现类来实现在接口中定义的所有方法。 |
6 | 在子类中必须覆盖它的抽象类定义的所有抽象方法。 | 在实现类中必须实现它的接口定义的所有方法。 |
7 | 抽象类可以从另一个抽象类继承。 | 接口可以从另一个接口继承。 |
8 | 当一个抽象类继承于另一个抽象类时,可以不用实现在基类(抽象类)中定义的抽象方法。 | 当一个接口继承于另一个接口时,不用也不能实现它的父接口中定义的方法,因为在接口中定义的方法是隐式的抽象方法,是没有方法体的。 |
9 | 抽象类不能实例化。 | 接口不能实例化。 |
10 | 定义抽象类时不能使用final关键字。 | 定义接口时不能使用final关键字。 |
11 | 一个类只能继承一个抽象类。 | 一个类可以实现多个接口。 |
(1) 抽象类主要用作基类,共享某些公共的成员和行为。
(2) 接口主要用于类,在接口中定义这些类都具有的功能。
(3) 好的接口定义应该具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只需要实现接口中的一个功能,而不得不去实现接口中的其它方法,这就叫接口污染。
(4) 抽象类主要用于一系列关系密切的对象;而接口适合为不相关的类提供通用功能。
(5) 示例1:
飞机会飞,鸟会飞,F22战斗机属于飞机(抽象类),鸽子属于鸟(抽象类),但它们都实现了同一个接口“飞”。
(6) 示例2:
就像铁门和木门都是门 (抽象类) ,你想要门,我给不了 (抽象类不能实例化) ,但我可以给你个具体的铁门或木门 (多态性) ;而且只能是门,你不能说它是窗 (单继承) ;一个门可以有锁 (接口) ,也可以有门铃 (另一个接口,多实现) 。门 ( 抽象类 ) 定义了是什么,锁 ( 接口 ) 规定了能做什么,一个接口最好只能做一件事,你不能要求锁也发出声音 (接口污染) 。