Java如何在代码体现面向对象(1)-接口、抽象类以及接口抽象类的区别

一、抽象类

(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(实现)(什么时候在类中定义另一个类?)

猜你喜欢

转载自blog.csdn.net/MyxZxd/article/details/105932361