在面向对象编程 (OOP) 领域,多态性和重写是为编程语言带来灵活性和活力的关键概念。 Java 作为一种强大的 OOP 语言,完全支持这些功能。然而,了解这些特征适用于 Java 中的方法而不是变量是至关重要的。在本文中,我们将探讨为什么 Java 中的变量不遵循多态性和重写,从而更深入地了解 Java 的变量行为。
Java 中的多态性
多态性是一个希腊词,意思是“多种形式”,是 OOP 的一个基本概念。它允许将不同类型的对象视为公共超类型的对象,从而可以编写更灵活和可重用的代码。在Java中,多态性是通过继承、接口和方法重写来实现的。
示例
让我们看一个例子
class Animal { void sound() { System.out.println("The animal makes a sound"); } } class Cat extends Animal { @Override void sound() { System.out.println("The cat meows"); } } public class Main { public static void main(String[] args) { Animal myAnimal = new Cat(); myAnimal.sound(); } }
输出
The cat meows
在此场景中,myAnimal 是指向 Cat 对象的 Animal 引用变量。当在 myAnimal 上调用 sound() 方法时,将调用 Cat 类中的版本,而不是 Animal 类中的版本。这就是多态性,其中要调用的方法由实际对象类型决定,而不是由引用类型决定。
Java 中的重写
方法重写是 Java 中多态性的一种特定形式,其中子类提供其超类中已定义的方法的特定实现。子类中的方法必须与超类中的方法具有相同的名称、返回类型和参数。
为什么变量不遵循多态性和重写?
为什么变量不遵循多态性和重写? 与方法不同,Java 中的变量不遵循多态性和重写的概念。这种差异源于方法和变量在对象中存在和操作方式的根本差异
在Java中,实例变量属于类的实例,这意味着每个实例都有自己的实例变量副本。因此,更改一个对象中的实例变量的值不会影响同一类的其他对象。
另一方面,方法属于类本身,而不属于任何特定实例。这意味着方法与变量不同,对于类的每个对象没有单独的副本。
示例
让我们回顾一下前面的示例,但这次添加实例变量:
class Animal { String sound = "The animal makes a sound"; void makeSound() { System.out.println(sound); } } class Cat extends Animal { String sound = "The cat meows"; @Override void makeSound() { System.out.println(sound); } } public class Main { public static void main(String[] args) { Animal myAnimal = new Cat(); myAnimal.makeSound(); System.out.println(myAnimal.sound); } }
输出
The cat meows The animal makes a sound
在此代码中,myAnimal 是指向 Cat 对象的 Animal 引用。 myAnimal 上的 makeSound() 方法调用将打印“The cat meows”,但 System.out.println(myAnimal.sound) 行将打印“The Animalmakes a sound”。为什么会出现这种情况?由于方法遵循多态性,因此会执行 Cat 类中的 makeSound() 方法。但是,由于变量不遵循多态性,因此使用 Animal 类中的“声音变量”
此行为是由于变量隐藏原理造成的。如果子类中的变量与其超类中的变量同名,则子类变量隐藏超类变量
这并不意味着超类变量已被覆盖。这两个变量仍然独立存在,并且使用的变量由引用类型决定,而不是由实际对象类型决定。这就是为什么当我们通过 Animal 引用访问声音变量时,我们从 Animal 类而不是 Cat 类获取声音值。
变量覆盖与变量隐藏
在 Java 中,变量不受方法之类的重写的影响。相反,它们遵循变量隐藏的原则。变量隐藏和方法重写有根本的不同:
方法重写 - 在重写中,子类为其超类中已定义的方法提供不同的实现。调用哪个方法的决定基于实际对象的类型,而不是引用类型,这允许多态性。
变量隐藏 - 在变量隐藏中,如果子类中的变量与其超类中的变量同名,则子类变量将隐藏超类变量。使用哪个变量的决定基于引用类型,而不是实际对象的类型。
这些原则源于这样一个事实:方法是行为表示,而变量表示状态。该行为可以是多态的和重写的,允许不同类型的对象有不同的行为。相反,由变量表示的状态属于特定实例并且不是多态的。
结论
总而言之,理解为什么 Java 中的变量不遵循多态性和重写可以为了解 Java 的工作原理提供重要的见解。这些知识对于 Java 程序员在使用继承和多态性时避免误解和错误至关重要
以上是Java中的变量不遵循多态和重写的详细内容。更多信息请关注PHP中文网其他相关文章!

本文分析了2025年的前四个JavaScript框架(React,Angular,Vue,Susve),比较了它们的性能,可伸缩性和未来前景。 尽管由于强大的社区和生态系统,所有这些都保持占主导地位,但它们的相对人口

本文介绍了SnakeyAml中的CVE-2022-1471漏洞,这是一个允许远程代码执行的关键缺陷。 它详细介绍了如何升级春季启动应用程序到Snakeyaml 1.33或更高版本的降低风险,强调了依赖性更新

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

Node.js 20通过V8发动机改进可显着提高性能,特别是更快的垃圾收集和I/O。 新功能包括更好的WebSembly支持和精制的调试工具,提高开发人员的生产率和应用速度。

本文使用lambda表达式,流API,方法参考和可选探索将功能编程集成到Java中。 它突出显示了通过简洁性和不变性改善代码可读性和可维护性等好处

本文探讨了在黄瓜步骤之间共享数据的方法,比较方案上下文,全局变量,参数传递和数据结构。 它强调可维护性的最佳实践,包括简洁的上下文使用,描述性


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

禅工作室 13.0.1
功能强大的PHP集成开发环境