文档章节

java中继承实现多态的研究

Rocky_chi
 Rocky_chi
发布于 2015/10/20 14:18
字数 760
阅读 69
收藏 3

众所周知,java的多态有三种实现形式。一种是通过方法重载,一种是实现借口,一种是继承父类。当然这只是简便说法,比如继承里面要有多态,必须有方法重写,且有父类对象指向子类实例。下面就是我做的测试

public class ExtendTest {
    public static void main(String[] args) {
	Father father = new Child();//Java polymorphism
	father.fatherMethod();
	father.publicMethod();
//	father.childMethod();//error, parent class can not access child method "childMethod".
	Child.staticMethod();//render static method using class name directly.
	Father.staticMethod();//render static method using class name directly.
    }
}

class Father {
    //1, before initialize.
    static {
	System.out.println("father pre static method.");
    }
    //3, constructor method.
    public Father() {
	System.out.println("father constructor initialized.");
    }
	
    private void privateMethod() {
	System.out.println("father private method.");
    }

    public void fatherMethod() {
	privateMethod();//this is the way to render private method in parent class
	System.out.println("father self method.");
    }
	
    public void publicMethod() {
	System.out.println("father public method.");
    }
	
    public static void staticMethod() {
	System.out.println("father static method.");
    }
	
}

class Child extends Father {
    //2, before initialize.
    static {
	System.out.println("child pre static method.");
    }
    
    //4, constructor method.
    public Child() {
	System.out.println("child constructor initilized.");
    }
	
    public void childMethod() {
	System.out.println("child slef mehtod.");
    }
	
    @Override
    public void publicMethod() {
	System.out.println("child public method.");
    }
	
    //@Override    //error, static method can not be overrided.
    public static void staticMethod() {
	System.out.println("child static method.");
    }

}

输出结果如下:

father pre static method.
child pre static method.
father constructor initialized.
child constructor initilized.
father private method.
father self method.
child public method.
child static method.
father static method.

想必这还是比较好理解的。


下面是一个略微有些妖的关于继承的问题:

public class ExtendTestPro {
	
    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(a2.show(b));//B and A
        System.out.println(a2.show(c));//B and A
        System.out.println(a2.show(d));//A and D
        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
    }
}

class A {
    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");
    }
    public String show(A obj ){
       return ("B and A");
    }
}

class C extends B {}

class D extends B {}

第一个输出其实就体现了java的多态了。a1.show(b)输出的是"A and A",因为A类里面没有public String show(B obj){}这样的方法,所以这里把b类强转成了A类,类似这样:A a = (A)b; 所以调用的是public String show(A obj){}方法。

第四个a2.show(b)为什么输出"B and A"?这应该就是最妖的一个了。首先要理解A a2 = new B(); 这句话做了什么。其实它是创建了两个对象,一个A对象a2,一个B对象,而a2是指向B对象的。所以归根结底a2还是个A(父类)对象,不能调用子类新定义的方法。所以当走到a2.show(b)的时候,它其实去调用的是public String show(A obj){}方法,而恰好这个方法被子类B重写了,所以输出"B and A"。

第八个之所以输出"B and B" 而不是 "B and A",是因为它只会去找它最近的父类来强转它。比如这里的c对象,就会用B类来转,而不是A类。

© 著作权归作者所有

共有 人打赏支持
Rocky_chi
粉丝 0
博文 12
码字总数 6459
作品 0
私信 提问
小谈Java Enum的多态性

Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态? 不过还是先看看“现象”吧: Java代码 public enum Fruit { APPLE, PEAR, PEACH, OR...

关西大汉弹琵琶
2015/05/30
0
0
从程序员走向java架构师的书籍推荐!

作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想...

欧阳海阳
07/16
0
0
多态在 Java 和 C++ 编程语言中的实现比较

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对...

Jerikc
2013/12/03
0
1
初试刀 浅谈Java和C#在面向对象上语法的区别

 做了几年了开发一直没有总结什么,回到了家乡的小城做了一名培训班的教员,教授软件开发的知识。细小的知识从头细细嚼来,别有一番滋味。或是以前遗漏的太多,或是确实没有系统的学习过,教...

夜默
2013/06/18
0
0
主流嵌入式Linux动态扩展技术比较分析

随着嵌入式技术的快速发展和嵌入式设备的普及,嵌入式应用发展的一个关键趋势是从静态的、固定的系统功能到动态的、可扩展的系统功能。 本文主要进行嵌入式Linux系统内核动态扩展技术的讨论。...

jtihj
2009/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

“敏捷开发”怎么就“敏捷”了

什么是敏捷开发 传统的软件开发过程中,我们往往会针对特定的用户需求,采用“瀑布模型”,从用户的需求开始一步步进行需求分析、软件设计、软件开发、软件测试以及软件交付与维护。 然而,这...

SamYjy
48分钟前
3
0
聊聊我怎么系统学习Linux技能并快速提高的

随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能。而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱好者们的喜爱。今天我们就来和大家一起聊一...

linuxprobe16
今天
3
0
MySQL专题—— 从认识索引到理解索引【索引优化】

认识索引 认识索引是什么东西非常关键,一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系,为了方便查找书中的内容,通过对内容建立索引形成目录。因此,首先你要明白的一点就是,...

架构师springboot
今天
2
0
Java-怎样构造方法和匿名对象

前言 在编写程序时不安全的初始化会导致程序发生发生重大错误。为了使程序可以被安全地初始化,C++引入了构造器(也可以成为构造方法)的概念,这是一个在创建对象时被自动调用的特殊方法。J...

小刀爱编程
今天
2
0
7、MyBaties 增删改

事务 : 从数据库角度出发,完成业务时需要执行的 SQL 集合,统称一个事务. 1、在 mybatis 中默认是关闭了 JDBC 的自动提交功能 每一个 SqlSession 默认都是不自动提交事务. session.commit()提...

KingFightingAn
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部