Java多态(二)

public class ExtendsTest {

    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println(a1.show(b));     //A and A
        System.out.println(a1.show(c));     //A and A
        System.out.println(a1.show(d));     //A and D

        System.out.println("=======");
        System.out.println(a2.getClass().getName());
        /**
         * A a2 = new B();向上转型,a2调用show()方法之前先去判断父类A中是否有该方法
         * 若有则调用B中相应的方法,若是带有参数的方法如a2.show(b),其中b是B类型的,父类
         * 中没有该方法,子类B中有该方法,但由于是向上转型不会直接调用B类中的方法,而是判断是否
         * 父类中是否有参数b的父类型的同名方法(即A中没有show(B b)的方法而有show(A a)方
         * 法),因此程序最终会调用B类中的show(A obj)方法。
         * 因此a2.shw(b)、a2.show(c)结果为B and A;a2.show(d)结果为A and D
         */
        System.out.println(a2.show(b));     //B and A
        System.out.println(a2.show(c));     //B and A
        System.out.println(a2.show(d));     //A and D

        /**
         * B b = new B();B类新建一个普通示例对象,b.show(b)的结果很明显就是B and B;
         * b.show(c)父类和子类都没该方法(B中没有找到,转而到B的超类A里面找),因此转到第三优
         * 先级,由于c是b的子类,因此到B类中找到show(B obj),最终结果B and B;
         * b.show(d)在B类中没找到,转而倒父类中查找,调用父类的方法,结果A and D;
         * 因为A、B中都有方法show(A obj),根据Java多态-方法的重写,最终调用子类中的方法,结
         * 果B and A。
         */
        System.out.println("=======");
        System.out.println(b.show(b));      //B and B
        System.out.println(b.show(c));      //B and B
        System.out.println(b.show(d));      //A and D
        System.out.println(b.show(a1));      //B and A

        /**
         * 方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
         */
    }
}

class A {
    public A(){
        System.out.println("A构造器被调用");
    }
    public String show(D obj){
           return ("A and D");
    }
    public String show(A obj){
           return ("A and A");
    }
}
class B extends A{
    public B(){
        System.out.println("B构造器被调用");
    }
    public String show(B obj){
           return ("B and B");
    }
    public String show(A obj){
           return ("B and A");
    }
}
class C extends B{}
class D extends B{}
时间: 2024-08-13 19:47:15

Java多态(二)的相关文章

Java实验二实验报告:java面向对象程序设计

java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如“查网络”.“问

java多态讲解

JAVA多态 一.相关的类结构 class A ...{ //create by danielinbiti public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A...{ public String show(B obj)...{ return ("B and B&q

[C++/Java] C++ 和 Java多态的区别

C++ 和 Java多态的区别 一.覆盖base当中的基类的virtual方法,编译时确定 二.维护一张类的继承体系表,运行时动态查找 [1] http://blog.csdn.net/chosen0ne/article/details/10350305

对java多态的理解

java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解. 但当我这样定义时: Animal a = new Cat(); 表示定义了一个Animal类型的引用,指向新建的Cat类型的对象.由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的. 那么这样做

Spark用Java实现二次排序的自定义key

本人在研究Spak,最近看了很多网上的对于SPARK用Java实现二次排序的方法,对于自定义key的做法 基本上都是实现Ordered<>接口,重写$greater.$greater$eq.$less.$less$eq.compare.compareTo方法,定义hashCode.equals····· 感觉好麻烦,其实我们自定义key只是用了里面的compareTo方法,其他的$greater.$greater$eq.$less.$less$eq.compare 不用做任何改动,hashCo

Java实现二维码技术探讨。

Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 能够用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourceforge.net/

Java多态小总结

多态,又可以称为动态绑定,即在运行时确定类型,比如: 1 class A { 2 void draw(){ 3 //输出“A” 4 } 5 } 6 class B { 7 void draw(){ 8 //输出“B” 9 } 10 11 } 这种关系里,如果调用A a = new B(); 此时,被称为向上转型,a的类型可能在很早之前被生命,而在这时候被明确指明是其子类型, 我们如果要去调用draw()方法的时候,会调用输出“B”,这样,便是Java中的“多态”.我们称其为“向上转型”. 但是,

JAVA多态示例

这多态,我觉得是最利害的.在开发大型程序中. 但,也是需要经过足够多的实践经验才能随心利用的. class Quadrangle{ private Quadrangle[] qtest = new Quadrangle[6]; private int nextIndex = 0; public void draw(Quadrangle q){ if(nextIndex < qtest.length){ qtest[nextIndex] = q; System.out.println(nextIn

java 生成 二维码 和jquery 生成二维码

生成二维码 Java 生成二维码: 思路为拿到jar 包知道里面的方法使用 Step one : 在https://github.com/zxing中下载(点击网页中名为 zxing 的a标签,跳转到源码页面,点击release 查看所有发布的源码,下载zip压缩文件 Step two:  解压文件后打开文件夹,将core包和javase包 中的com包拷贝到一java项目src目录下.右键导出 jar file  得到一个二维码开发的jar包 Step three: 进行二维码制作 impor