并在其自己的类/包中使用main方法

时间:2018-10-02 23:37:19

标签: java inheritance protected

因此,我有一个纸质出版类,其中包含受保护的变量和其自己的程序包。

然后我有一本书课,扩展了纸质出版物。 然后,该图书类具有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之类的直接变量来测试隐私在构造函数中的主要方法中

1 个答案:

答案 0 :(得分:1)

您无法直接从private类访问protectedisbn之类的变量titleDriver。它根本不会编译。无法访问超出其预期隐私范围的变量或方法。这样一来,这里就涵盖了您正在寻找的隐私测试,并可以证明访问修饰符有效。

如果您实际上希望能够从其预期的隐私范围之外访问privateprotected变量,则可以使用以下提到的设计模式:

有很多方法(可以使用的设计模式)来解决这个问题。常规方法是将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());
   }
}

还有更多的方法,这完全取决于您的需求。