接口的定义:
接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”。
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
请记住:一切事物均有功能,即一切事物均有接口。
与定义类的class不同,接口定义时需要使用interface关键字。
定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。
使用interface代替了原来的class,其他步骤与定义类相同:
接口中的方法均为公共访问的抽象方法
接口中无法定义普通的成员变量
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑.
接口中定义功能,当需要具有该功能时,可以让类实现该接口,只声明了应该具备该方法,是功能的声明。
在具体实现类中重写方法,实现功能,是方法的具体实现。
于是,通过以上两个动作将功能的声明与实现便分开了。(此时请重新思考:类是现实事物的描述,接口是功能的集合。)
特点
1.接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变
2.接口中可以定义方法,方法也有固定的修饰符,public abstract
3.接口不可以创建对象。
4.子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类
继承的定义
Java中是允许继承的,就是当A类继承B类时,那么A类就会拥有B类所有可以继承过来的内容.那么A类就叫做子类,B类就是父类
注意:
1.Java中只允许单继承,也就是一个类只能有一个父类;但是一个父类却可以拥有多个子类
2.继承要合理
3.Java所有的类默认继承自Object,是所有类的根类,每个类都直接或者间接继承他
子类可以通过接口间接的访问父类中的私有属性
方法重写:指的是子类从父类继承过来的方法,如果不满足子类需求时,子类可以重写父类方法实现
重写分为:
完全重写:不保留父类方法的实现
不完全重写:保留父类方法实现,但是还会添加自己对象方法的实现
抽象类的应用场景:当一个父类定义方法还对方法进行的实现,但是发现子类只要继承这个类,就会对父类的方法进行重写,那么父类对这个方法的实现就没有意义.此时就可以把这些方法定义到抽象类中,抽象类中方法都是抽象方法,因为只有声明而没有方法具体实现.
abstract 抽象类的关键字
抽象类只能作为父类,因为抽象类不能实例化.
原因是它里面的方法是抽象方法,没有具体实现
继承自抽象类的子类,必须实现抽象类中抽象方法
接口和抽象类的相同点与区别
相同点:
1.都位于继承的顶端,用于被其他类实现或继承;
2.都不能直接实例化对象;
3.都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
1.抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;
2.一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
3.抽象类是这个事物中应该具备的你内容, 继承体系是一种is..a关系
4.接口是这个事物中的额外内容,继承体系是一种like..a关系
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类