一、抽象类:
定义抽象方法:
- [修饰符] abstract 返回值类型 方法名([参数列表]); //抽象方法
-
概念:
抽象类和具体类是相对概念,
抽象
是一种存在思想逻辑中的概念,而具体
是一种可见可触摸的现实对象。比如说,人
比男人
抽象一点,生物
比人
更抽象。抽象的概念是由具体概念依其共性而产生的,把具体概念的诸多个性排除,集中的描述其共性,就会产生一个抽象的概念。
抽象高于具体,但是需要具体来实现抽象。
抽象的外延伸大,内涵小,而具体的外延小,内涵大。
-
抽象类与普通类:
普通类可以实例化调用;抽象类不能被实例化。因为它是一种概念而不是具体。
普通类和抽象类都可以被继承,但抽象类被继承后,需要子类重写继承的方法。除非子类也是抽象类。
演示:
public class pet{ public void play(){} // Pet类,普通父类,方法里是空的 } ---------------------- public class Cat extends Pet{ // 猫类子类,重写父类方法 public void play(){ System.out.println("1、猫爬树"); } } ---------------------- public class Dog extends Pet { //这是子类,是一个狗类,重写了父类方法 public void play(){ System.out.println("2、狗啃骨头"); } } ---------------------- public class Test { public static void main(String[] args) { //这是测试类,分别调用了子类的不同方法 Pet p1=new Cat(); //多典型的多态表现 Pet p2=new Dog(); p1.play(); p2.play(); } } ---------------------- 输出结果: 1、猫爬树 2、狗啃骨头 ---------------------- //抽象方法 public abstract class Pet{ //抽象方法 public abstract void run();//没有方法体,没有大括号 }
上述代码若改成抽象父类,其子类的写法依旧不变,那么抽象类的存在意义是什么?
抽象类就是为了强制不能实例化,定义一种规则。
-
抽象类的特点:
- 抽象类,抽象方法有 abstract 修饰
- 抽象方法没有方法体
- 抽象方法不能执行
- 抽象方法不能用private修饰
- 抽象类中可以有普通方法
- 如果一个类继承了抽象类,那这个类必须重写它的抽象方法或者将类声明为抽象类
- 抽象类是有构造方法的,但是不能被实例化
- 构造方法,类方法(static)不能声明为抽象方法
- 一个类中只要含有抽象方法,这个类就必须是抽象类;抽象类不一定含有抽象方法
若抽象类中有非抽象方法,继承这个抽象类中的子类可以直接使用此非抽象方法(前提是能访问到)
二、接口
定义接口
[修饰符] interface 接口名{} public interfacae USB{ public static final name = ""; //静态常量 public void service(); }
接口中的方法默认是抽象方法,所以省略abstract修饰符
接口中的方法默认都是public,所以可以省略public
接口中的变量只能是静态常量(static final),所以可以省略 static final,静态常量在定义时就需要赋值,且不可变
接口使用和抽象类一样,都是通过子类
一个类可以实现多个接口,接口之间使用 , 隔开
接口的实现类中,可以有普通方法
实现的方法必须是 public 的
java 中继承是单继承,使用 extends 关键字;但是一个类可以实现多个接口,使用 implements ,多个 接口之间用 , 隔开。
一个类可以同时继承和实现接口, extends 要在 implements 之前
public class LenovoComputer extends Computer implements USBInterface, ChargeInterface{ }
接口与接口之间是继承关系,使用 extends 关键字。多个接口使用 , 隔开
public interface USBC extends USBInterface,ChargeInterface{ }
jdk8接口新特性
静态方法必须写方法体,jdk1.8新增,default修饰符修饰的方法要加方法体,不写修饰符默认是public,所以要写方法体的话必须加static
public interface USBInterface { public static void test1() { System.out.println("test1"); } }
三、抽象类与接口
-
概念:
接口是对动作的抽象,抽象类是对本质的抽象
抽象类表示的是,这个对象是什么,接口表示的是,这个对象能做什么。比如男人和女人,他们的抽象类是人类,而猫和狗的抽象类是宠物类。人类可以吃东西,宠物类也可以吃东西,但是两者不能混为一谈,因为有本质上的区别。吃东西是一个动作,你可以把吃东西定义为一个接口,然后让两个类去实现他。
所以,在高级语言上,一个类只能继承一个类或抽象类,正如人不可能同时是动物类又是植物类,但是可以实现多个接口,例如,吃饭接口、呼吸接口等
-
使用情况
- 抽象类 和 接口 都是用来抽象具体对象,但是接口的抽象级别最高。
- 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量(final)。
- 抽象类主要用来抽象类别,接口主要用来抽象功能。
- 抽象类中不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的(static修饰的除外,可以有方法体)。
- 抽象类实现接口时,接口的方法在抽象类中可以被实现也可以不被实现,而普通实现接口必须实现所有接口方法。
- 当你关注一个事物的本质的时候,用抽象类。
- 当你关注一个操作的时候,用接口。
四、总结:
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。