首页  >  文章  >  Java  >  Java中的变量不遵循多态和重写

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

王林
王林转载
2023-09-09 18:13:021143浏览

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删除

相关文章

查看更多