首页> Java> java教程> 正文

Java中的变量不遵循多态和重写

王林
发布: 2023-09-09 18:13:02
转载
1093 人浏览过

Java中的变量不遵循多态和重写

在面向对象编程 (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中文网其他相关文章!

相关标签:
来源:tutorialspoint.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!