文档章节

java中继承实现多态的研究

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

码上生花,ECharts 作品展示赛正式启动!>>>

众所周知,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
粉丝 2
博文 52
码字总数 62327
作品 0
杭州
高级程序员
私信 提问
加载中
请先登录后再评论。
Java2019年第二学期课程总结

#期末课程总结 ##一、Java基础程序设计 1、认识Java ###2、简单的Java程序 3、运算符 4、程序的结构 二、Java面对对象程序设计 1、类 2、封装 3、继承 4、多态 this关键字 static关键字 main...

osc_27xxmyzv
2019/12/12
2
0
Java编程思想(第4版)pdf

下载地址:网盘下载 内容简介编辑 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C++以及Java语言都有独到、深入的见解,...

osc_3www0d3o
2018/02/05
3
0
Java编程思想(第4版)pdf

下载地址:网盘下载 内容简介编辑 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C++以及Java语言都有独到、深入的见解,...

osc_3www0d3o
2018/02/05
1
0
20165323 实验二 Java面向对象程序设计

一、实验报告封面 课程:Java程序设计 班级:1653班 姓名:杨金川 学号:20165323 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:13:45 - 15:25 实验序号:二 实验名称:Java面向对象...

osc_sw8x2l4l
2018/04/16
2
0
你如何在C ++中声明一个接口?

如何设置代表接口的类? 这只是一个抽象的基类吗? #1楼 如果您使用的是Microsoft的C ++编译器,那么您可以执行以下操作: 我喜欢这种方法,因为它会导致更小的接口代码,并且生成的代码大小...

javail
2019/12/19
41
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis之foreach用法

在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item,index,collection,ope...

osc_0hs26yvj
13分钟前
0
0
css笔记整理

0索引 1html标签块 2选择器 3CSS的引入方式: 4CSS浮动 :流式布局 5盒子模型 6案例一网站首页 7案例二网站注册页面 1html标签块 div标签:默认占- -行,自动换行 span标签:内容显示在同- -行 <!...

osc_3grma05a
14分钟前
3
0
js获取图片的EXIF,解决图片旋转问题

相信大家在做项目的时候会遇到在canvas里加入图片时,图片发生90°,180°的旋转。当时的你肯定时懵逼的,为毛。 其实这就是图片的EXIF搞的鬼。 什么是EXIF 简单来说,Exif 信息就是由数码相...

osc_ytmgp8ea
15分钟前
0
0
StringUtils.isEmpty()和isBlank()的区别

一、概述 两种判断字符串是否为空的用法都是在程序开发时常用的,相信不少同学在这种简单的问题上也吃过亏,到底有什么区别,使用有什么讲究,带着问题往下看。 二、jar包 commons-lang3-3....

osc_1mofhvr6
17分钟前
11
0
H5嵌入钉钉

1,需要在项目种引入钉钉官方的js <script type="text/javascript" src="http://g.alicdn.com/dingding/dingtalk-jsapi/2.3.0/dingtalk.open.js" ></script> 或者npm 也可以的 2,钉钉......

osc_ucqb2u3q
18分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部