Java 为什么不重写类字段

Java 为什么不重写类字段,java,c#,oop,Java,C#,Oop,我知道,在Java和C#类中,字段并没有被覆盖(但方法却被覆盖)。我知道这一事实,但我不明白这样实施的原因是什么。这是不可预测和明显的。为什么我们有这样的OOP实现 public class Flight { int seats = 150; } public class CargoFlight extends Flight { int seats = 12; } CargoFlight f1 = new CargoFlight(); System.out.println(

我知道,在Java和C#类中,字段并没有被覆盖(但方法却被覆盖)。我知道这一事实,但我不明白这样实施的原因是什么。这是不可预测和明显的。为什么我们有这样的OOP实现

public class Flight {
    int seats = 150;
}

public class CargoFlight  extends Flight {
    int seats = 12;
}

CargoFlight f1 = new CargoFlight();
System.out.println(f1.seats);

Flight f2 = new CargoFlight();
System.out.println(f2.seats);
以及:


正如您所提到的,这些语言都是基于面向对象的,而面向对象的编程在很大程度上受现实世界概念的影响。从现实世界的例子来看:如果一个孩子继承了他/她的父母的东西,他/她继承了父母的状态(财产、财富等,他/她不能通过增加更多的财富来覆盖),但他/她可以覆盖他们父母的行为(他/她如何说话、走路、理解等)


类似地,在编程中,当类继承时,它从父类继承状态和行为。但它不能任意覆盖父级的状态,尽管它可以使用它。而且子类可以自由重写父类的行为(方法)。

是的,在这种格式下,它看起来确实令人迷惑,但思考语言的工作方式会有所帮助

例如,大多数情况下,我们都会指定特定于类的toString方法,尽管我们可以很高兴地使用父类对象(管理所有对象的对象!)为我们定义的方法。然而,大多数时候对象的toString方法并不真正适合我们的目的,我们编写了不同种类的toString方法,它更适合我们的类

虽然代码中没有像示例中那样清楚地显示这一点,但实际上,这是整个语言的工作方式;子类继承父类方法,如果它不能按预期的方式为它们工作,则会重写它们以更好地满足类的目的。在我看来,在我们自己编写的课程中,这比在使用激励类时要清楚得多


当然,您可以尝试以不需要重写自己的类的方式来规划类,但是让父类定义一些泛型方法,然后在需要时定义它们更具体,这样会更有效。

重写是为了专门化行为,而不是状态。如果分别声明两个变量,但只得到一个状态,IMO,这会很奇怪。你真正想要的是对现有状态的赋值,这很容易实现。这是如何覆盖的??您只是在分配新值……我们通常会覆盖行为,因为很多时候我们希望派生类具有不同的行为……您可以将行为关联到类中的方法……“只是分配新值”——这不是您要做的。您正在声明两个不同的字段,一个阴影另一个。如果需要,可以指定一个新值。没有什么可以阻止它。重写将发生在您更改该变量的数据类型本身时…..想象一下基类有字符串变量和字符串操作方法,您重写它以将其更改为Int并调用该基类方法…..这有意义吗??没有权利…这就是为什么OOP没有这样的实现
class Flight
{
    public int Seats = 150;      
}

class CargoFlight : Flight
{
    public int Seats = 20;
}

class Program
{
    static void Main(string[] args)
    {
        CargoFlight f1 = new CargoFlight();
        Console.WriteLine(f1.Seats);

        Flight f2 = new CargoFlight();
        Console.WriteLine(f2.Seats);            

        Console.ReadLine();
    }
}