有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

请考虑下面的例子:我有4节课;Book(抽象超级)、No虚构(sub)、虚构(sub)、Tester(测试发生了什么的类)

图书类:

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

}

预期产出应为:

小说书名: 哈利·波特 非小说类书籍名称: 首当其冲的爪哇 《哈利·波特》的片酬为24.99美元 Title Head First Java成本——37.99美元

有没有办法在不将作用域更改为受保护的情况下访问私有变量


共 (1) 个答案

  1. # 1 楼答案

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

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