多态的两个小例子

class A {
    public String show(B 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");
    }
}
public class Test2 {
    public static void main(String[] args) {
        A a2 = new B();
        System.out.println(a2.show(a2));//输出B and A
        System.out.println(a2.getClass().getTypeName());//输出cn.bh.tt.B
        /*总结:1.当A new出子类a2,a2的类型是B,所以调用show()方法时,会先在子类B里面找,
         * 如果找不到再去父类A里面找。
         * 2.最有意思的是a2调用了show(A obj)而不是show(B obj),应该是因为a2是由A new出来的所以在充当
         * 参数的时候会向上转型为A。
         * */
    }
}
class A{
    public int i=7;//父类属性 i
    public A(){    //父类无参构造器
        print();
    }              //父类方法print()
    public void print(){
        System.out.print(i);
        System.out.println("父类方法");
    }
}
public class Polymorphic2 extends A{
    public int j=4;       //子类属性 j
    public Polymorphic2(){ //子类无参构造器
        print();
    }
    public void print(){  //子类方法print
        System.out.println(j);
        System.out.println("子类方法");
    }
    public static void main(String[] args){
        new Polymorphic2();
        /*输出为0<br>4:子类先默认隐式调用父类构造器,由于print被子类重写,所以调用子类方法,但此时j是还没有初始化的,所以输出为0
        */
    }
}

原文地址:https://www.cnblogs.com/bihanghang/p/9956897.html

时间: 2024-11-29 08:40:44

多态的两个小例子的相关文章

c/c++ 继承与多态 文本查询的小例子(非智能指针版本)

问题:在上一篇继承与多态 文本查询的小例子(智能指针版本)在Query类里使用的是智能指针,只把智能指针换成普通的指针,并不添加拷贝构造方法,会发生什么呢? 执行时,代码崩掉. 分析下面一行代码: Query qb = ~Query("Alice"); 1,首先调用Query(string)的构造函数,把Query的成员q指向了new WordQuery(s) Query::Query(const std::string& s) : q(new WordQuery(s)){ s

用两个小例子来解释单例模式中的“双重锁定”

学习单例模式时,好多人都不太理解双重锁定.学完后突然想到一个很有趣的例子. 单例模式结构图: 代码: Singleton类 class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); //程序运行时创建一个静态只读的进程辅助对象 private Singleton() { } //用private修饰构造方法,防止外界利用new创建此类实例

关于oracle触发器的两个小例子

今天接到一个任务,需要修改触发器,因为好久都没有看过关于oracle触发器的东东了,所以这里通过两个简单的小例子复习下触发器,以备忘. 1. 案例一 需求:建立触发器,判断员工工资,如果小于0,则改为0:如果大于10000,则改为10000 建表: create table emp1( e_id number primary key not null, e_no number, e_name varchar2(20), e_sal number ) select * from emp1; cre

学习HttpClient,从两个小例子开始

前言 HTTP(Hyper-Text Transfer Protocol,超文本传输协议)在如今的互联网也许是最重要的协议,我们每天做的很多事情都与之有关,比如,网上购物.刷博客.看新闻等.偶尔你的上级还会安排任务给你让你去对接API接口(RESTFUL),你接到任务后,啪啪的敲了一行又一行代码,一遍敲着一遍心里骂着:这是谁设计的这样脑残接口,一点都不好用,对接起来非常麻烦,最终,你怀着极其复杂的心情把api对接完了.有一天你的上级叫你去开发一个API接口,你情绪高涨,把接口开发完了,结果...

两个小例子

public class Cal { //交换两个变量的值 //排序 public void sort(int []a){ for (int i = 0; i < a.length-1; i++) { for (int j = 0; j < a.length-1-i; j++) { if(a[j]>a[j+1]){ int t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } //调用另一个方法 print(a); //可以提高复用性 } //输出数组中的所有元素 p

数值处理的两个小例子

2的N次方 注意:这里在处理的时候并没有用循环来处理,而是用移位的做法.    n<<4  就是 n*2^4    ,所以在本例中只需要写 1<<time  (time是要求的精度). 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main(){ 4 int time; 5 printf("要求出2的多少次方:"); 6 scanf("%d",&time) ;

关于Finereport移动端报表二次开发的两个小例子

例1:刷新页面 1. 问题描述 A超链至B填报,B提交数据后返回A时,A自动刷新显示新的数据. 2. 解决方案 1. contentPane.setAppearRefresh();  //在A的加载结束后事件中添加js 3. 示例 3.1 打开报表 %FR_HOME%\WebReport\WEB-INF\reportlets\doc\Advanced\mobile-client\ DetailedDrillA.cpt %FR_HOME%\WebReport\WEB-INF\reportlets\

freemarker入门小例子

我用freemarker做了两个小例子,主要的东西是:两个Test文件,一个Animal实体类,一个ftl模板---freemarker的模板,我使用maven做的java工程案例.主要结构内容如下图: 注意:需要导入freemarker的jar包: 1.首先我们先来了解一下freemarker的概念: freeMarker概述: FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写: FreeMarker被设计用来生成HTML Web页面,特别是基于MVC

python2.7练习小例子(二十四)

    24):1.题目:利用递归方法求5!.     程序分析:递归公式:fn=fn_1*4! #!/usr/bin/python # -*- coding: UTF-8 -*- def fact(j): sum = 0 if j == 0: sum = 1 else: sum = j * fact(j - 1) return sum print fact(5)     以上实例输出结果为: 120     python3 参考方案: def Factorial(n):     if n ==