在面向对象编程 (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中的变量不遵循多态和重写的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!