- 抽象类
- 为什么需要抽象类?在多态中父类方法的方法体是多余的,即永远不会被执行。于是出现了抽象方法。抽象类中的抽象方法是多态的一种表现形式。
- 是什么?没有方法体的方法为抽象方法 abstract修饰;类中含有抽象方法,则该类必须为抽象类,即abstract修饰所修饰的类。
- 特点:1.类中含有抽象方法,则该类必须为抽象类,即abstract修饰所修饰的类。2.抽象类中可以没有抽象方法(abstract方法),可以有具体方法,但是一旦类中包含了abstract方法,则这个“类”一定是abstract类,即有抽象方法的类一定是抽象类。abstract修饰的方法叫做抽象方法。3.抽象类不能创建对象(抽象类不能被直接实例化)。4.抽象类中的方法必须有子类实现,抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须是抽象类,一个至少要有一个非抽象类的子类。5.抽象类中可以有具体的方法。6.抽象类虽然不能创建对象但是可以定义构造方法,该方法用于子类调用。 7.抽象类不能有final修饰,否则其中的抽象方法将永远无法实。8. 抽象方法只有声明部分,而没有具体的方法体。abstract类只关心它的子类是否具有某种功能,并不关心其自身功能的具体行为,功能的具体行为由子类负责实现。
- 抽象类与普通类区别:抽象类前面由abstract修饰,而普通类没有。 抽象类不能创建对象,普通类可以创建对象。 抽象类中可以有抽象方法,普通类中一定没有抽象方法。
- 接口
- 为什么需要接口?抽象类中可以包含任意合法的方法,可以包含任意合法的成员变量,如果一个抽象类中只有抽象方法,则该抽类可以定义为接口。
- 怎么做?使用interface定义接口;实现类通过implements关键字实现该抽象类中的抽象方法。
- 特点:1.一个类没有实现完接口中所有方法,则该类必须定义为抽象类 。 2.接口不能创建对象,且接口中没有构造方法。 3.接口名常常以I开头。4.接口中抽象方法默认为public abstract ,所以接口中定义抽象方法时可以省略public abstract ;且只能是public。5.抽象类中可以定义任意合法的成员变量,但是接口中只能定义public static final常量。6.JDK8以前版本的JDK中,定义的接口只能含有常量和抽象方法;JDK8+以后的版本可以定义多个default或者static具体方法。7.Java中类只能继承一个父类,但是Java中接口可以继承多个接口,每个接口之间使用逗号隔开。
- Java接口是抽象方法的集合,接口名的命名规则和类名的命名规则相同。
- 命名规则: 访问权限控制符 interface 接口名 【extends 接口列表】{ 常量: 抽象方法; 内部类; }
- 接口名的命名规则和类名的命名规则相同。
- 接口中的抽象方法必须为public访问权限控制符,不能为其它控制符。
- 接口只能继承父类接口,不能继承抽象类和普通类,通过implements关键字实现接口,其语法如下: 访问控制符 修饰符 class 类名 implements 接口1 [,接口2, ……] { 变量; 方法; }
- 接口实现类可以直接使用接口中的常量,但如果接口实现类所实现的多个接口中有常量名相同的常量,则在实现类中不能直接使用,必须使用类名来确定到底调用哪个接口中的常量。
- 抽象类与接口区别:
1.定义时关键字的区别:抽象类关键字为abstract;接口为Interface
成员变量:抽象类成员变量可包含任意合法成员变量(包括各种访问级别的类成员变量和实例成员变量);接口类成员变量只能包含公开静态常量(默认由public static final修饰)。
2.构造方法:抽象类有构造方法,接口没有构造方法。
3.是否存在多继承:一个抽象类只能继承一个抽象或非抽象类,一个接口可以继承多个接口。
4.实现时:抽象类用的是extends 接口implements
5.成员变量:
6.方法:抽象类可以定义任意合法方法;可以是静态非静态公有私有,接口只能定义抽象方法。JDK7及其以下版本JDK只能包含公开且抽象的方法(默认由public abstract修饰),而JDK8及以上版本可以包含default、static修饰的非抽象方法。
方法:抽象类可包含任意合法方法(包括各种访问级别的非抽象类方法和非抽象实例方法,也包含除private外的非静态抽象方法)。接口:JDK7及其以下版本JDK只能包含公开且抽象的方法(默认由public abstract修饰),而JDK8开始可以包含default、static修饰的非抽象方法。
如何实现抽象方法:抽象类通过自定义类继承抽象类的方式实现抽象类的抽象方法;接口通过自定义类implements接口实现接口中的抽象方法,定义类可以implements多个接口。
package sea;
public interface Mammal extends I,II {
int AGE =90;
void move();
//public abstract void move();
public default void eat() {
}
public static void walk() {
}
}
package sea;
public interface Mammal extends I,II {
int AGE =90;
void move();
//public abstract void move();
public default void eat() {
}
public static void walk() {
}
}
package sea;
public class Test {
public static void main(String[] args) {
//Mammal mammal =new Whale();
//mammal.move();
//
}
}