• 多态是如何产生的:


    下面的代码完整阐述了多态的产生过程和其特性:

    import static java.lang.System.*;
    class BaseClass{
    	public int book=6;
    	public void base(){
    		out.println("BaseClass类的base()方法!");
    	}
    	public void test(){
    		out.println("BaseClass类的test()方法!");
    	}
    }
    
    public class SubClass extends BaseClass{
    	//-重写,但是类型不一样
    	public String book="这是字符类型的book变量!";	
    
    	public void sub(){
    		out.println("SubClass类的sub()方法!");	
    	}
    		
    	//-重写
    	public void test(){
    		out.println("SubClass类覆写BaseClass类的test()方法");
    	}
    
    	public static void main(String[] args){
    		//-编译类型和运行类型完全一样,不存在多态
    		BaseClass b=new BaseClass();
    		out.println(b.book);
    		b.base();
    		b.test();
    
    		//-编译类型和运行类型完全一样,不存在多态
    		SubClass s=new SubClass();
    		out.println(s.book);
    		s.sub();
    		s.test();
    
    		//-编译类型和运行类型不一样,出现多态:
    		//-编译类型为BaseClass类,运行类型为SubClass类
    		BaseClass bs=new SubClass();
    		//-变量在程序编译时,已经由编译类型确定,所以这里输出BaseClass 类中的book变量:6
    		out.println(bs.book);
    		//-方法的调用在程序编译时,由运行类型指定,所以这里调用的是SubClass类中继承自BaseClass类中的base()方法
    		bs.base();
    		//-方法的调用在程序编译时,由运行类型指定,所以这里调用的是SubClass类中覆写的base()方法
    		bs.test();
    		//-BaseClass类中不存在sub()方法,编译时就会报错,编译不通过
    		//bs.sub();
    	}
    	
    }
    

    运行结果:

    总结:

    1、java引用变量有两种类型:编译时类型、运行时类型

    2、编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象类型决定

    3、如果编译时类型和运行时类型不一致,就出现了所谓的多态

    如上代码所示,在声明bs变量的时候:

    BaseClass bs:声明bs的类型为BaseClass类型

    =new SubClass():赋给bs的对象类型为SubClass类型

    所以 bs这个对象就存在多态!!!

    3.1、变量:由编译类型决定

    3.2、方法:编译阶段只能调用编译类型所具有的方法,运行时则执行运行类型所执行的方法

  • 相关阅读:
    转:VScode+Latex+SumatraPDF反向搜索失败解决办法
    Hierarchical Multilabel Classification (HMC)的定义
    Atomikos
    TCP四次挥手
    多种方式使用js填充[0, 1, 2, ...., 99]
    输入URL到页面渲染整个流程
    手写Promise
    奇安信——C++代码安全服务器开发一、二面
    元戎启行——C++后端研发岗一面——一面挂
    欢乐互娱——C++服务器开发一面——一面挂
  • 原文地址:https://www.cnblogs.com/baby-zhude/p/8035079.html
Copyright © 2020-2023  润新知