思维导图锁定核心
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的,根本不存在方法的实现 |
实现 | 子类使用extends关键字继承抽象类.如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法实现. | 子类使用关键字implements实现接口.它需要提供接口中所有声明的方法实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常JAVA类的区别 | 除了不能实例化抽象类之外,它和普通JAVA类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public,不可以是使用其他的修饰符 |
main方法 | 抽象方法可以有main方法,可以运行它 | 接口没有main方法,不能运行它 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其他接口 |
速度 | 它比接口速度快 | 接口是稍微有点慢,需要时间去寻找在类中实现的方法 |
添加新方法 | 在抽象类中添加新的方法,可以给它提供默认的实现,不需要改变你现在的代码 | 在接口中添加方法,必须改变实现该接口的类 |
01x0 抽象类
描述"水果"这个抽象.它有体积,质量一些共性,但是又缺乏特性(苹果,香蕉都是水果,它们有自己的特性).
但是我们拿不出唯一一种能代表水果的东西(因为苹果和香蕉都不能代表水果),但是可以用抽象类来描述它,所以抽象类是不能够实例化的.
当我们用某个类来具体描述"苹果"时,这个类就可以继承描述"水果"的抽象类,我们都知道"苹果"是一种"水果"
也就是说抽象类是个总类
01x1 抽象方法
抽象方法是一种特殊的方法,它只有声明.具体的实现要由继承抽象类的类对其进行重写.
抽象方法必须用abstract关键字进行修饰.这种方法只声明返回的数据类型
Talk is cheap,show my code
定义一个动物抽象类,动物都可以cry()
public abstract class Animal {
public abstract void cry();
}
猫
public class Cat(){
@Override
public void cry(){
System.out.println("我是猫,喵喵喵");
}
}
狗
public class Dog(){
@Override
public void cry(){
System.out.println("我是狗,汪汪汪");
}
}
Test
public class Test(){
public static void main(String arg[]){
Animal a1 = new Cat();
Animal a1 = new Dog();
a1.cry();
a2.cry();
}
}
02x0 接口
接口是一种协议
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
Talk is cheap,show my code
/*
定义一个Shape接口
*/
public interface Shape
{
double PI=3.141596;//接口默认变量为static final 全局变量
double getArea(); //接口默认方法权限为public
double getGirth();
}
/*
定义一个梯形类来实现Shape接口
继承接口关键字 implements
*/
public class Trapezium implements Shape{
public double downSide;
public double height;
public double upSide;
public Trapezium(){
upSide=1.0;
downSide=1.0;
height=1.0;
}
public Trapeizum(double upSide,double downSide,double height)
{
this.upSide=upSide;
this.downSide=downSide;
this.height=height;
}
//接口方法的实现
public double getArea()
{
return 0.5*(upSide+downSide)*height;
}
//接口方法的实现
public double getGirth(){
//尽管我们不计算梯形的周长,但也必须实现该方法.
return 0.0;
}
}
03X0 抽象类以及接口的特点
抽象类
- 抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可
- 抽象方法必须由子类来进行重写.
- 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含其他方法
- 抽象类中可以包含具体的方法,当然也可以不包含抽象方法
- 子类中的抽象方法不能与父类的抽象方法同名
- abstract不能与final并列修饰同一个类
- abstract不能与private,static,final或native并列修饰同一个方法
接口
- 接口的实现就是在实现接口的类中重写接口中给处的所有方法,书写方法体代码,完成方法所规定的功能.
- 接口的访问限定只有public和缺省的
- interfact是声明接口的关键字
- 接口的命名必须符号标识符的规定,并且接口名必须与文件名相同.
- 允许接口的多重继承
- 常量默认为static final 修饰的.
- 声明的方法,默认为”abstract”的