因此,我有一个纸质出版类,其中包含受保护的变量和其自己的程序包。
然后我有一本书课,扩展了纸质出版物。 然后,该图书类具有3个扩展图书类的类(所有三个相同的包)
book类具有受保护的变量,扩展book类具有私有包。
现在,当我使用自己的包在新类中创建驱动程序时 我不能直接调用任何变量
package paperPublication;
public class PaperPublication {
protected String title;
protected double price;
package book;
import paperPublication.PaperPublication;
public class Book extends PaperPublication {
protected long ISBN;
protected int issueYear;
package book;
public class ChildrenBook extends Book {
int minimumAge;
然后我的驱动程序类将所有内容搞砸了……我明白了为什么将它放在自己的包/类中。但是。。。我似乎无法全神贯注于如何使其正常工作
package driver;
import book.*;
import paperPublication.PaperPublication;
public class Driver{
public static void main(String[] args) {
// TODO Auto-generated method stub
Book a = new Book();
System.out.println(a.ISBN);
System.out.println(a.title);
isbn和标题无法检索...公开。 ;(这不是我想要的。 我也已经有了所有的构造函数。
我的项目的目的是使用受保护的,公共的,私有的,打包私有int,字符串等...使用内在性,并通过创建对象并从存储的变量中调用诸如book.title或book.isbn之类的直接变量来测试隐私在构造函数中的主要方法中
答案 0 :(得分:1)
您无法直接从private
类访问protected
或isbn
之类的变量title
或Driver
。它根本不会编译。无法访问超出其预期隐私范围的变量或方法。这样一来,这里就涵盖了您正在寻找的隐私测试,并可以证明访问修饰符有效。
如果您实际上希望能够从其预期的隐私范围之外访问private
和protected
变量,则可以使用以下提到的设计模式:
有很多方法(可以使用的设计模式)来解决这个问题。常规方法是将getter和setter添加到类中以访问其属性。
PaperPublication类:
package paperPublication;
public class PaperPublication {
protected String title;
protected double price;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
图书班:
package book;
import paperPublication.PaperPublication;
public class Book extends PaperPublication {
protected long isbn;
protected int issueYear;
public long getIsbn() {
return isbn;
}
public void setIsbn(long isbn) {
this.isbn = isbn;
}
public int getIssueYear() {
return issueYear;
}
public void setIssueYear(int issueYear) {
this.issueYear = issueYear;
}
}
驱动程序类:
package driver;
import book.*;
import paperPublication.PaperPublication;
public class Driver {
public static void main(String[] args) {
Book a = new Book();
a.setIsbn(123456789L);
a.setTitle("Best book ever!");
System.out.println(a.getIsbn());
System.out.println(a.getTitle());
}
}
另一种设计模式是仅使用吸气剂,并且在创建对象时将值设置一次:
PaperPublication类:
package paperPublication;
public class PaperPublication {
protected String title;
protected double price;
public PaperPublication(String title, double price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public double getPrice() {
return price;
}
}
图书班:
package book;
import paperPublication.PaperPublication;
public class Book extends PaperPublication {
protected long isbn;
protected int issueYear;
public Book(long isbn, int issueYear, String title, double price) {
this.super(title, price);
this.isbn = isbn;
this.issueYear = issueYear;
}
public long getIsbn() {
return isbn;
}
public int getIssueYear() {
return issueYear;
}
}
驱动程序类:
package driver;
import book.*;
import paperPublication.PaperPublication;
public class Driver {
public static void main(String[] args) {
// things are set in the constructor, and then you can only read, not change the values.
Book a = new Book(123456789L, 2018, "Best book ever!", 19.99);
System.out.println(a.getIsbn());
System.out.println(a.getTitle());
}
}
还有更多的方法,这完全取决于您的需求。