Вы не можете получить доступ к private
или protected
переменным, таким как isbn
или title
напрямую из класса Driver
.Это просто не скомпилируется.Доступ к переменным или методам за пределами их предполагаемой области конфиденциальности не будет компилироваться.Таким образом, это прямо включает тест на конфиденциальность, который вы ищете, и служит доказательством того, что модификаторы доступа работают.
Если вы действительно хотите иметь возможность доступа к private
и protected
переменным из-за пределов их предполагаемой конфиденциальности, тогда вы будете использовать шаблоны проектирования, упомянутые ниже:
Есть много способов (шаблоны проектирования, которые вы можете использовать), чтобы приблизиться к этому.Обычным способом было бы добавить методы получения и установки в класс для доступа к его свойствам.
Класс 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 class:
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());
}
}
Есть еще несколько способов, все зависит от ваших потребностей.