Java 赋值运算符和";这";关键词

Java 赋值运算符和";这";关键词,java,theory,Java,Theory,考虑以下代码段: class Parent { Parent() { this = new Child(); } } class Child extends Parent { } 上述操作将引发语法错误:赋值运算符的左侧必须是变量 在java中,this关键字存储当前调用对象的内存地址。我希望用类的子类的实例覆盖当前对象。我知道上面的代码段抛出了一个错误,因为这个不是变量,可能是不可变的 然而,我想知道为什么java不允许上述特性?这有什么坏处吗 编辑:这个问题

考虑以下代码段:

class Parent {
    Parent() {
        this = new Child();
    }
}
class Child extends Parent { }
上述操作将引发语法错误:
赋值运算符的左侧必须是变量

在java中,
this
关键字存储当前调用对象的内存地址。我希望用类的子类的实例覆盖当前对象。我知道上面的代码段抛出了一个错误,因为
这个
不是变量,可能是不可变的

然而,我想知道为什么java不允许上述特性?这有什么坏处吗


编辑:这个问题是在自然语言处理(NLP)上下文中出现的。例如,在法语中,每个动词都必须以“er”、“ir”或“re”结尾。所有动词都有某些共同特征。然而,每个动词必须是上述三种类型中的一种。因此,在父类“Verb”的构造函数中,我想将创建的对象分类为“serverb”、“IrVerb”或“ReVerb”

有两种情况:

如果允许将
实例化为任何
对象
,而不一定是类型层次结构中的对象,那么实例化将无法保证其引用的内容。这打破了一些东西,最明显的是整个面向对象编程的概念


如果将
限制为实例化父类的任何子类,则该子类构造函数将无限次调用父类构造函数,导致堆栈溢出错误

在父类的构造函数中构造子类实例并用创建的子实例替换实际父实例没有任何意义

尽管在评论和另一个答案中指出了令人讨厌的
StackOverflowerr
,但没有这样做的用例。一般来说,在创建父对象的同时创建子对象(从逻辑角度来看)是荒谬的

考虑以下理由:

一辆特殊的汽车正在工厂里组装。组装特定汽车的过程包括许多步骤

其中一些步骤仅在装配特定车辆时发生,而其他步骤则在装配特定车辆和装配其他车辆(如特定货车)时发生

现在让我们假设在组装许多车辆(包括特定车辆和特定货车)时发生的其中一个一般步骤表明,我们必须组装一辆新的特定货车,让它成为正在组装的一般车辆


现在,我们正在组装的特定汽车将成为这种新的特定面包车。但是汽车不可能是面包车=>荒谬的

这毫无意义,即使这个特定的代码可以工作,它也会抛出StackOverflow异常。类如何知道它是子类?哪一个还没有出生你到底想达到什么目的?首先想到的是它有多混乱。如果我创建一个
父对象
对象,我希望它实际上是一个
父对象
对象,而不是
子对象
对象。如果我想要一个
Child
对象,我会显式地创建一个。你可能想要一个工厂:当我提出这个问题时,我想到了你的第二个场景。如果在Java中不是每个子类都必须调用其父类的构造函数,那么上面的代码段可能吗?我从不喜欢java强制每个子类的构造函数调用父类的构造函数的事实。从面向对象的角度来看,删除子构造函数流会导致其他事情中断。对象状态需要严格维护,OO规定每个父对象都应该独立于其子类负责维护自己的状态。这里还有一些需要考虑的事情——想象一个有B和C两个孩子的类A。假设在A的构造函数中,你掷了一枚硬币,写下了
this=new B()
this=new C()
。在运行时之前,您无法确定类型,但JVM也不能。那么编译器能做什么呢?哪些方法可以访问?这个问题是在自然语言处理(NLP)环境中出现的。例如,在法语中,每个动词都必须以“er”、“ir”或“re”结尾。所有动词都有某些共同特征。然而,每个动词必须是上述三种类型中的一种。因此,在父类“Verb”的构造函数中,我想将创建的对象分类为“serverb”、“IrVerb”或“ReVerb”。因此,这个功能对我来说似乎很有用。现在我明白你提出这个问题的动机了。然而,在OO设计中,层次关系不是这样建模的。您总是创建某个类的对象,并且在该对象不再存在之前保持不变。对象的类不是分类。不能使用属性(例如法语动词的类型)对类进行建模。