JAVA抽象类与接口
一、抽象类的概述
1、抽象类的引入:
以前学的猫狗案例,在父类中我们都给出具体的共性方法,但在实际情况中,每个子类对于共性方法的实现是不同的,这就引出了抽象类的概念。
抽象类即在继承条件下,父类中的共性功能,对于子类来说实现有差异,所以在父类中我们不必给出具体的实现,只需给出一个抽象的方法声明即可,实现交由子类自己重写,这个方法就叫抽象方法,而含有抽象方法的类就叫做抽象类。
2、抽象类与抽象方法格式:
抽象类:abstract class 类名 {}
抽象方法格式: public abstract void eat();
3、抽象类不一定有抽象方法,而有抽象方法的一定是抽象类。
4、抽象类的子类要麽是抽象类,要麽就重写抽象类的所有抽象方法。
二、抽象类的特点
1、 a:成员变量:既可以是变量,也可以是常量。
b:构造方法:有,作用是用于子类访问父类数据的初始化。
c:成员方法:既可以是抽象的,也可以是非抽象的。
2、成员方法:
抽象方法:强制要求子类必须重写。
非抽象方法:子类也可以继承,这样提高了代码的复用性。
3、abstract关键字与其他关键字共存问题
private 冲突
final 冲突
static 不能共存 无意义
三、接口概述
1、在继承时,有时候有的子类需要别的扩展功能,比如狗,有的狗会跳铁圈,而不是所有的狗都会,所以把跳铁圈写进父类就不好,这时候我们就可以建一个接口,把这些扩展功能写进去,谁需要让谁实现这个接口就行了。
2、 a:接口用关键字interface表示 格式: interface 接口名 {}
b:类实现接口用implements表示 格式: class 类名 implements 接口名 {}
c:接口的子类
可以是抽象类。但是意义不大。
可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
四、接口的成员特点
1、成员变量
接口中的成员变量都是常量,都是静态的,前面有默认的public static final
2、接口中没有构造方法。
3、接口中的方法都是抽象的,有默认修饰符public abstract
五、抽象类与接口的区别
1、成员区别
抽象类:成员变量:变量,常量都行
构造方法:存在
成员方法:可以抽象,也可以非抽象
接口:成员变量:只能常量
成员方法:只能抽象
2、类与类、类与接口、接口与接口的关系:
类与类:单继承,多层继承
类与接口:单实现也可以多实现,并且可以在继承一个类的同时实现多个接口。
接口与接口:单继承,多继承。
六、抽象类与接口示例
老师有基础班的,也有就业班的。
共性:
属性:姓名,年龄
功能:讲课。
现在又要针对日语这种小语种单独开班,
需要部分基础班老师和部分就业班老师会说日语。
请用所学知识把上面的内容用代码体现。
测试类:
public class Mytest {
public static void main(String[] args) {
Teacher teacher=new Jichu();
teacher.show("张三",30);
teacher.Teach();
Japannese japannese=new Jichu();
japannese.Teachjapannese();
System.out.println("%%%%%%%%%%%%%%%%%%%");
Teacher teacher1=new Jiuye();
teacher1.show("李四",25);
teacher1.Teach();
Japannese japannese1=new Jiuye();
japannese1.Teachjapannese();
}
}
父类:
public abstract class Teacher {
String name;
int age;
public abstract void Teach();
public void show(String name, int age){
};
}
接口:
public interface Japannese {
public abstract void Teachjapannese();
}
基础班子类:
public class Jichu extends Teacher implements Japannese {
@Override
public void Teach() {
System.out.println("教基础班课程");
}
@Override
public void show(String name, int age) {
System.out.println("姓名"+name+",年龄"+age);
}
@Override
public void Teachjapannese() {
System.out.println("学会说日语");
}
}
就业班子类:
public class Jiuye extends Teacher implements Japannese{
@Override
public void Teach() {
System.out.println("教就业班课程");
}
@Override
public void show(String name, int age) {
System.out.println("姓名"+name+",年龄"+age);
}
@Override
public void Teachjapannese() {
System.out.println("学会说日语");
}
}