当前位置: 首页 > 知识库问答 >
问题:

子类参数名称重写超类Val

陆绪
2023-03-14

熟悉Java,但对静态编程语言相当陌生。

当子类参数与超类val同名时... Android Studio不会抛出验证错误,说明需要@Overder注释。但是,尝试从Business中访问name引用参数name而不是超类val(我觉得这就像覆盖)。

class Business(
    val name: String
) {
    // ...
}

class FirstBusiness(name: String) : Business(name) {
    val test = name; // name referencing param name rather than super's name
}

当然,我可以将参数命名为不同的名称,但我真的只想将名称传递给超类......否则不包括它在FirstBusiness中的任何存储。

我忽略了什么吗?我很惊讶,即使我没有将FirstBusiness参数name声明为val/var,它似乎也覆盖了Business.name。我假设参数并没有真正覆盖超级val,因为IDE没有抱怨...但是为什么参数是唯一的建议,而不是超级val?

编辑:如果我像这样在主构造函数设计之外传递参数,我确实会注意到不同的行为(从我的Java经验来看更像是这样)。。。

class FirstBusiness : Business {
    constructor(name: String) : super(name)

    fun thing() {
        val v = name // now references super's name
    }
}

非常感谢。

共有1个答案

公羊瀚
2023-03-14

就像在Java中隐藏超类字段的名称一样,您可以使用关键字来澄清它。

class FirstBusiness(name: String) : Business(name) {
    val test = super.name
}

在您的情况下,它不会覆盖超类的属性。发生的情况是,属性声明站点上的属性初始值设定项被视为主构造函数的初始化块的一部分,因此构造函数参数的作用域比超类的属性更近。

假设这些类是在Java中定义的,在超类中您只使用了一个字段而不是getter:

public class Business {
    public String name;

    public Business(String name) {
        this.name = name;
    }
}

然后,您在其声明站点初始化属性的代码就像从构造函数初始化字段一样,Java如下所示:

java prettyprint-override">public class FirstBusiness extends Business {
    private String test;

    public FirstBusiness(String name) {
        super(name);
        this.test = name; // It's using the parameter, not the superclass's 
                          // property, but the superclass property isn't overridden.
    }
}
 类似资料:
  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出:

  • 我最近一直在翻阅几本书,以便自学Java幸运的是,主要是由于运气,我遇到的困难很少。这种情况刚刚改变。 我在继承和整个超类子类设置下阅读了下面的一节 --创建新的超类对象时,与所有对象一样,会为其指定一个引用(本例中为superReference) --如果创建了一个新的子类对象(定义子类扩展了超类),然后superReference引用被设置为引用该对象而不是原始对象,我的理解是,由于引用是针对

  • 也许我对概念感到困惑,但是重写和在子类中创建一个新方法之间有什么区别呢?重写不就是在子类中创建一个不同于父类的新的特定方法吗?但这难道不是在子类中创建一个新方法所要做的吗?

  • 我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是

  • 有没有方法用子类的静态成员类参数化超类? exampleSuperClass.java: 编译失败,错误为: 或者与: 成员不能解析为类型 如果用另一个包保护的顶级类来参数化ExampleSubClass,它工作得很好(也就是没有错误)。 这背后的驱动力是我有一个泛型超类和许多不同的和对。但是由于只被引用,最好是: 限制的访问,使其成为静态成员类和 通过不给自己的文件来减少文件数。 那么,在参数化