抽象类
抽象类产生
编写一个类时,会给该类定义一些方法,这些方法用来描述功能和具体的实现方式,但是分析事物时,发现共性,就会出现向上抽取,方法声明相同,但是方法功能主题不同,就可以向上抽取,之抽取方法名,不抽取方法主体,这个方法就是抽象方法。
抽象方法必须被abstract关键字修饰,被abstract关键字修饰的类就是抽象类。
抽象类&抽象方法的定义
抽象方法格式定义:
public abstract 返回值类型 方法名(参数);
抽象类定义的格式:
abstract class 类名{
类体
}
抽象类特点
1.抽象类和抽象方法都要被abstract方法修饰,抽象方法一定要定义在抽象类中
2.抽象类不可以直接创建对象
3.只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。
抽象类细节
1.抽象类是一个父类
2.抽象类中可以不定义抽象方法,不让该类创建对象,方法可以直接让子类去使用
3.子类无法继承私有方法,更不能覆盖,所以abstract和private不可以一起使用
接口
概念
接口是功能的集合,只描述所应该具备的方法,并没有具体实现,功能的定义和显示分离,优化程序设计
接口定义
接口定义时需要使用interface关键字,编译之后还是.class文件
public interface MyInterface {
//接口中所有成员变量修饰符 public static final
//static 静态:只要被static 修饰的成员 在外界可以直接通过
//类名.成员调用
//final:最终的 被final修饰的变量叫常量 一次赋值终身不变
//接口中所有的方法的修饰符 public abstract
public abstract void a();
}
接口中的方法均为公共访问的抽象方法
接口中无法定义普通的成员变量
类实现接口
类实现接口,在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。
接口中成员的特点
1、接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。
2、接口中可以定义方法,方法也有固定的修饰符,public abstract
3、接口不可以创建对象。
4、子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。
接口的多实现
Java通过接口的多实现解决了不能多继承的弊端。
不能多继承的原因:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性。
其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容。(听哪个爸爸的话?)
而接口中的功能都没有方法体,由子类来明确。
类继承类同时实现接口
接口的出现避免了单继承的局限性。父类中定义的事物的基本功能。接口中定义的事物的扩展功能。
接口多继承
多个接口之间可以使用extends进行继承。
interface Fu1{
void show();
}
interface Fu2{
void show1();
}
interface Fu3{
void show2();
}
interface Zi extends Fu1,Fu2,Fu3{
void show3();
}
在开发中如果多个接口中存在相同方法,这时若有个类实现了这些接口,那么就要实现接口中的方法,由于接口中的方法是抽象方法,子类实现后也不会发生调用的不确定性。
接口思想
1、接口的出现扩展了功能。
2、接口其实就是暴漏出来的规则。
3、接口的出现降低了耦合性,即不同类之间实现了解耦。
接口与抽象的区别
相同点:
位于继承的顶端,用于被其他类实现或继承;
都不能直接实例化对象;
都可以包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥Java的单继承)
抽象类是这个事物中应该具备的内容, 继承体系是一种 is…a关系
接口是这个事物中的额外内容,继承体系是一种 like…a关系
优先选用接口,尽量少用抽象类!!!