Java 编译时多态和运行时多态

Java 编译时多态和运行时多态根据何时确定执行多态方法中的哪一个,多态分为两种情况:编译时多态和运行时多态。如果在编译时能够确定执行多态方法中的哪一个,称为编译时多态,否则称为运行时多态。一、编译时多态    方法重载都是编译时多态。根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法中的哪一个。    方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则

大家好,又见面了,我是你们的朋友全栈君。

        根据何时确定执行多态方法中的哪一个,多态分为两种情况:编译时多态和运行时多态。如果在编译时能够确定执行多态方法

中的哪一个,称为编译时多态,否则称为运行时多态。


一、编译时多态

       方法重载都是编译时多态。根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法中的哪一个。

        方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。例如,以下声明p、m引用本类实例,调用toString()方法是编译时多态。


public class Test {

	public static void main(String[] args) {
		Person p = new Person();         //对象引用本类实例
		Man m = new Man();               //编译时多态,执行Person类的toString()
		System.out.println(p.toString());
		System.out.println(m.toString()); //编译时多态,执行Man类的toString()
	}
}

class Person{
	public String toString() {
		String name = "Person";
		return name;
	}
}

class Man extends Person{
	public String toString(){
		String name = "Man";
		return name;
	}
}

二、运行时多态

1.当以下父类对象p引用子类实例时,p.toString)执行谁的setName()方法?

Person p = new Man();   
p.toString();


       Java支持运行时多态,意为p.toString()实际执行p所引用实例的toString(),究竟执行Person类还是Man类的方法,运行时再确定。如果Man类声明了toString()方法,则执行之;否则执行Person类的toString()方法。


        程序运行时,Java从实例所属的类开始寻找匹配的方法执行,如果当前类中没有匹配的方法,则沿着继承关系逐层向上,依次在父类或各祖先类中寻找匹配方法,直到Object类。寻找p.toString()匹配执行方法的过程如下图所示。


Java 编译时多态和运行时多态
        因此,父类对象只能执行那些在父类中声明、被子类覆盖了的子类方法,如toString(),不能执行子类增加的成员方法。


2.将上述例子中toString方法改为getName,因为在Object类中有toString类,无法测试Person与Man中所匹配的执行方法。

public class Test {   //例子2
	public static void main(String[] args) {
		Person p = new Man();
		System.out.println(((Man) p).getName());   //返回结果为Man
	}
}

class Person{}

class Man extends Person{
	public String getName(){
		String name = "Man";
		return name;
	}
}

此例中Person类型要引用Man类的实例,因Person中未定义setName()方法,故需要把Person类显式地转换为Man类,然后调用Man中的getName方法。


3.将例子1中Person和Man的方法名改为静态的getName()方法,会返回什么结果呢?

public class Test {   //例子3

	public static void main(String[] args) {
		Person p = new Man();
		System.out.println(p.type);        //返回结果为P
		System.out.println(p.getName());   //返回结果为Person

	}

}

class Person{

	String type = "P";
	public static String getName() {
		String name = "Person";
		return name;
	}
}

class Man extends Person{
	
	String type = "M";
	public static String getName(){
		String name = "Man";
		return name;
	}
}

        
栗子中子类Man隐藏父类Person的属性,而 Person p = new Man() 表示“先声明一个Person类的对象p,然后用Man类对
p进行实例化”,即引用类型为Person类,实际代表的是Man类。因此,访问的是Person的属性及静态方法,详细解释如下。


        所谓静态,就是在运行时,虚拟机已经认定此方法属于哪个类。“重写”只能适用于实例方法,不能用于静态方法。对于静态方法,只能隐藏,重载,继承。

       子类对于父类静态方法的隐藏(hide),子类的静态方法完全体现不了多态,就像子类属性隐藏父类属性一样,在利用引用访问对象的属性或静态方法时,是引用类型决定了实际上访问的是哪个属性,而非当前引用实际代表的是哪个类。因此,子类静态方法不能覆盖父类的静态方法。 

        父类中属性只能被隐藏,而不能被覆盖;而对于方法来说,方法隐藏只有一种形式,就是父类和子类存在相同的静态方法。

参考文献:

Java程序设计实用教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141894.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微生物生态排序分析——CCA分析

    微生物生态排序分析——CCA分析微生物生态排序分析 CCA 分析 library vegan library ggplot2 library permute library lattice sa4 read table spes csv header T row names 1 sep S8 p read table S8 p csv header T se

    2025年8月11日
    2
  • idea 激活码【中文破解版】

    (idea 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    44
  • datagrip的激活码【中文破解版】

    (datagrip的激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月31日
    45
  • IRP

    IRP

    2021年8月17日
    88
  • dump文件分析工具有哪些_java分析dump文件

    dump文件分析工具有哪些_java分析dump文件与具有众多的内存转储机制一样,Linux下也有众多的内存转储分析工具,下面将会逐一做简单介绍。Lcrash是随LKCD一起发布的一个内内存储分析工具。随着LKCD开发的停止,lcrash的开发也同时停止了。目前它的代码已经被合并进入Crash工具中。Alicia(AdvancedLinuxCrash-dumpInteractiveAnalyzer,高级Linux崩溃…

    2022年10月2日
    2
  • PAT乙级题目答案汇总 PAT (Basic Level) Practice (中文)[通俗易懂]

    PAT乙级题目答案汇总 PAT (Basic Level) Practice (中文)[通俗易懂]题目列表:标号题目链接分数博客链接完成时间1001害死人不偿命的(3n+1)猜想151001害死人不偿命的(3n+1)猜想(15分)2020/8/01

    2022年5月29日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号