Java基础(三)——抽象类和接口
一、抽象类
1、介绍
使用:abstract定义抽象类;abstract定义抽象方法,只有声明,不用实现;包含抽象方法的类必须定义为抽象类;抽象类中可以有普通方法,也可以有抽象方法;抽象类不能被实例化,但可以定义引用变量。
抽象关键字 abstract 和哪些不可以共存?final,private,static。
应用场景:在某些情况下,父类只知道其子类应该包含什么方法,但不知道这些子类如何实现这些方法;从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
作用:限制规定子类必须实现某些方法,但不关注实现细节。
2、应用
在某些情况下,某个父类只知道其子类应该包含怎样的方法,但不知道这些子类如何实现这些方法。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
其他概念等,其他博客或书籍已介绍的很清楚,请读者自行百度,这里不做介绍。
3、案例
下面定义了两个类,一个学生类,一个老师类。学生有姓名和年龄属性,还有吃饭和学习两个方法。老师也有姓名和年龄属性,还有吃饭和教书两个方法。
1 class Student { 2 private String name; 3 private String age; 4 5 public void eat() { 6 System.out.println("学生在吃饭"); 7 } 8 9 public void study() { 10 System.out.println("学生在学习"); 11 } 12 } 13 14 class Teacher { 15 private String name; 16 private String age; 17 18 public void eat() { 19 System.out.println("老师在吃饭"); 20 } 21 22 public void teach() { 23 System.out.println("老师在教书"); 24 } 25 }
很明显,这两个类,学生和老师,都有共同的属性,姓名和年龄,也有共同的方法,吃饭。那么,就可以向上抽取一个抽象类,人。修改代码如下:
1 /** 2 * 父类Person 3 * 通过关键字 abstract 定义Person是一个抽象类 4 */ 5 abstract class Person { 6 private String name; 7 private String age; 8 9 /** 10 * abstract 抽象方法 11 * 只有方法的定义,没有方法的实现。 12 */ 13 public abstract void eat(); 14 } 15 16 class Student extends Person { 17 18 /** 19 * 不同的子类有不同的实现 20 */ 21 @Override 22 public void eat() { 23 System.out.println("学生在吃饭"); 24 } 25 26 public void study() { 27 System.out.println("学生在学习"); 28 } 29 30 } 31 32 class Teacher extends Person { 33 34 /** 35 * 不同的子类有不同的实现 36 */ 37 @Override 38 public void eat() { 39 System.out.println("老师在吃饭"); 40 } 41 42 public void teach() { 43 System.out.println("老师在教书"); 44 } 45 }
补充一下:①抽象类不可以实例化,②如果子类不想实现父类的抽象方法的话,可以将子类也申明为 abstract ,再由他的子类来实现即可。
很明显,这样做,可以简化代码。但是,请读者不要以为只要是有共有的属性或者方法,就去使用抽象类,向上抽取为一个类。Java是面向对象的语言,封装、继承、多态是它的三大的特性(默认读者有一定的Java基础)。且这些概念百度到处都是,所以不赘述。那么,什么情况下,适合向上抽取一个抽象类呢?
抽象类,向上抽取,必须要有继承关系,也就是 is a 。这里,学生是一个人,老师也是一个人。所以抽取抽象类 Person。
代码示例:反例。
1 class Student { 2 private String name; 3 private String age; 4 5 public void eat() { 6 System.out.println("学生在吃饭"); 7 } 8 9 } 10 11 class Cat { 12 private String name; 13 private String age; 14 15 public void eat() { 16 System.out.println("猫在吃鱼"); 17 } 18 }
这里,定义了学生类,猫类。同样,他们都有姓名和年龄属性,还有吃饭方法。最好就不要抽取抽象类。因为猫和人的共同父类是什么?在现实生活中是找不到的。Java中,所谓一切皆对象,程序代码也只是将现实生活中的事物在计算机中的映射。所以,这里不要为了代码的简介而胡乱抽取一个父类。有读者可能会说,他们都是生物啊,可以抽取一个Biology类,那如果是一个球类和学生类呢?这里只是举了一个例子,希望说明问题。实际开发中,读者可灵活定义!
二、接口
1、介绍
接口可以理解成一种特殊的类,由静态常量和公共的抽象方法所组成。
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。语法:
[修饰符] interface 接口名 [extends 父接口1,父接口2...] {
public static final String var1;
public static final String var2;
public abstract [返回类型] method1();
public abstract [返回类型] method2();
}
使用:接口只能用public修饰,不能使用private和protected;一个类可以实现一个或多个接口;Java中一个类只能继承一个父类,是不够灵活的,接口的出现将"多继承"通过另一种形式体现出来,即"多实现";还可以与匿名内部类配合使用,多用于关注实现而不关注类的名称。其本质是利用了多态,而创建的是一个实现了该接口的类的实例。
成员固定格式:
成员常量:public static final
成员函数:public abstract
特点:接口是对外暴露的规则;接口是程序的功能扩展;接口可以用来多实现;类与接口之间是实现关系,且类可以继承一个类的同时实现多个接口;接口与接口之间可以有继承关系;接口中的方法只能是抽象方法。
作者:Craftsman-L
本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。
如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!