目录
一.抽象类
1.1用关键字abstract修饰类、方法
1.2注意事项
二.接口
2.1如何定义接口
2.2接口的好处(重点)
第一个好处,弥补了类单继承的的不足,一个类可以同时有多个接口。
第二个好处,让程序可以面向接口编程,这样程序员就可以方便地切换各种业务实现。
三.比较抽象类与接口
抽象类和接口的区别主要有以下几点:
为了更好的支持多态性,定义出了一个类。抽象类的一个重要作用是支持多态性。多态性是面向对象编程的一个重要特性,它允许不同的对象对同一消息做出不同的响应。
下面根据具体的情景来认识抽象类吧,我们来实现多态的具体的项目。需要定义一个Person父类,定义两个子类分别为:Teacher和Student。
代码如下:
public class Abstract {
public static void main(String[] args){
Person person1 = new Student();
person1.run();
Person person2 = new Teacher();
person2.run();
}
}
class Person{
public void run(){
System.out.println("跑");
}
}
class Student extends Person{
@Override
public void run(){
System.out.println("疯狂地跑");
}
}
class Teacher extends Person{
@Override
public void run(){
System.out.println("优雅地跑");
}
}
以上是我们之前实现多态性这个特性的代码,现在我们用抽象来升级,用抽象类更好的支持实现多态这个特性。
首先通过用关键字abstract来定义出一个Person父类,由于被abstract修饰,这个父类就只能被继承,不能去new对象,即不能去创建对象,这样就保证只能去new子类的对象了。再用关键字abstract去修饰父类中需要重写的方法。
还有需要注意的是,这个重写的方法在父类是不可以有方法体的,这个方法确保在子类中把这些方法全部重写,不然没重写或者没有重写完方法的类重新定义为抽象类,不然会报错。有抽象的方法的类必须是抽象类,抽象类里面不一定有抽象方法。抽象类的成员既有成员变量、成员方法、构造器等。(这个会跟接口是有一定的区别)
如下代码加上了抽象类进行升级了:
public class Abstract {
public static void main(String[] args) {
Person person1 = new Student();
person1.run();
Person person2 = new Teacher();
person2.run();
}
}
abstract class Person{
public abstract void run();
}
class Student extends Person{
@Override
public void run() {
System.out.println("疯狂地跑");
}
}
class Teacher extends Person{
@Override
public void run() {
System.out.println("优雅地跑");
}
}
以上代码会比第一个代码就加上了抽象类、抽象方法,这样写得更加专业。
小结:
抽象类通过定义抽象方法和非抽象方法来实现多态性。抽象方法是没有具体实现的方法,需要在子类中被重写实现。子类可以根据自己的特定需求来实现这些抽象方法,从而实现不同的行为。非抽象方法则有具体的实现,子类可以选择是否重写。
我们可以理解为接口是一种特殊的抽象类,它只能包含抽象方法和常量,不能包含非抽象方法。通过关键字interface去定义接口,接口的内容只能是常量,还有抽象方法,所以这个接口是不能去创建对象的,接口是被类通过implements关键字实现的,实现接口的类是实现类。一个类可以去实现多个接口,这个类必须得写完父类的抽象方法,否则实现类必须定义为抽象类。
public class Interface {
public static void main(String[] args){
System.out.println(E.NAME);
E e= new F();
e.fun();
}
}
interface E{
String NAME = "lisi";
void fun();
}
class F implements E{
@Override
public void fun(){
System.out.println("重写fun");
}
}
接口中的变量的修饰是默认加上了 public static final 将其修饰成常量,而对于方法会默认在前面加上修饰 public abstract 将其修饰为抽象类。
public class Interface {
public static void main(String[] args) {
System.out.println(E.name);
E e= new F();
e.fun();
M m = new F();
m.m();
}
}
interface E{
String name = "lisi";
void fun();
}
class F implements E,M{
@Override
public void fun() {
System.out.println("重写fun抽象方法");
}
@Override
public void m() {
System.out.println("重写m抽象方法");
}
}
interface M{
void m();
}
接下来,我再讲讲我自己对接口的想法,接口其实就是一个证,类比作一个人,比如说是驾驶证,学生证,电工证,程序员证书等等,只要这些接口(证)被类(人)去实现,那么这个类(人)就会证明了会干什么,这个类(人)有什么技能,只要看这些接口(证),就可以断定这个类(人)会什么了,有什么技能。
我们可以这样认为,接口是一个特殊的抽象类,抽象类是一个特殊的类。
在使用时,应根据具体的需求选择使用抽象类还是接口。如果需要定义一组行为且不关心具体实现,可以使用接口。如果需要定义一些通用的方法和属性,并且要求子类必须实现某些方法,可以使用抽象类。