java--多态,抽象类和接口(代码片段)

MinggeQingchun MinggeQingchun     2023-01-26     251

关键词:

一、抽象类

1、抽象类定义

在class前添加 abstract 关键字

public abstract class AbstractClass

2、抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的
3、final 和 abstract 不能联合使用,这两个关键字是对立的
4、抽象类的子类可以是抽象类;也可以是非抽象类。
5、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
6、抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。
7、抽象方法定义

public abstract void doSome();

8、一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现

Java中并不是所有没有方法体的方法都是抽象方法。 Object类中就有很多方法都没有方法体,都是以“;”结尾的,但他们都不是抽象方法,例如:

public native int hashCode();

这个方法底层调用了C++写的动态链接库程序。
前面修饰符列表中没有:abstract。有一个native。表示调用JVM本地程序。  

从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中没有任何意义,必须根据子类的实际需求来进行不同的实现 

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。

抽象类和普通类的主要有三点区别

1、抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

2、抽象类不能用来创建对象;

3、如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

在其他方面,抽象类和普通的类并没有区别。 

二、接口

(一)接口基础语法

接口,英文称作 interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:

[修饰符列表] interface 接口名

如:

public interface TestInterface 
    public void doSome();

1、接口是一种“引用数据类型”

2、接口是完全抽象的

3、接口支持多继承

4、接口中只有常量+抽象方法

5、接口中所有的元素都是public修饰的

6、接口中抽象方法的public abstract可以省略

7、接口中常量的public static final可以省略

8、接口中方法不能有方法体

9、一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现

10、一个类可以实现多个接口

11、extends和implements可以共存,extends在前,implements在后

12、使用接口,写代码的时候,可以使用多态(父类型引用指向子类型对象)

(二)接口在开发中的作用

接口在开发中的作用,类似于多态在开发中的作用。        

多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力
            /*
            public class Master
                public void feed(Dog d)
                public void feed(Cat c)
                //假设又要养其它的宠物,那么这个时候需要再加1个方法。(需要修改代码了)
                //这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭。)
            
            */

            public class Master
                public void feed(Animal a)
                    // 面向Animal父类编程,父类是比子类更抽象的。
                    //所以我们叫做面向抽象编程,不要面向具体编程。
                    //这样程序的扩展力就强。
                
            

“解耦合”,面向抽象编程这句话以后可以修改为:面向接口编程。
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)

接口可以解耦合

任何一个接口都有调用者和实现者。
接口可以将调用者和实现者解耦合。
调用者面向接口调用。
实现者面向接口编写实现。

接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

public class TestInterfaceImpl implements TestInterface
    @Override
    public void doSome() 
        // TODO Auto-generated method stub
    

大项目的开发,一般都是将项目分离成一个模块一个模块的,模块和模块之间采用接口衔接。降低耦合度。

(三)抽象类和接口的区别

1、语法区别

1、抽象类是半抽象的;接口是完全抽象的。

2、抽象类中有构造方法;接口中没有构造方法。

3、接口和接口之间支持多继承;类和类之间只能单继承。

4、一个类可以同时实现多个接口;一个抽象类只能继承一个类(单继承)。

5、接口中只允许出现常量和抽象方法。

6、接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法

2、设计区别

(1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

如,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。

从这里可看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

(2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

如:ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。

而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

参数抽象类接口
默认的方法实现可以有默认的方法实现完全抽象,根本不存在方法的实现
实现方式

子类用extends关键字来继承抽象类,如果子类

不是抽象类的话,它需要实现父级抽象类中所有抽

象方法,父类中非抽象方法可重写也可不重写

子类用implements去实现接口,需要实现接口中所有方法
构造器抽象类可以有构造器(构造器不能用abstract修饰)接口不能有构造器
与正常Java类的区别正常Java类可被实例化,抽象类不能被实例化,其他区别见上下文接口和正常java类是不同的类型
访问修饰符 抽象方法可以用public、protected、default修饰接口默认是public、不能用别的修饰符去修饰
main方法抽象类中可以有main方法,可以运行它接口中不能有main方法,因此不能运行它
多继承抽象类可继承一个类和实现多个接口接口只能继承一个或者多个接口
速度抽象类比接口速度快接口稍微慢点,因为它需要去寻找类中实现的它的方法
添加新方法如果在抽象类中添加新非abstract的方法,可以直接添加,因为非abstract方法无需在子类中实现,如果是abstact方法,则需要改变子类的代码,也要实现这个方法只要在接口中添加方法,实现它的类就要改变,去实现这个新添加的方法

(四)抽象类和接口的应用场景

1、如果拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类

2、如果想实现多重继承,那么必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此就可以使用接口来解决它。

3、如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

三、多态

面向对象编程有三大特性:封装、继承、多态

      封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

      继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。

      多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

1、多态的前提:

(1)要有继承或实现关系

(2)要有方法的重写

(3)要有父类引用指向子类对象

2、多态的定义与使用格式

定义格式:
    父类类型 变量名 = new 子类类型();

如:Animal a=new Cat();

动物类

public class Animal 
    public void eat() 
        System.out.println("动物吃东西");
    

猫类,继承动物类

//有继承关系
public class Cat extends Animal
    //有方法的重写
    @Override
    public void eat() 
        System.out.println("猫吃鱼");
    

    //子类特有方法
    public void catchMouse()
        System.out.println("猫抓老鼠");
    

狗类,继承动物类

//有继承关系
public class Dog extends Animal
    //有方法的重写
    @Override
    public void eat() 
        System.out.println("狗啃骨头");
    

    //子类特有方法
    public void careHome()
        System.out.println("狗看家护院");
    

测试代码:

public class AnimalDemo 
    public static void main(String[] args) 

        //编译时是Animal类,运行时内存是Cat类
        Animal a = new Cat();//向上转型;父类引用指向子类对象
        a.eat();//输出 “猫吃鱼”
        //a.catchMouse(); //编译错误,a是Animal类,没有catchMouse()方法

        //Exception in thread "main" java.lang.ClassCastException: multiple.Animal cannot be cast to multiple.Cat 
        //此时内存中a是Cat,猫不能强转为狗
        Dog d = (Dog)a;//向下转型;父类引用转为子类对象,转型的是父类引用所指向的那个子类对象
        d.eat();
    

多态中的成员访问特点

1、成员变量:

  编译看父类,运行看父类

2、成员方法:

  编译看父类,运行看子类

类型和类型之间的关系:

is a(继承)、has a(关联)、like a(实现)

1、is a:
                Cat is a Animal(猫是一个动物)
                能够满足is a的表示“继承关系”
                A extends B

2、has a:
                I has a Cat(我有一支猫)
                能够满足has a关系的表示“关联关系”
                关联关系通常以“属性”的形式存在。
                A
                    B b;
                
3、like a:
                能够满足like a关系的表示“实现关系”
                实现关系通常是:类实现接口。
                A implements B

在这里,顺便说一下final关键字

final关键字

1、final修饰的类无法继承。

2、final修饰的方法无法覆盖。

3、final修饰的变量只能赋一次值。

4、final修饰的引用一旦指向某个对象,则不能再重新指向其它对象,但该引用指向的对象内部的数据是可以修改的。

5、final修饰的实例变量必须手动初始化,不能采用系统默认值。

6、final修饰的实例变量一般和static联合使用,称为常量。

public static final double PI = 3.1415926;

day21接口类和抽象类,隔离原则,开放封闭原则,多态(代码片段)

一、接口类和抽象类:#抽象类和接口类#java编程原则和设计模式#设计模式程序设计具有里程碑意义的设计方式从java中演变出来的#单例模式#一个类只有一个实例#算法导论计算的方法时间和空间的问题权威通用#java#面向对象#java... 查看详情

java多态,抽象类和接口还不熟悉?comparable和comparator,cloneable使用(代码片段)

1.多态1.多态初识什么是多态呢?通俗地说“一种形式多种形态”,这样回答肯定不会让人满意,下面这段代码会告诉你什么是多态classAnimalpublicStringname;publicintage;classDogextendsAnimalclassBirdextendsAnimalpublicclassTestDemoprivatest 查看详情

dart抽象类和多态(代码片段)

/*Dart中抽象类:Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。1、抽象类通过abstract关键字来定义2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。3、如果子类继承... 查看详情

026面向对象05——封装(代码片段)

...接口类都是用来规范子类的接口类和抽象类不能被实例化多态(了解)java中的多态和python中的鸭子类型在某些强数据类型语言中,归一化设计(函数的参数的问题上),需要传递参数的数据类型为了几个类的对象都可以作为参数传递给... 查看详情

java中的抽象类和接口(代码片段)

目录一、什么是抽象类抽象类在实现多态中的意义 二、接口是什么 通过接口实现多态三、抽象类和接口的区别 各位铁汁们大家好呀😊!😎今天让我们继续学习java,看看java中的抽象类和接口到底是什么🤔... 查看详情

java零基础小白学习教程之day08_接口&多态(代码片段)

...口之间的多继承8.【掌握】接口的案例9.【理解】什么是多态10.【理解】使用多态的前提11.【掌握】多态的格式12.【理解】多态中的成员访问特点13.【理解】多态中的好处和弊端14.【理解】 查看详情

java零基础小白学习教程之day08_接口&多态(代码片段)

...口之间的多继承8.【掌握】接口的案例9.【理解】什么是多态10.【理解】使用多态的前提11.【掌握】多态的格式12.【理解】多态中的成员访问特点13.【理解】多态中的好处和弊端14.【理解】 查看详情

java---抽象类和接口基础知识详解(及两者异同点)(代码片段)

...类和接口的基础知识以及两者的异同点,在有继承和多态的基础知识上学习会更好~目录抽象类基础知识抽象类的定义、创建等基础抽象类的几点说明(一) 为何使用抽象方法抽象类的几点说明(二)接口基... 查看详情

java面向对象的多态性及抽象类和接口

一:Object类Object类是所有Java类的根基类(“祖先类”)如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类1.toString()方法Object类中定义有publicStringtoString()方法,其返回值是String类型,描述当前对象的有关信息。... 查看详情

java基础5:抽象类和接口(代码片段)

本节主要介绍了抽象类和接口的特性和使用方法。1.抽象类一般会实现一部分操作,并且留一些抽象方法让子类自己实现,比如Stringbuffer和Stringbuilder的父类abstractStringbuilder.2.接口一般指一种规定,比如一个map接口中,可能需要实... 查看详情

接口类和抽象类(代码片段)

抽象类和接口类首先需要明确的是接口类和抽象类是由java语言中发展来的概念,它是java中的一种设计规范或方法。Python提供了对抽象类的支持借助于abc模块Python中可以沿用接口类的概念编程但是Python不提供具体的实现方式,也... 查看详情

java—爆肝1w字❤只为弄懂抽象类和接口(代码片段)

抽象类与接口抽象类定义和语法理解抽象类作用抽象类总结:接口概念接口特性注意事项:实现多个接口接口使用实例Clonable接口和深拷贝抽象类和接口的区别?抽象类定义和语法包含抽象方法的类,叫做抽象类... 查看详情

java抽象类abstract和interface接口(代码片段)

...是抽象类抽象类不能实例化抽象类如何实例化?参照多态的方式,通过子类对象实例化 查看详情

java基础8---面向对象之多态抽象类接口(代码片段)

一、多态polymorphic1.多态的前提要有继承关系。要有方法重写。要有父类引用指向子类对象。2.多态中的成员访问特点1)成员变量编译看左边(父类),运行看左边(父类)。//多态:成员变量的访问publicclassPolymorphic_Demopubli... 查看详情

第七周课程总结&实验报告(代码片段)

...计模式模板设计工厂设计、代理设计6对象都通过对象的多态性产生实例化对象都通过对象的多态性产生实例化对象7局限抽象类有单继承的局限接口没有单继承的局限8实际作为一个模板是作为一个标准或是表示一种能力9选择如... 查看详情

java抽象类和接口4000+字深度剖析(代码片段)

...藏🧑‍🚀码云仓库:补集王子的代码仓库Java抽象类和接口1.抽象类1.1抽象类概念1.2抽象类语法1.3抽象类特性1.3.1抽象类不能直接实例化对象1.3. 查看详情

第七周课程总结&实验报告(代码片段)

...和接口是Java中的重要组成元素,在Java中可以通过对象的多态性为抽象类和接口实例化,这样再使用抽象类和接口是就可以调用本子类中所覆写过的方法。(注:抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽... 查看详情

抽象类和抽象方法接口和多态

抽象类与普通类的区别: 1、抽象类中可以写抽象方法,普通类不可以; 2、抽象类不能直接创建对象,普通类可以; 3、抽象类中可以没有抽象方法,但是仍然不能创建对象。抽象类的常见问题 1、抽象类一定是父类,因为是不... 查看详情