假设一个抽象超类包含一个名为price double的私有变量。
现在假设变量已声明但未初始化。超类包含访问器方法,但是setter方法是抽象的,因此必须在子类中重写,但是,由于超级变量是私有的,有没有办法从子类初始化这个变量?
考虑以下示例:我有4个类;书(抽象超级),非小说(子),小说(子),测试者(测试会发生什么的类)。
书类:
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扩展Book {
NonFiction(){
super("Head-first Java");
setPrice(37.99);
}
public void setPrice(double cost) {
}
}
The Tester 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 标题 - 哈利波特成本 - 24.99美元 Title-Head-First Java Cost- $ 37.99
有没有办法在不将范围更改为受保护的情况下访问私有变量?
答案 0 :(得分:2)
将变量设为私有是为了防止类外的任何内容访问或更改它。如果该类的开发人员希望它可以被子类查看或更改,那么它就会受到保护。但是,可以使用反射更改值(只要安全管理器未配置为禁止该操作)。见How do I read a private field in Java?
(顺便说一下,对于nitpick,如果你没有初始化一个实例变量,它会为它设置一个默认值,price
如果你没有给它分配一个0.0D
初始值。保留一个实例或类变量未初始化并不是一种选择。)