`

Java多态机制中的绑定规则

 
阅读更多
package com.example;

public class Base {

	String var = "BaseVar"; // 实例变量
	static String staticVar = "StaticBaseVar"; // 静态变量

	void method() // 实例方法
	{
		System.out.println("Base method");
	}

	static void staticMethod() // 静态方法
	{
		System.out.println("Static Base method");
	}

}

package com.example;

public class Sub extends Base {

	String var = "SubVar"; // 实例变量
	static String staticVar = "StaticSubVar"; // 静态变量

	void method() // 隐藏父类的method()方法
	{
		System.out.println("Sub method");
	}

	static void staticMethod() // 隐藏父类的staticMethod()方法
	{
		System.out.println("Static Sub method");
	}

	String subVar = "Var only belonging to Sub";

	void subMethod() {
		System.out.println("method only belonging to Sub");
	}

	public static void main(String args[]) {
		// 引用变量who被声明为Base类型,引用Sub类的实例
		Base who = new Sub();

		// 成员变量(静态变量,实例变量)与引用变量所声明的类型(Base类型)的成员变量绑定
		System.out.println("who.var = " + who.var); // 所以,打印Base类的var变量

		System.out.println("who.staticVar = " + who.staticVar); // 所以,打印Base类的staticVar变量

		// 实例方法与引用变量实际引用的对象(Sub对象)的方法绑定
		who.method(); // 所以,打印Sub实例的method()方法

		// 静态方法与引用变量所声明的类型(Base类型)的方法绑定
		who.staticMethod(); // 所以,打印Base类的staticMethod()方法
	}
}


1.对于一个引用类型的变量,Java编译器按照它声明的类型来处理.
   例如在以下代码中,编译器认为who是Base类型的引用变量,不存在subVar成员变量和subMethod()方法,编译报错
    Base who = new Sub(); //引用变量who被声明为Base类型,引用Sub类的实例
          who.subVar = "123";   //编译错,在Base类中没有subVar属性
          who.subMethod();   //编译错,在Base类中没有submethod()方法

   如果要访问Sub类的成员,必须通过强制类型转换:
   Base who = new Sub();
   //把Base引用类型的who成员变量强制转换为Sub引用类型
   //把引用变量转换为子类的类型称为向下转型,把引用变量转换为父类的类型称为向上转型
   ((Sub)who).subVar = "123";
   ((Sub)who).subMethod();
   Java编译器允许在具有直接或间接继承关系的类之间进行类型转换,对于向上转型,Java编译器会自动进行,对于向下转型,需要进行强制类型转换
   如果两种类型之间没有继续关系,即不在继承树的同一个继承分支上,那么Java编译器不允许进行类型转换

2.对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象来处理
   例如以下代码虽编译可通过,但运行时会抛出ClassCastException运行时异常
   Base who = new Base();   //who引用Base类的实例
   Sub s = (Sub)who;   //运行时会抛出ClassCastException
   在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子类类型

3, 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
   1, 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的

   2, 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定

   3, 成员变量(静态变量,实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经绑定



分享到:
评论

相关推荐

    深入Java核心 Java中多态的实现机制.docx

    首先,多态的实现机制基于Java的动态绑定(Dynamic Binding)。在Java中,当一个基类引用指向一个派生类对象,并调用方法时,实际执行的是子类中重写(Override)的方法,而非基类的方法。这是因为Java在运行时会...

    关于Java多态实例共3页.pdf.zip

    Java多态是面向对象编程中的一个核心概念,它在Java编程中扮演着至关重要的角色。在Java中,多态性(Polymorphism)允许我们使用一个接口来引用不同类型的对象,使得代码更具通用性和可扩展性。这允许我们编写出更加...

    Java面向对象的3大特征之多态

    此外,父类引用指向子类对象也是实现多态的关键,这在Java中表现为父类类型的引用变量实际存储子类对象的引用。 方法重载是静态多态的一种形式,它指的是在同一个类中定义多个同名方法,但是方法的参数列表不同。在...

    关于继承多态集合和IO的一个例子

    在Java编程语言中,继承、多态、集合和IO流是核心概念,它们构成了程序设计的基础框架。让我们逐一深入探讨这些知识点。 首先,**继承**是面向对象编程的一个关键特性,它允许一个类(子类)继承另一个类(父类)的...

    学习Java,你需要知道这些——接口与多态

    总之,接口和多态是Java中实现抽象和解耦的重要工具,它们让代码更具有灵活性、可维护性和扩展性,也是理解面向对象编程的关键点。通过学习和熟练运用接口与多态,开发者可以编写出更加高效、可复用的代码。

    java源代码,java源代码

    1. **基本语法**:Java源代码遵循特定的语法规则,包括变量声明、数据类型(如int, String, boolean等)、控制结构(如if-else, switch, for, while循环)、函数定义、类和对象等。了解这些基础语法是编写Java程序的...

    Java高级:动态绑定实现机制

    动态绑定是Java编程语言中一个核心特性,它与多态性紧密相关,为代码提供了高度的灵活性和可扩展性。动态绑定的实现机制是Java虚拟机(JVM)在运行时根据对象的实际类型来确定调用哪个方法,而不是在编译期间就已经...

    Java基础教程

    - **动态绑定**:Java全面支持动态绑定机制。 - **分布式特性**:Java内置了网络通信的支持,例如通过`java.net`包中的类如`Socket`、`ServerSocket`等实现网络通信。 - **健壮性**:Java的强类型机制、异常处理...

    java方法匹配原则

    ##### 3.1 Java中的多态实现 Java通过虚拟函数表实现多态。每个类都有一个虚拟函数表,其中包含所有非静态方法的地址。当一个方法被调用时,JVM会根据实际对象类型查找虚拟函数表中的正确地址。 在继承的情况下,...

    平安面试题目 java

    - 什么是Java中的封装、继承和多态?它们在面向对象编程中的作用是什么? - 介绍Java中的访问修饰符(public, protected, private, default)以及它们的适用场景。 - Java中的数据类型有哪些?它们之间的转换规则...

    java知识要点总结.rar

    理解多态在运行时的动态绑定以及强制类型转换的规则,对于写出高效且具有弹性的代码至关重要。 8. **TCP和UDP的最完整的区别.pdf**:TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的网络传输协议。TCP提供...

    全国计算机等级考试二级Java语言程序设计考试大纲201

    Java的继承和多态机制是实现代码复用和扩展性的关键。考生需掌握抽象类和接口的使用,理解多态的实现原理,包括动态绑定和向上转型。此外,掌握内部类、枚举、泛型等高级特性,能够编写更加灵活和可扩展的代码。 ##...

    java小demo,无数据库,只能看看代码

    在本Java小Demo中,我们主要探讨的是Java编程的基础概念和一些常见的编程技巧。由于这个项目没有涉及到数据库的使用,我们可以将重点放在Java的核心特性、类库和编程实践中。 首先,Java是一种面向对象的编程语言,...

    java中与继承有关的程序内存分析

    在Java编程语言中,继承是面向对象特性的重要组成部分,它允许一个类(子类)从另一个类(父类)继承属性和方法。这种机制有助于代码重用和构建复杂的类层次结构。当我们谈论“java中与继承有关的程序内存分析”时,...

    corejava java core

    理解它们的存储方式和运算规则是学习Java的第一步。 2. **对象和类**:Java是一种面向对象的语言,对象是程序的基本构造块。类是创建对象的模板,包含数据(字段)和行为(方法)。 3. **封装、继承和多态**:这是...

    java习题参考答案

    - **应用实例**: 在Java中定义类,通过继承、封装、多态等特性来构建复杂的软件系统。 **1.3 分布性** - **特点说明**: Java支持数据和操作的分布,使得开发者能够轻松地在网络环境中部署应用程序。 - **应用实例**...

    Head-First-Java-master_java_java编程_HeadFirst_

    了解泛型的使用规则和限制,如类型擦除,是现代Java开发的必备知识。 9. **网络编程**:Java提供了Socket和ServerSocket类,可以用于创建客户端和服务器端的网络应用程序。理解TCP和UDP协议,以及如何进行套接字...

Global site tag (gtag.js) - Google Analytics