一、抽象类和抽象方法
-
抽象方法:由abstract关键字修饰的方法,并且没有方法体即没有大括号
-
抽象类:含有抽象方法或者由abstract关键字修饰的类
- 抽象类里可以由成员变量成员方法以及构造方法
- 抽象类里面可以有抽象方法也可以没有
- 抽象类没有实例化的对象,但一定有构造方法,抽象类存在的意义在于多态在于被继承,继承抽象的子类必须重写父类的所有抽象方法,不然的话要把子类也声明为抽象方法,因此抽象类对子类具有强制性和规范性
package com.sw.cs4; public abstract class Animal {//抽象类 private int id;//当成员变量被final关键字修饰的时候即使是 //引用类型也必须显示的的给它赋值且只能赋值一次, //可以直接赋值也可在构造方法中赋值,此时系统已经不会给默认值了 public Animal(){} public Animal(int id) { this.id = id; } public abstract void eat();//抽象方法 public abstract void move(); } class Dog extends Animal { public void eat() { System.out.println("eat!");//子类重写了eat方法但是没有重写move方法 } } //如果子类没有重写父类所有的抽象方法就会报错 //java: com.sw.cs4.Dog不是抽象的, 并且未覆盖com.sw.cs4.Animal中的抽象方法move()
二、接口
-
接口的定义与类相似,接口比抽象类更加抽象,它是抽象方法的集合,它的里面可以有:字段、静态方法、default关键字修饰的方法以及抽象方法,静态方法和default修饰的方法要有方法体;
-
实现接口的类必须重写接口中的所有抽象方法,它是高内聚、多实现、多继承的。
package com.sw.cs4; public interface AnimalIterface { public int id = 0; public static void eat() { System.out.println("eat!"); } default void move() { System.out.println("move!"); } void jiao();//接口里面不用特意的写public abstract来修 //饰方法,没有其他修饰符修饰的话它默认就是抽象方法 void xiao(); } class Dog implements AnimalIterface{ public void jiao() {//重写了jiao方法 System.out.println("Dog 正在叫"); } public void xiao() {//重写了xiao方法 System.out.println("Dog 正在笑"); } } class Test { public static void main(String[] args) { AnimalIterface d = new Dog(); d.jiao(); d.xiao(); d.move();//可以直接调用default修饰的方法 AnimalIterface.eat();//直接 接口名.方法名 调用静态方法 } }