使用覆盖的抽象方法从超级 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 变量未初始化并不是一个真正的选择。)
假设一个抽象超级 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 变量未初始化并不是一个真正的选择。)