文档章节

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架构师的书籍推荐!

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

欧阳海阳
07/16
0
0
J2EE学习中一些值得研究的开源项目

摘要:这篇文章写在我研究J2SE、J2EE近三年后。前3年我研究了J2SE的Swing、Applet、Net、RMI、Collections、 IO、JNI……研究了J2EE的JDBC、Sevlet、JSP、JNDI…..不久我发现这些好像太浮浅了...

要做攻城师的志
2012/09/01
0
7
转: 面试感悟:3年工作经验java程序员应有的技能

第一阶段:三年 我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人。这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级...

欧阳海阳
06/01
0
0
主流嵌入式Linux动态扩展技术比较分析

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

jtihj
2009/12/19
0
0
面试感悟—-一名3年工作经验的程序员应该具备的技能

文章来自:五月的仓颉 五月的仓颉 是一位非常优秀,乐于分享的大神,目前就职阿里 原文链接:https://www.cnblogs.com/xrq730/p/5260294.html 前言 因为和同事有约定再加上 LZ 自己也喜欢做完...

chenssy
08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

df和du命令 磁盘分区

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 df 命令 查看系统磁盘空间使用情况 常用参数 -h (human-readble) # 人性化的为空间大小转换单位显示[root@centos7 ~]# df -h文件系...

robertt15
27分钟前
3
0
【a&sAI创新】华为CloudIVS轻量云:借力打力,四两拨千斤

[摘要] 1、测评表现就目前来说,AI的门槛还是比较高的,业内所熟知的算法企业,为了追求算法的极致,比如人脸识别公司,仍在不断扩大研发...   1、测评表现   就目前来说,AI的门槛还是比...

yizhichao
43分钟前
2
0
安卓安装APK报错error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

记录一个 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK问题 之前遇到这个问题 方案1 将data/data/目录下该应用的包名的目录删除掉,如:adb shell rm -rf data/data/com.demo.h...

切切歆语
44分钟前
1
0
用网关zuul时,熔断hytrix里面的坑

1,zuul 默认的隔离级别是信号量,默认最大隔离信号量是100 信号量隔离和线程池隔离的区别如下: https://my.oschina.net/u/867417/blog/2120713 默认设置: 2,zuul里隔离是按服务隔离的,也...

爱吃大肉包
44分钟前
0
0
使用SSM+Solr优雅的实现电商项目中的搜索功能

在学习了Redis&Spring-Data-Redis入门和Solr&Spring-Data-Solr入门后,接下来就该是项目实战了。这次我们用Vue.JS和ElementUI写前端页面,优雅的整合SSM-Shiro-Redis-Solr框架。 手摸手教你优...

TyCoding
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部