当前位置: 首页 > news >正文

多态,覆盖,重载

多态:

public class Test {    
    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("1--" + a1.show(b));  
        /*
         *a1是 A是自身的实例,且A是父类
         * a1是A的实例,b是B的实例,且A是父类
         * A中没有show(B b)方法
         * 根据优先级法则:再按优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
         * 因为A是父类,所以this.show(O)、super.show(O)不符合条件(即引用的对象不符合要求)
         * this.show((super)O)进行检查:(即进行参数检验)b的父类是A,则变成判断A中有没有show(A a)方法,(这里只看参数)
         * 发现有,则执行,A中的show(A obj)方法,  return ("A and A");   
         * */
        System.out.println("2--" + a1.show(c));  
        /*
         * 同上,
         * a1是A是自身的实例,且A是父类
         * A中没有show(C c)方法,又因为B是C的父类
         * 则看A中没有show(B b)方法,发现也没有,又因为A是B的父类,
         * 则看A中没有show(A a)方法,发现有
         * 执行A.show(A a)输出return ("A and A"); 
         * 
        */
        System.out.println("3--" + a1.show(d)); 
        /*
         * 同上,
         */
        System.out.println("4--" + a2.show(b));  
        //4--B and A .首先a2是A引用,B实例,调用show(B b)方法,
        //此方法在父类A中没有定义,所以B中方法show(B b)不会调用(多态必须父类中已定义该方法),
        //再按优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
        //,即先查this对象的父类,没有重头再查参数的父类。查找super.show((super)O)时,B中没有,再向上,找到A中show(A a),因此执行。  
  
        System.out.println("5--" + a2.show(c));  //同上  
        System.out.println("6--" + a2.show(d)); 
        /*//A and D .查找B中没有show(D d)方法,再查A中,有,执行。  
         * a2是A的引用,B的实例
         * 先看B中有没有show(D d),没有(即根据this.show(O)判断),又因为A是B的父类
         * 再看A中有没有show(D d),有(即根据super.show(O)判断),则执行A.show(D d)方法,return ("A and D");  
         * */        
        System.out.println("7--" + b.show(b));   
        /*调用B.show(B b)方法*/
        System.out.println("8--" + b.show(c));  
       /* //B and B .  
        * b是B的实例
        * 先看B中有没有show(C c)方法,没有。 又因为A是B的父类
        * 再看A中有没有show(C c)方法,,没有。又因为B是C的父类
        * 再看B中有没有show(B b)方法,。有,执行B.show(B b),return ("B and B");  ;
        * */       
        System.out.println("9--" + b.show(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{    
    
}    
    



class C1 
{
	public void f() {
		System.out.println("C1.f");
	}
}
//c1.f()与c2.f()覆盖
//c3.g(C1 one)与c3.g(C2 two)重载
class C2 extends C1
{
	public void f() {
		System.out.println("C2.f");
	}  
}
class C3 {
	public void g(C1 one) {
		System.out.println("g(C1)");
		one.f();
	}
	public void g(C2 two) {
		System.out.println("g(C2)");
		two.f();
	}
}
public class Main1 
{
	public static void main(String[] args) {
		C1 one = new C2();
		C3 three = new C3();
		three.g(one);
		/*
		 *
		 * three是C3的实例
		 * three.g(one);根据重载的原理,根据参数判断,执行的是 three.g(C1 one)方法,System.out.println("g(C1)");one.f();
		 * 在该方法里面调用one.f();
		 *  one是C1的引用,C2的实例
		 *  先看父类C1里面有没有f()方法,有
		 *  再看C2里面有没有继承该f()方法,也有,继承了父类的该方法
		 *  则执行C2里的f()方法,System.out.println("C2.f");
		 *  
		 * 
		 */
	}
}

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。


我们将介绍在Java中,当设计类时,被重写的方法的行为怎样影响多态性。

我们已经讨论了方法的重写,也就是子类能够重写父类的方法。

当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。

要想调用父类中被重写的方法,则必须使用关键字super。


Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。



覆盖与重载:



相关文章:

  • 多线程:Java中实现多线程的两种方式之间的区别
  • 查看python已经安装的包
  • java:VTKImagedata绘制三维体
  • python :sort() , sorted() , searchsorted(), np.linspace() ,mean()
  • Spring总结
  • IoC
  • 解决散点数据插值中的问题:输入含有 NaN 的数据
  • pykrige.ok3d.OrdinaryKriging3D函数定义分析
  • 克里金插值程序
  • mysql “group by ”与order by的研究
  • struts2校验、ajax校验、javascript验证有何区别及联系?
  • Struts2之validate数据校验两种方式,SSH框架之Struts的验证总结、验证的错误处理
  • Spring AOP解析,Spring实现AOP的4种方式
  • java反射机制,函数调用
  • 过滤器、监听器、拦截器
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【Leetcode】104. 二叉树的最大深度
  • 【node学习】协程
  • canvas 绘制双线技巧
  • JDK 6和JDK 7中的substring()方法
  • PAT A1017 优先队列
  • 阿里云Kubernetes容器服务上体验Knative
  • 服务器从安装到部署全过程(二)
  • 解析带emoji和链接的聊天系统消息
  • 突破自己的技术思维
  • 函数计算新功能-----支持C#函数
  • !!Dom4j 学习笔记
  • #FPGA(基础知识)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (9)目标检测_SSD的原理
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (转)可以带来幸福的一本书
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .md即markdown文件的基本常用编写语法
  • .naturalWidth 和naturalHeight属性,
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net IOC框架入门之一 Unity
  • .NET导入Excel数据
  • .NET的数据绑定
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [CF482B]Interesting Array
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [go] 迭代器模式
  • [GXYCTF2019]BabyUpload1 -- 题目分析与详解
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • [HTTP]HTTP协议的状态码
  • [iOS开发]事件处理与响应者链