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

Java子构造函数中的父属性

苗运珧
2023-03-14

题目说明了一切,我得到了一个类,其中构造函数的变量必须是私有的。

public class AdMedia {
private String name;
private int price;

public AdMedia(){}


public AdMedia(String name, int price) {
    this.name = name;
    this.price = price;
}

当然,它附带了变量的公共gettersetter

现在问题就在我尝试制作一个名为 Magazine 的子类之后。该类应继承名称和价格,但对于每个对象启动,价格都是恒定的。所以它们不会作为名称出现在构造函数上。

public class Magazine extends AdMedia {
private int area;
private String position;
private String topics;

public Magazine() {}
public Magazine(String name, int size, String position, String topic){

    super();
    this.size = size;
    this.position = position;
    this.topic = topic;

}

这也带有它自己的gettersetter

我试图将价格放在构造函数中,但构造函数需要一个传递的参数。使用super(name)还会通知父构造函数中没有一个具有这样的形状。

当我尝试使用父类方法 getName() 获取名称时,这让我变得复杂,我想这可能需要一些向下转换?

我曾试图寻找解决方案,但大多数都要求我将变量的可访问性改为< code>protected。在< code>private中没有其他方法吗?

编辑:我忘了说,这样做的结果是无法访问杂志名称,所以当我试图向下转换-获取名称时,返回的是null。

共有1个答案

景品
2023-03-14

您可以将您的子构造函数编写为

public Magazine(String name, int size, String position, String topic){
    super();
    setName(name);
    setPrice(100); // 100 is your constant price
    this.size = size;
    this.position = position;
    this.topic = topic;
}

或作为

public Magazine(String name, int size, String position, String topic){
    super(name, 100); // 100 is your constant price
    this.size = size;
    this.position = position;
    this.topic = topic;
}

然而,这两种方式都有可能在以后改变价格:

Magazine m = new Magazine("name", 50, "position", "topic");
m.setPrice(10);

如果需要防止这种情况,还应该重写< code>setPrice() setter:

public class Magazine extends AdMedia {

    ...
    @Override
    public void setPrice(int price) {
        // what to do here?
        // * you could either silently ignore 
        //   (which might surprise some users expecting to be able to change the price)
        // * throw an UnsupportedOperationException 
        //   (which might surprise other users which are not prepared to handle such an exception)
    }
}
 类似资料:
  • 我想创建一个抽象的父类,其中包含方法公共抽象使用();和使用方法在不同的子类是不同的,但利用父方法的所有Rest,但我希望父类包含一个私有变量,但它需要设置从特定的孩子取决于孩子所以像我有一个家长车,我想与汽车一般工作,但为特定目的的use()方法和设置汽车图像我使用保时捷类这是一个孩子。我不希望汽车图像属性是可访问的,但同时如果它的私人我不能从子构造函数设置它,有什么想法吗?我的问题是如何设置一

  • 问题内容: 我有一个“ ChildClass”类,它扩展了“ ParentClass”类。我不想完全替换父类的构造函数,而是要先调用父类的构造函数,然后再做一些额外的工作。 我相信默认情况下会调用父类的0参数构造函数。这不是我想要的 我需要用参数调用构造函数。这可能吗? 我试过了 但这不起作用,因为您无法修改“ this”。 问题答案: 您可以从子代的构造函数中以“ super”引用父代的构造函数

  • 所以我在学习java继承,我遇到了一个我不知道如何解决的问题。 我要做的是从超类中调用一个子类构造函数。我不知道这是否有任何意义,但我会尝试用一个例子来解释我自己。 我为什么要这么做? 我希望能够主要不必处理智能手机。 我希望能够做到:

  • 问题内容: 编译该程序时,出现错误- 错误-找不到构造函数Person()。为什么定义Person()是必要的? 问题答案: 创建时,您要同时创建一个。为了确保构造正确,编译器在构造函数中添加了一个隐式调用: 由于没有无参数构造函数,因此失败。 您可以通过以下任一方式解决它 添加对super的显式调用,如下所示: } 或通过将no-arg构造函数添加到: } 通常,编译器还会隐式添加无参数构造函数

  • 我在Java有一个简单的亲子实现。父类看起来像: 和子类类似于: 当我打电话的时候 我希望BasePage构造函数也能运行并设置配置数据。但BasePage构造函数根本不运行。我不明白为什么。有人能告诉我为什么吗?谢谢.

  • 我有一个抽象类,它有一个构造函数,它不抛出异常,还有一个扩展它的类,但是它应该在构造函数中抛出一个泛型异常。 对于要抛出的异常,我需要检查父类中的一个属性(在调用super()之前我不能这样做)。 有没有一种方法可以使这成为可能,而不会在父类中引发异常,或者这是最好的方法?