iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java基础之多态的示例分析
  • 784
分享到

java基础之多态的示例分析

2023-06-20 20:06:54 784人浏览 八月长安
摘要

小编给大家分享一下Java基础之多态的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、多态性多态性是面向对象的最后一个特征,它本身主要分为两个方面: 方

小编给大家分享一下Java基础之多态的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    1、多态性

    多态性是面向对象的最后一个特征,它本身主要分为两个方面:

    方法的多态性:重载与覆写

    重载:同一个方法名称,根据参数类型以及个数完成不同功能;

    覆写:通一个方法,根据操作的子类不同,所完成的功能也不同。

    对象的多态性:父子类对象的转换。

    向上转型:子类对象变为父类对象,父类 父类对象 = 子类 子类对象 自动;

    向上转型:父类对象变为子类对象,格式:子类 子类对象 = (子类)父类实例,强制;

    class A{public void print(){System.out.println("A输出");}}class B extends A{public void print(){System.out.println("B输出");}}public class TestDemo1{public static void main(String args[]){B b = new B();//B输出b.print();}}

    这种操作主要观察两点:

    看实例化的是哪一类(new);

    2 、看new的这个类之中是否被覆写了父类调用的方法。

    1.1 向上转型

    public class TestDemo1{public static void main(String args[]){A a = new B();  //向上转型        //B输出a.print();}}

    1.2 向下转型

    public class TestDemo1{public static void main(String args[]){A a = new B();  //向上转型        B b = (B) a;    //向下转型b.print();}}
    public class TestDemo1{public static void main(String args[]){A a = new A();  //没有转型        B b = (B) a;     //向下转型b.print();}}

    以上的程序在编译的时候没有发生任何错误信息,但是在执行的时候出现了“ClassCastException”错误提示,表示的是类转换异常,即:两个没有关系的类互相发生了对象的强制转型。

    转型的因素:

    • 在实际工作之中,对象的向上转型为主要使用,向上转型之后,多有方法以父类的方法为主,但是具体的实现,还是要看子类是否覆写了此方法;。

    • 向下转型,因为在进行向下转型操作之前,一定要首先发生向上转型,以建立两个对象之间的联系,如果没有这种联系,是不可能发生向下转型的,一旦发生了运行中就会出现“ClassCastException”当需要调用子类自己特殊定义方法的时候,菜需要向下转型。

    • 不转型,在一些资源较少的时候,如:移动开发

    class A{public void print(){System.out.println("A输出");}}class B extends A{public void print(){System.out.println("B输出");}public void funB(){System.out.println("funB");}}public class TestDemo1{public static void main(String args[]){A a = new B();    //向上转型System.out.println(a instanceof A);System.out.println(a instanceof B);if (a instanceof B){B b = (B) a;b.funB();}}}

    为了日后的操作方便,在编写代码的时候,尽量不要去执行向下的转型操作,子类尽量不要去扩充新的方法名称(父类没有的方法名称),依据父类定义的操作完善方法。

    例题:利用对象向上转型完成

    class A{public void print(){System.out.println("A输出");}}class B extends A{public void print(){System.out.println("B输出");}}class C extends A{public void print(){System.out.println("C输出");}}public class TestDemo2{public static void main(String args[]){fun(new B());fun(new C());}public static void fun(A a){a.print();}}

    这样以来就得到了类型的统一,就算有再多的子类出现,方法或者是类也不需要进行修改了,但是在这块必须强调的是:子类操作的过程之中,尽量向父类靠拢。

    以后所有的代码之中,都会存在对象的转型问题,并且向上转型居多。

    在日后的所有开发之中,像之前程序那样,一个类去继承另外一个已经实现好的类的情况,是不可能出现的。即:一个类不能去继承一个已经实现好的类,只能继承抽象类或实现接口。

    2、抽象类

    在以后你进行的项目开发中,绝对不要出现一个类继承一个已经实现好的类。

    对象多态性的核心本质在于方法的覆写,这样的操作有些不合要求,所以要对子类的方法进行强制的要求就必须采用我们的抽象类进行实现。

    2.1 抽象类的基本概念

    普通类就是一个完善的功能类,可以直接产生对象并且可以使用,里面的方法都是带有方法体的,而抽象类之中最大的特点是包含了抽象方法,而抽象方法是只声明而未实现(没有方法体)的方法,而抽象方法定义的时候要使用abstract关键字完成,而抽象方法一定要在抽象类之中,抽象类要使用是用abstract声明。

    abstract class A{private String msg = "www.baidu.com";//属性public void print(){//普通方法System.out.println(msg);}//{}为方法体,所有的抽象方法上是不包含有方法体的public abstract void fun() ; //抽象方法}public class ChouXiang{public static void main(String args[]){A a =new A();}}

    抽象类比普通类多了抽象方法而已,没有上面特殊的。

    抽象方法为什么不能实例化对象?

    抽象类中包含抽象方法,而抽象方法与普通方法最大的区别就是没有方法体,不知道具体的实现,而如果产生了实例化就意味着以可以调用类中的所有操作。

    抽象类的使用原则:

    • 所有抽象类必须要含有子类抽象类的子类

    • 必须覆写抽象中的全部抽象方法——方法覆写一定要考虑到权限问题,抽象方法可以使用任意权限,要求权限尽量public

    • 抽象对象可以通过对象多态性,利用子类为其实现实例化

    abstract class A{private String msg = "www.baidu.com";//属性public void print(){//普通方法System.out.println(msg);}//{}为方法体,所有的抽象方法上是不包含有方法体的public abstract void fun() ; //抽象方法}//一个子类只能够利用extends来继续继承抽象类,所以依然存在单继承局限 class B extends A{//定义抽象类的子类public void fun(){System.out.println("Hello");}}public class ChouXiang{public static void main(String args[]){A a =new B();//向上转型a.print();a.fun();}}

    通过以上的一个程序,现在就可以清楚的发现,与之前类不一样的是,抽象类定义出了子类必须要覆写的方法,而之前的类子类可以有选择性的来决定是否覆写。而且可以发现,抽象类实际上就比普通类多了一些抽象方法而已,其他的定义和普通类完全一样。如果把普通类比喻成一盘炒熟的菜,那么抽象类就是一盘半成品。

    关于抽象类的若干中疑问?

    1、抽象类能否使用final定义?

    不能,因为final定义的类不能有子类,而抽象类必须有子类。

    2、抽象类之中能否包含构造方法?

    可以,因为抽象类之中除了包含抽象方法之外,还包含了普通方法和属性,而属性一定要在构造方法执行完毕之后才可以进行初始化操作;

    3、抽象类之中能否不包含抽象方法?

    可以,抽象类之中可以没有抽象方法,但是反过来来讲,如果有抽象,则一定是抽象类。即使抽象类之中没有抽象方法也不能被直接实例化。

    4、抽象类能否使用static声明?

    如过定义的是外部抽象类,则不能够使用static声明,可是如果定义的是内部类,那么这个内部的抽象类使用了static声明之后,就表示一个外部的抽象类。

    abstract class A{private String str = "Hello,China";static abstract class B{public abstract void print();}}class C extends A.B{public void print(){System.out.println("你好,中国");}}public class ChouXiang{public static void main(String args[]){A a =new B();//向上转型a.print();}}

    结论:如果构造方法没有执行,类中对象中属性一定都是其对应数据类型的默认值。

    抽象类的最大特点在于强制规定了子类的实现结构。

    3、接口

    抽象类和普通类最大的特点就是约定了子类的实现要求:但是抽象类有一个缺点——单继承局限,如果要想要求以及避免单继承局限,就需要使用接口。在以后的开发中,接口优先,在一个操作中既可以使用抽象类又可以使用我们的接口,优先考虑接口。

    3.1 接口的基本概念

    接口就是一个抽象方法和全局常量的集合,属于一种特殊的类,如果一个类定义的时候全部由抽象方法和全局常量所组成的话,那么这种类就称为接口,但是接口是使用interface关键字定义的。

    interface A{//定义接口public static final String INFO="Hello,World";public abstract void print();}interface B{public abstract void get();}

    那么在接口之中,也同样存在了抽象方法,很明显,接口对象无法进行对象的实例化操作,那么接口的使用原则如下:

    1、每一个接口必须定义子类,子类使用implement关键字实现接口;

    2、接口的子类(如果不是抽象类)则必须覆写接口之中所定义的全部抽象方法;

    3、利用接口的子类,采用对象的向上转型方式,进行接口对象的实例化操作。

    java基础之多态的示例分析

    在Java之中每一个抽象类都可以实现多个接口,但是反过来讲,一个接口却不能继承抽象类,可是Java之中,一个接口却可以同时继承多个接口,以实现接口的多继承操作。

    //因为接口和类的定义命名要求相同,所以为了区分接口和类//建议在所以的接口前面追加一个字母Iinterface IMessage{public static final String MSG = "www.baidu.com";public abstract void print();//抽象方法}interface INews{public abstract String get();}class MessageImpl implements IMessage,INews{public void print(){System.out.println("IMessage中print方法:" +IMessage.MSG);}public String get(){return "INews中get方法:" + IMessage.MSG;}}class NewsImpl implements INews{public String get(){return null;}}public class InFa{public static void main(String args[]){IMessage ms = new MessageImpl();//InFams.print();INews m = new MessageImpl();//INews中get方法:www.baidu.comSystem.out.println(m.get());INews mn = new NewsImpl();IMessage m1 = (IMessage) mn;System.out.println(mn.get());}}

    但是需要说明的是:接口之中的全部组成就是抽象方法和全局常量,那么在开发之中一下的两种定义接口的最终效果是完全一样的:

    3.2 接口的使用限制

    完整定义:

    interface A{ public static final String INFO="接口A";public abstract void print();}

    简化定义:

    interface A{//定义接口 public String INFO="接口A"; public void print();}

    接口之中所有访问权限只有一种:public,即:定义接口方法的时候就算没写上public,最终也是public.

    1.在以后的编写接口的时候,大部分的接口里面只会提供抽象方法,很少在接口里面看见许多的全局常量。很多时候防止避免开发者出现混乱,所以接口的方法都会加上public。

    2.当一个子类需要实现接口又需要继承抽象类的时候,请先使用extends继承一个抽象类,再使用implements实现多个接口。

    //因为接口和类的定义命名要求相同,所以为了区分接口和类//建议在所以的接口前面追加一个字母Iinterface INews{public String get();//抽象方法}//可以再类上进行明确描述,在以后的开发之中也经常出现以下的命名习惯abstract class AbstractMessage{//只有接口中的abstract中才可以省略,抽象类中的不能省略public abstract void print();}class NewsImpl extends AbstractMessage implements INews{public String get(){return "www.baidu.com";}public void print(){}//有方法体就叫覆写}public class InFa1{public static void main(String args[]){INews news = new NewsImpl();System.out.println(news.get());//NewsImpl是抽象类和接口的共同子类AbstractMessage am = (AbstractMessage) news;am.print();}}

    3.一个抽象类可以使用implements实现多个接口,但是接口不能够去继承抽象类;

    //因为接口和类的定义命名要求相同,所以为了区分接口和类//建议在所以的接口前面追加一个字母Iinterface INews{public String get();//抽象方法}//可以再类上进行明确描述,在以后的开发之中也经常出现以下的命名习惯abstract class AbstractMessage implements INews{//只有接口中的abstract中才可以省略,抽象类中的不能省略public abstract void print();}class NewsImpl extends AbstractMessage{public String get(){return "www.baidu.com";}public void print(){}//有方法体就叫覆写}public class InFa1{public static void main(String args[]){INews news = new NewsImpl();System.out.println(news.get());//NewsImpl是抽象类和接口的共同子类AbstractMessage am = (AbstractMessage) news;am.print();}}

    实际上此时关系属于三层继承。

    接口与抽象类
    //因为接口和类的定义命名要求相同,所以为了区分接口和类//建议在所以的接口前面追加一个字母Iinterface INews{public String get();//抽象方法public void pirnt();  }//假设一个接口可能有无数个子类,但是对于一个方法的实现是一样的abstract class AbstractMessage implements INews{public  void print(){System.out.println("www.baidu.com");}}//生怕别人不知道NewsImpl是INews接口的子类,做一个重复标记而已class NewsImpl extends AbstractMessage implements INews{public String get(){return "www.baidu.com";}public void print(){}//有方法体就叫覆写}public class InFa1{public static void main(String args[]){INews news = new NewsImpl();System.out.println(news.get());//NewsImpl是抽象类和接口的共同子类AbstractMessage am = (AbstractMessage) news;am.print();}}

    java基础之多态的示例分析

    4.一个接口可以使用extends来继承多个父接口。

    interface A{public void pirntA();  }interface B{public void pirntB();  }interface C extends A,B{public void pirntC();}class Impl implements C{public void pirntA();  public void pirntB();  public void pirntC();  }public class InFa1{public static void main(String args[]){}}

    5.接口可以定义一系列的内部接口,包括:内部普通类、内部抽象类、内部接口,其中使用static定义的内部接口就相当于是一个外部接口

    而在开发之中,内部类是永远不会受到概念限制的,在一个类中可以定义内部类,在一个抽象类之中也可以抽象内部类,在一个接口里面也可以定义内部抽象类或内部接口.但是从实际的开发来讲用户去定义内部抽象类或内部接口的时候是比较少见的(Android开发中见过),而且在定义内部接口的时候如果使用了static,表示一个外部接口。

    interface A{public void printA();static interface B{  //外部接口public void printB();}}class X implements A.B{public void printA(){System.out.println("A");}public void printB(){System.out.println("B");}}public class Inter{public static void main(String args[]){A.B ab = new X();ab.printB();}}

    3.3 使用接口定义标准

    以上对于接口的概念并不是很难理解,但是需要强调的是,在实际开发之中,接口有三大主要功能:

    • 制定操作标准;

    • 表示一种能力;

    • 服务器端的远程方法试图暴露给客户端。

    java基础之多态的示例分析

    定义USB接口:
    interface USB{public void install();//进行安装public void work();//进行工作}
    定义USB的子类:
    class Computer{public void plugin(USB usb){usb.install();usb.work();}}class Flash implements USB{public void install(){System.out.println("安装U盘驱动");}public void work(){System.out.println("U盘进行工作");}}class Printer implements USB{public void install(){System.out.println("安装打印机驱动");}public void work(){System.out.println("打印机进行工作");}}
    源代码:
    interface USB{public void install();//进行安装public void work();//进行工作}class Computer{public void plugin(USB usb){usb.install();usb.work();}}class Flash implements USB{public void install(){System.out.println("安装U盘驱动");}public void work(){System.out.println("U盘进行工作");}}class Printer implements USB{public void install(){System.out.println("安装打印机驱动");}public void work(){System.out.println("打印机进行工作");}}public class InFa3{public static void main(String args[]){Computer cm = new Computer();cm.plugin(new Flash());cm.plugin(new Printer());}}

    发现使用接口和对象多态性结合,对于参数的统一更加明确。而且可以发现接口时再类之上的设计。

    java基础之多态的示例分析

    3.4 抽象类与接口的区别

    区别抽象类接口
    定义关键字使用abstract class进行声明使用interface进行声明
    组成全局常量、全局变量、构造方法、抽象方法、普通方法全局变量、抽象方法
    权限可以使用任何权限只能使用public权限
    关系一个抽象类可以实现多个接口接口不能继承抽象类,却可以继承多个接口
    使用子类使用extends子类使用implements
    设计模式模板设计模式工厂模式、代理模式
    局限一个子类只能继承一个抽象方法一个子类可以实现多个接口

    通过上面的分析可以得出结论:在开发之中,抽象类和接口实际上都是可以使用的,并且使用哪一个都没有明确的限制,可是抽象类有一个最大的缺点—一个子类只能够继承一个抽象类,存在单继承的局限,所以当遇到抽象类和接口都可以实现的情况下,优先考虑接口,避免单继承局限。

    除了单继承的局限之外,实际上使用抽象类和接口都是类似的,但是在实际的开发中,抽象类的设计比接口的复杂。

    java基础之多态的示例分析

    以上是“java基础之多态的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

    --结束END--

    本文标题: java基础之多态的示例分析

    本文链接: https://www.lsjlt.com/news/300132.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • java基础之多态的示例分析
      小编给大家分享一下java基础之多态的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、多态性多态性是面向对象的最后一个特征,它本身主要分为两个方面: 方...
      99+
      2023-06-20
    • Java基础之Maven的示例分析
      这篇文章将为大家详细讲解有关Java基础之Maven的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Maven是什么?Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的...
      99+
      2023-06-15
    • java基础之this的示例分析
      小编给大家分享一下java基础之this的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、this关键字首先需要提醒的是,在整个Java之中,this是...
      99+
      2023-06-20
    • java基础之string类的示例分析
      这篇文章主要为大家展示了“java基础之string类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java基础之string类的示例分析”这篇文章吧。1、String类1.1两种对象...
      99+
      2023-06-20
    • java基础之方法的示例分析
      这篇文章将为大家详细讲解有关java基础之方法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JAVA 异常分类及处理 异常分类Throwable 是 Java 语言中所有错误或异常的超类。下一层...
      99+
      2023-06-20
    • nodejs基础之多进程的示例分析
      小编给大家分享一下nodejs基础之多进程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:Node.js 多进...
      99+
      2022-10-19
    • Java基础之线程锁的示例分析
      这篇文章将为大家详细讲解有关Java基础之线程锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 synchronized关键字对象锁a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正...
      99+
      2023-06-20
    • Java基础之包装类的示例分析
      这篇文章将为大家详细讲解有关Java基础之包装类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点...
      99+
      2023-06-15
    • Java基础之MapReduce框架的示例分析
      小编给大家分享一下Java基础之MapReduce框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、MapTask工作机制MapTask就是Map阶...
      99+
      2023-06-15
    • java基础之关键字的示例分析
      这篇文章将为大家详细讲解有关java基础之关键字的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、static关键字1.1 使用static关键字定义属性在讲解static定义属性操作之前,首先...
      99+
      2023-06-20
    • java基础之内部类的示例分析
      这篇文章主要为大家展示了“java基础之内部类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java基础之内部类的示例分析”这篇文章吧。1、匿名内部类内部类:在一个类的内部定义了另外的...
      99+
      2023-06-20
    • Java基础的示例分析
      小编给大家分享一下Java基础的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、Java主要特点简单性、跨平台性、分布性、安全性、健壮性、平台独立与可移...
      99+
      2023-06-20
    • Java基础之SpringBoot整合knife4j的示例分析
      这篇文章给大家分享的是有关Java基础之SpringBoot整合knife4j的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。插件的特点非常简洁清爽的UI设计,接口的快速搜索。支持个性化设置,个性化设置包...
      99+
      2023-06-15
    • Java基础之颜色工具类的示例分析
      这篇文章主要介绍Java基础之颜色工具类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计...
      99+
      2023-06-14
    • java基础之方法与对象的示例分析
      这篇文章主要介绍java基础之方法与对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、方法的基本定义限制条件:本次所讲解的方法指的是在主类中定义,并且由主方法由主方法直接调用。方法是指就是一段可以被重复...
      99+
      2023-06-20
    • Javascript基础之类型的示例分析
      这篇文章主要介绍了Javascript基础之类型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本类型  Javascript有5...
      99+
      2022-10-19
    • Python基础之模块的示例分析
      这篇文章给大家分享的是有关Python基础之模块的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是模块容器 -> 数据的封装函数 -> 语句的封装类 -> 方法和属性的封装模块 ...
      99+
      2023-06-15
    • Python基础之进程的示例分析
      这篇文章将为大家详细讲解有关Python基础之进程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或...
      99+
      2023-06-15
    • java数组基础的示例分析
      这篇文章主要介绍java数组基础的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数组数组(Array):相同类型数据的集合。Java 数组初始化的两种方法: 静态初始化: 程序员在初始化数组时为数组每个元素赋...
      99+
      2023-05-30
      java 数组
    • JavaScript基础之静态方法和实例方法的示例分析
      小编给大家分享一下JavaScript基础之静态方法和实例方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!直接定义在...
      99+
      2022-10-19
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作