一、抽象类
(1)什么是抽象类?
类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成抽象类,由于类本身是不存在的,所以抽象类无法创建对象。
(2)抽象类属于什么类型?
抽象类属于引用数据类型。
(3)抽象类怎么定义?
语法:
[修饰符列表] abstract class 类名{
类体;
}
(4)抽象类的子类还可以是抽象类。
(5)抽象类虽然无法实例化,但抽象类还是有构造方法的。
(6)抽象类关联到抽象方法的概念,什么是抽象方法呢?
抽象方法是表示没有实现的方法,没有方法体的方法。例如:
Public abstract void doSome();
(7)抽象方法特点:
(a)没有方法体,以分号结尾。
(b)前面修饰符列表中有abstract关键字。
(6))抽象类可以没有抽象方法,但抽象方法一定出现抽象类中。
二、非抽象方法继承抽象类必须将抽象方法实现(五颗星)
Bird类是继承了Animal的,而且Animal是一个抽象类,里面还有抽象方法,如果是Bird继承了Animal,会把Animal里面的方法都会继承过来,但是又由于抽象方法必须在抽象类中,而不能在普通类中,所以必须要把抽象方法进行重写。
结论:一个非抽象的类继承抽象类,必须要将抽象方法进行覆盖和重写。
Animal a = new Bird();//向上转型。
这就是面向抽象编程。以后就调用a.xxx,a的类型时Animal,Animal是抽象的,面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。
问题:Java语言中凡是没有方法体的方法都是抽象方法?
不对,例如:
public native int hashCode();
这个方法底层调用了C++写的动态链接库程序。
三、接口
(1)接口也是一种引用数据类型
(2)接口是完成抽象的(抽象类是半抽象),或者接口是特殊的抽象类。
(3)接口怎么定义:语法是什么?
[修饰符列表] interface 接口名{
}
(4)接口编译之后也是.class字节码文件。
(5)接口支持多继承
//定义接口
interface A{
}
//定义接口
interface B{
}
//定义接口
interface C extends A,B{
}
(6)接口中只包含两部分内容:一部分是常量,一部分是抽象方法。
接口当中既然都是抽象方法,那么在编写代码的时候,public abstract可以省略吗?
可以的,因为所有的方法都是Public abstract修饰的。
(7)接口中所有的元素都是public修饰的。
(8)
interface MyMath{
//常量
public static final double pI = 3.141592653589793 ;
}
这里的public static final可以省略吗?
可以的
double PI =3.14
所以在外面不能修改PI的值。
(9)类和类直接叫继承,类和接口之间叫做实现。
这里的实现可以看做“继承”
继承使用extends关键字完成
实现使用implements关键字完成。
(10)(特别重要)当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现。(覆盖,重写)
(11)如果一个类实现了接口,里面的方法需要全部的实现,并且方法修饰符只能更高,不能更低,更不能不写。
(12)接口和接口之间支持多继承,那么一个类可以同时实现多个接口吗?
//定义接口
interface A{
void m1();
}
//定义接口
interface B{
void m2();
}
//定义接口
interface C {
void m3();
}
class D implements A,B,C{
//实现A接口的m1()
public void m1(){
}
//实现B接口中的m2()
public void m2(){
}
//实现C接口中的m3()
public void m3(){
}
}
重点:一个类可以同时实现多个接口,弥补了java中只支持单继承。
四、implements和extends同时出现
(1)继承和实现都存在的话,代码怎么写?
Extends 关键字在前,implements 关键字在后
class Animal{
}
interface Flyable{
void fly();
}
class Cat extends Animal implements Flyable{
public void fly(){
System.out.println("飞猫");
}
}
public class Test{
public static void main(String [] args){
//创建对象
Flyable f = new new Cat();//多态
f.fly();
}
}
五、接口在开发中的作用
(1)接口在开发中的作用类似于多态在开发中的作用。
多态:面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。
(2)接口是不是完全抽象的?是
而我们以后正好要求,面向抽象编程,面向抽象编程这句话以后可以改为面向接口编程。有了接口就有了可插拔,表示扩展能力强,不是焊接了。
接口可以解耦合,解开的是谁和谁的耦合
任何一个接口都有调用者和实现者。
接口可以将调用者和实现这解耦合。
调用者面向接口调用。
实现者面向接口编写实现。
下面用代码体现:
publicclassTest{
publicstaticvoidmain(String[]args){
//实例化厨师
ChinaCookeryinpin=newChinaCooker();
JanpanCookerjunshui=newJanpanCooker();
//实例化顾客
Customerxiaowei=newCustomer(yinpin);
//顾客想吃中国菜
xiaowei.order();
}
}
//菜单接口
interfaceMenu{
voidCaihua();
voidChicken();
}
//顾客
classCustomer{
MenuM;
publicCustomer(){
}
publicCustomer(Menum){
M=m;
}
publicvoidorder(){
M.Caihua();
M.Chicken();
}
}
//中国厨师
classChinaCookerimplementsMenu{
@Override
publicvoidCaihua(){
System.out.println("中国厨师做的菜花");
}
@Override
publicvoidChicken(){
System.out.println("中国厨师做的鸡块");
}
}
//日本厨师
classJanpanCookerimplementsMenu{
@Override
publicvoidCaihua(){
System.out.println("日本厨师做的菜花");
}
@Override
publicvoidChicken(){
System.out.println("日本厨师做的鸡块");
}
}
六、接口和抽象类的区别
(1)定义语法上不同
(2)抽象类是半抽象,而接口是完全抽象的,抽象类里面有构造方法,而接口中只能有常量和抽象方法。
(3)抽象列不支持多继承,而接口支持多继承。
(4)接口中所有的元素都是public修饰的,抽象方法是public abstract修饰的,常量是public static final修饰的。
(5)接口和抽象类都能实现多态(父类型的引用指向子类型的对象)
总结:以前总感觉抽象类和接口都差不多,但是发现他们之间的区别还是挺大的,接口属于完全抽象,抽象类属于半抽象,所以这也导致了以后在开发中接口运用的会比抽象类要多的多,而且我感觉更有意思的是接口里面的常量居然是可以省略了public static final的方法是省略了public abstract的,这要是不知道,以后可能会把接口中的常量认为是变量,把方法认为是普通方法了吧。
Java如何在代码体现面向对象和多态(2)-is a(继承)、has a (关联)、like a(实现)(什么时候在类中定义另一个类?)