-----------------------------------------------个人初学,如有错误,欢迎指正-----------------------------------------------
Java学习笔记之接口和抽象类
一、简介
本文主要通过简单的实例来讲解接口和抽象类的特点,于此同时,还会分析接口和抽象类的区别。本篇的内容主要有:
1、
抽象类的声明与使用
2、
接口的声明与使用
3、抽象类与接口的区别
二、抽象类的声明与使用
使用abstract修饰符来表示抽象方法和抽象类。只有方法定义而不具体实现的方法称为抽象方法,抽象方法没有方法。包含一个或多个抽象方法的类必须被声明为抽象类。下面列举一个例子:
public class ExampleDemo {
public static void main(String[] args) {
//Car c = new Car();//定义报错
Car car = new Bus();//创建一辆公交
car.run();//公交启动
car.setDirction("左");//设置方向
car.Turned();//转向
}
}
abstract class Car{//抽象类
private String Dirction;
public String getDirction() {
return Dirction;
}
public void setDirction(String dirction) {
Dirction = dirction;
}
public abstract void Turned();//抽象方法,无实体
public void run(){//已经实现的方法
System.out.println("乘客请注意,车要启动了!");
};
}
//实例化的子类
class Bus extends Car{
@Override
public void Turned() {
System.out.print("前方"+this.getDirction()+"转向,请您扶好坐稳!");
}
}
运行程序后:
乘客请注意,车要启动了!
前方左转向,请您扶好坐稳
*关于抽象类,需要说明:
抽象类不能直接使用,必须先实例化抽象类的子类,实例化的子类才可以使用。比如程序中的代码段Car c = new Car();会报错。可以理解为,要new一辆车,必须要和工厂说明是“什么车”(实例化子类),这样工厂才能生产出来。
如果一个类继承自抽象类,则必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则子类必须定义为抽象类。例子中Bus作为Car的子类,实现了父类Car中抽象方法Turned。
三、接口的声明与使用
接口(Interface)是抽象方法的集合,泛指供调用的方法或者函数。使用Interface关键字声明接口。接口都隐式的声明为公用(Public),接口中的所有方法都是抽象方法,接口是隐式抽象的,所以声明接口的时候,可以省略abstract关键字。下面举一个例子:
//做饭接口
interface Cook {
void Cake();//蛋糕
void IceCream();//冰激凌
}
//机器人类,实现做饭接口
class Robot implements Cook{
Robot(){}
@Override
public void Cake() {//做蛋糕
System.out.println("稍等:蛋糕马上就好!");
}
@Override
public void IceCream() {//做冰激凌
System.out.println("稍等:冰激凌马上就好!");
}
}
public static void main(String[] args) {
Robot r = new Robot();
r.Cake();
r.IceCream();
}
运行结果:
稍等:蛋糕马上就好!
稍等:冰激凌马上就好!
稍等:冰激凌马上就好!
四、抽象类与接口的区别
相同点:
1、
抽象类和接口都不能被直接实例化
2、都包含抽象方法
不同点:
1、抽象类可以包含具体实现的方法和抽象方法,而接口中所有的方法必须是抽象的且隐式声明为Public
2、抽象类也是类,所以只能单继承,即只能有一个父类。但是接口可以继承多个接口。一个类也可以多个接口。
3、抽象类中可以声明各种成员变量,但是接口中的所有成员都是静态常量(public static final)
五、小结
抽象类的设计,是从整体宏观上对事物进行归纳,而接口则更侧重于类的局部功能。简单的例子,鸟类可以作为抽象类来设计,而接口则更适合用来补充类似于鸟类的各种行为,比如觅食,飞行,睡觉等等。
抽象类也是类,因此它遵从类的原则,类侧重于描述“是什么”。有相同的特点,才会被归为“类”。而接口则强调“有什么”。举个例子,恐龙都会跑,但有的会飞,那么作为基本的恐龙“类”,肯定都会跑、会觅食,但是“飞行”这个技能,就不适合放在类内部,因为对于有些恐龙来讲,它是不会飞的。所以,飞更适合做接口。看下面的例子:
//恐龙类
abstract class Dinosaur{
public abstract void eat();
public abstract void run();
}
//飞行接口
interface Fly{
public void fly();
}
//霸王龙继承自恐龙类
class TyrannosaurusRex extends Dinosaur{
@Override
public void eat() {
System.out.println("霸王龙吃肉!");
}
@Override
public void run() {
System.out.println("霸王龙会跑!");
}
}
//翼龙继承自恐龙类,进化出了飞行功能
class Pterosaur extends Dinosaur implements Fly{
@Override
public void fly() {
System.out.println("翼龙会飞");
}
@Override
public void eat() {
System.out.println("翼龙吃草!");
}
@Override
public void run() {
System.out.println("翼龙也会跑!");
}
}
public static void main(String[] args) {
TyrannosaurusRex TR = new TyrannosaurusRex();
TR.eat();
TR.run();
Pterosaur pt = new Pterosaur();
pt.eat();
pt.run();
pt.fly();
}
运行结果:
霸王龙吃肉!
霸王龙会跑!
翼龙吃草!
翼龙也会跑!
翼龙会飞
霸王龙会跑!
翼龙吃草!
翼龙也会跑!
翼龙会飞