使用覆盖的抽象方法从超级 class 访问私有变量

Accessing private variables from a super class using an overridden abstract method

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

现在假设变量已经声明但没有初始化。 super class 包含访问器方法,但是 setter 方法是抽象的,因此必须在 sub-class 中覆盖它,但是,由于 super 变量是私有的,有没有办法初始化这个变量来自 sub-class?

考虑以下示例:我有 4 个 Class; Book(abstract super), NonFiction(sub), Fiction(sub), Tester(class 测试会发生什么).

本书Class:

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);
}

小说Class

public class Fiction extends Book{

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

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

非小说类Class

public class 非小说类书籍扩展 {

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

public void setPrice(double cost) { 
}
}

测试员Class

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());
}

}

预期的输出应该是:

小说书名: 哈利·波特 非小说类书籍的名称: Head-First Java Title-Harry 波特成本 - 24.99 美元 标题-Head-First Java 成本-$37.99

有没有办法在不将范围更改为受保护的情况下访问私有变量?

将变量设为私有的目的是防止 class 之外的任何内容访问或更改它。如果 class 的开发者希望子classes 可以查看或更改它,它就会受到保护。但是,可以使用反射更改值(只要安全管理器未配置为不允许这样做)。参见 How do I read a private field in Java?

(顺便说一句,只是吹毛求疵,如果您不初始化实例变量,它会为其设置默认值,如果您不分配,price 将设置为 0.0D它是一个初始值。让一个实例或 class 变量未初始化并不是一个真正的选择。)