抽象类和接口(总)
抽象类的引入
-
代码小细节 :
-
将一个基类 定义为抽象类后就不再允许定义它的对象了。
-
sysout+alt+/
-
方法名+alt+/ 重写
-
public interface Comparable{//接口 public final int NUM = 20;//定义常量属性 int NUM = 20;//定义常量的第二种方法 public abstract void train();//定义抽象方法 public abstract void compareTo(Object another);//定义抽象方法 void fun();//默认是抽象方法,因为接口中不允许定义其他方法 public void fun();//默认是抽象方法,因为接口中不允许定义其他方法 public static void funStatic(){ System.out.println("接口中的静态方法"); } public default void funDefault(){ System.out.println("接口中的default方法"); } }
-
-
基类本身生成的对象的不合理性 :例如:动物类作为基类可以派生出猫类和狗类,但是动物类本身生成对象明显不合理。因此可以将其定义为抽象类。
-
抽象类的特点 :
- 由abstract修饰;
- 类中可以定义抽象方法;(不强制要求)
-
抽象方法:
-
由abstract修饰;
-
方法只有声明没有方法体
-
public abstract clss Animal{ private String color; public abstract void shout();//只有声明没有方法体 }
-
-
如果一个类里面有一个或多个抽象方法,那么就必须将这个类定义为abstract类。
-
-
派生类继承抽象类
-
派生类继承抽象类要么继承抽象类中所有的抽象方法,要么派生类也定义为抽象类。
-
public class Cat extends Animal{ public void shout(){ System.out.println("喵喵喵"); } }
-
public abstract class Cat extends Animal{ }
-
public class PersianCat extends Cat{ public void shout(){ System.out.println("喵喵喵"); } }
-
如果从一个抽象类继承,而且想生成新类型的一个对象,就必须为基础类中的所有抽象方法提供方法定义。
如果不这样做(完全可以选择不做),则衍生类也会是抽象的,而且编译器会强迫我们用abstract 关键字标志那个类的“抽象”本质。
即使不包括任何abstract 方法,亦可将一个类声明成“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。
-
接口(只允许公开的、抽象的、默认的、静态的和严格的)
-
引入:有些动物有一些特殊的技能,例如钻火圈等,这些额外的动作不是所有动物一开始就具备的,所以Java提供接口来定义这些额外的功能,接口中并不给出具体的实现(抽象方法),将来那些动物需要被训练,只需要把额外的功能实现即可。
-
接口:是一系列方法的声明、方法特征的集合。
-
接口可以看作是一种特殊的抽象类,其中包含常量和抽象方法的声明,而没有变量和方法的实现。JDK8之后可以定义static、default方法。
-
常量和抽象方法只能用public修饰。
-
static、default方法必须有方法体 。访问权限修饰符:公开的、默认的
-
定义语法(非常重要 )
-
public interface Comparable{ public final int NUM = 20;//定义常量属性 int NUM = 20;//定义常量的第二种方法 public abstract void train();//定义抽象方法 public abstract void compareTo(Object another);//定义抽象方法 void fun();//默认是抽象方法,因为接口中不允许定义其他方法 public void fun();//默认是抽象方法,因为接口中不允许定义其他方法 public static void funStatic(){ System.out.println("接口中的静态方法"); } public default void funDefault(){ System.out.println("接口中的default方法"); } }
-
-
类可以通过实现接口的方式来具体接口中定义的功能
-
一个类实现接口要么实现接口中所有的抽象方法,要么该类必须定义为抽象类
-
public abstract class Cat extends Animal implements Comparable{ public void shout(){ System.out.println("喵喵喵"); } }
-
public class Cat extends Animal implements Comparable{ public void shout(){ System.out.println("喵喵喵"); } public abstract void train(){ System.out.println("我会钻火圈啦!"); } public abstract void compareTo(Object another){ System.out.println("一个类要么实现接口中所有的抽象方法要么就将自己定义为abstract类"); } //重写接口中的default方法 public void funDefault(){//不再写default修饰符 System.out.println("重写接口中的default方法"); } }
-
接口的实现类不允许重写static方法
-
接口中的实现类可以选择重写default方法 ,重写的话不加default修饰符
-
-
一个类可以实现多个接口;
-
一个接口可以被多个无关的类实现;
-
-
接口的继承
-
Java中的接口可以继承接口,与类的继承概念一致,一个接口继承一个父接口就会继承父接口中定义的所有方法和属性。
-
接口不能继承类 。
-
一个接口可以继承多个接口。
-
public interface Comparable extends INTERFACE1,INTERFACE2...{ }
-
-