【左手代码右手诗】JAVA学习第八篇:抽象类与接口
一、abstract关键字
abstract,译为抽象,何为抽象:
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。
二、抽象类(abstract修饰的类)
书写格式:
/**
* 车子类
*/
public abstract class Car {
public abstract void run();
}
/**
* 自行车
*/
class Bicycle extends Car{
@Override
public void run() {
System.out.println("人踩着跑。。。");
}
}
/***
* 汽车
*/
class Automobile extends Car{
@Override
public void run() {
System.out.println("发动机驱动跑。。。");
}
}
特点:
1、abstract类中可以有abstract方法,也可以有非abstract方法
2、abstract类不允许用new运算符创建abstract类对象,只允许被子类继承
3、非abstract型的子类必须重写abstract父类的abstract方法,且重写时要去掉方法前面的abstract关键字,如果是abstract型的子类,可以重写abstract方法,也可以直接继承
4、可以运用多态的特性,让abstract类的对象作为子类的上转型对象。
2.1、abstract方法
特点:
只允许声明,不允许实现,不允许与final一起修饰方法或类,也不允许使用static修饰abstract方法。
三、接口
3.1、接口实现
interface Animal {
public void eat();
public void travel();
}
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
3.2、接口特性
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
3.3、接口与抽象类的区别
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
面向接口编程
面向接口编程只需要知道一点:开闭原则
对修改关闭,对扩展开放。