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

使用重写抽象方法访问超类中的私有变量

郑琦
2023-03-14

假设一个抽象超类包含一个名为price of type double的私有变量。

现在假设变量已声明但未初始化。超类包含访问器方法,但是setter方法是抽象的,因此必须在子类中重写它,但是,由于超变量是私有的,有没有办法从子类初始化此变量?

考虑下面的例子:我有4节课;书籍(抽象超级)、非小说类(sub)、小说类(sub)、测试者(测试发生了什么的类)。

图书类:

public abstract class Book {

private String title;
private double price;

Book(String name){
    title = name;
}

public String getTitle(){
    return title;
}

public double getPrice(){
    return price;
}

public abstract void setPrice(double cost);
}

小说课

public class Fiction extends Book{

Fiction(){
    super("Harry-Potter");
    setPrice(24.99);
}

@Override
public void setPrice(double cost) {
}
}

非小说类

公共类非小说扩展书{

NonFiction(){
    super("Head-first Java");
    setPrice(37.99);
}

public void setPrice(double cost) { 
}
}

测试类

public class Challenge {
public static void main(String[] args){


Fiction fictionBook = new Fiction();
NonFiction NonFictionBook = new NonFiction();

Book[] theList = new Book[2];
theList[1] = NonFictionBook;
theList[0] = fictionBook;

System.out.println("Title of fiction book: \n"+theList[0].getTitle());
System.out.println("Title of non fiction book \n"+theList[1].getTitle());   
System.out.println("Title - "+theList[0].getTitle()+" -" + theList[0].getPrice());
System.out.println("Title - "+theList[1].getTitle()+" -" + theList[1].getPrice());
}

}

预期产出应为:

小说书名:哈利波特非小说书名:头-第一Java标题-哈利波特成本-24.99美元标题-头-第一Java成本-37.99美元

有没有一种方法可以在不将作用域更改为protected的情况下访问私有变量?

共有1个答案

乜坚成
2023-03-14

使变量私有的目的是防止类外的任何东西访问或更改它。如果类的开发人员希望它可以被子类查看或更改,那么它就会受到保护。但是,可以使用反射更改该值(只要未将安全管理器配置为不允许)。查看如何读取Java中的私有字段?

(顺便说一句,只是吹毛求疵,如果您不初始化实例变量,它会为其设置一个默认值,price将被设置为0.0D,如果您不为其分配初始值。不初始化实例或类变量实际上不是一个选项。)

 类似资料:
  • 假设我有一个叫做book的类,它是抽象的,有一个私有变量price,它的getter方法也是抽象的。 现在让我们假设我有一个旧的Book类,它继承了Book的所有属性,但也有一个与之相关联的年龄。另外,我希望这个类从它的父类重写getPrice方法。这就是我陷入困境的地方,因为price变量是私有的,而父类有一个抽象的getter方法。 谢谢。

  • 我的类KTree正在扩展抽象类GraphClass,但无法重写GraphClass中定义的一个方法。 原始方法添加(E E,V V,V v1)在界面无向图中定义 在类中,addEdge(E E,V V,V v1)抛出错误 “KTree”中的“addEdge(E,V,V)”与“GraphClass”中的“addEdge(E,V,V)”冲突;两种方法具有相同的擦除,但都不重写另一种方法 KTree中的

  • 问题内容: 如何在C ++中创建一个抽象类,该抽象类具有一些我想在子类中重写的抽象方法?该文件应如何显示?是否有一个,如果是的话,应该看起来如何? 在Java中,它看起来像这样: 对于我来说,将此代码转换为C ++就足够了。 编辑: 我创建了代码,但是当我尝试遍历对象时,出现以下错误: 使用此代码: 问题答案: 在Java中,除非您声明了所有方法,否则默认情况下所有方法都是默认方法。在C ++中,

  • 我无法编译一个需要从抽象类超类型重写方法的方法,该类超类型使用泛型作为其中一个参数。编译器抱怨扩展类的setRef()方法没有重写超类型中的方法。 父摘要类: 参考是: 而Interf是: 扩展子类(setRef()不编译): 我也尝试过使用通配符,但收到了相同的错误。使用通配符时,抽象类“setRef()是: 扩展类setRef()是: 甚至: 我能让它编译的唯一方法是,如果扩展类“setRef

  • 问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接

  • 为什么我能够直接访问的私有属性在的方法的实现中?似乎使用getter应该是访问它的唯一(如果不是,最好的实践)方式。我错过了什么?