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() 方法将打印“猫叫”,但是 System.out.println(myAnimal.sound) 行将打印“动物发出声音”。为什么会这样?因为方法遵循多态性,所以执行 Cat 类中的 makeSound() 方法。但是,由于变量不遵循多态性,所以使用了 Animal 类中的 `sound` 变量。
这种行为是由于称为变量隐藏的原理造成的。如果子类中的变量与超类中的变量同名,则子类变量将隐藏超类变量。
这并不意味着超类变量已被重写。这两个变量仍然独立存在,使用哪个变量取决于引用类型,而不是实际的对象类型。这就是为什么当我们通过 Animal 引用访问 sound 变量时,我们得到的是 Animal 类中的 sound 值,而不是 Cat 类中的 sound 值。
变量重写与变量隐藏
在 Java 中,变量不像方法那样可以重写。相反,它们遵循变量隐藏的原则。变量隐藏和方法重写从根本上是不同的。
方法重写 - 在重写中,子类为在其超类中已定义的方法提供不同的实现。调用哪个方法的决定基于实际对象的类型,而不是引用类型,这允许多态。
变量隐藏 - 在变量隐藏中,如果子类中的变量与超类中的变量同名,则子类变量将隐藏超类变量。使用哪个变量的决定基于引用类型,而不是实际对象的类型。
这些原则源于这样一个事实:方法是行为表示,而变量表示状态。行为可以是多态的和可重写的,允许不同类型的对象表现出不同的行为。相反,由变量表示的状态属于特定实例,而不是多态的。
结论
总而言之,了解为什么 Java 中的变量不遵循多态和重写,可以深入了解 Java 的工作原理。对于 Java 程序员来说,掌握这方面的知识对于避免在使用继承和多态时出现误解和错误至关重要。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP