从父类访问私有变量 - JAVA

时间:2018-05-17 18:35:59

标签: java oop inheritance

我没有包含main函数,因为它是空的。我试图从我的父类访问私有变量 name 到子类但是它会抛出一条错误消息。它会是如果你能帮助我的话我很高兴。我是JAVA btw的新手。

public class Author {
        private String name;
        private String email;
        private char gender;
        public Author(String name,String email,char gender)
        {
            this.name=name;
            this.email=email;
            this.gender=gender;         
        }
        protected String getName()
        {
            return name;
        }
        //protected String 

    }
    public class Book extends Author {
        private String name;
        private String authorname;
        private double price;
        private int qtyInStock;
        Book(String name,Author a,double price,int qtyInStock)
        {
            this.name=name;
            this.authorname=a.getName(); //Error
            this.price=price;
            this.qtyInStock=qtyInStock;
        }

    }

错误讯息:

  

隐式超级构造函数HelloWorld.Author()未定义。必须   显式调用另一个构造函数。

2 个答案:

答案 0 :(得分:2)

  

隐式超级构造函数HelloWorld.Author()未定义。必须显式调用另一个构造函数

错误消息不是因为您正在访问受保护的变量,而是因为Author没有默认构造函数。如果一个类没有默认构造函数(没有参数的构造函数),那么您必须通过super调用在任何子类中提供必要的参数。

Book(String name,Author a,double price,int qtyInStock)
{
    //pass variables to parent class
    super(a.getName(), a.getEmail(), a.getGender());
    this.name=name;
    this.authorname=a.getName(); //Error
    this.price=price;
    this.qtyInStock=qtyInStock;
}

答案 1 :(得分:0)

您正在混合几个概念。在Author课程中,您有protected getName()个功能。这意味着只有Author个类和Author子类才能访问它。

此外,在您的项目中,您将Book定义为 Author。但是,Book Author Author

由于您将Book定义为extends Author,因此图书构造函数需要调用显式Author构造函数。如果可以的话,Java编译器会调用'默认构造函数'(Author()),但由于你没有提供默认构造函数,它会要求你告诉你应该调用什么。

我的假设是你宁愿拥有BookAuthor的结构:

public class Author {
  public enum Gender {
    FEMALE, MALE
  }
private final String name;
private final String email;
private final Gender gender;

public Author(String name,String email,Gender gender) {
    this.name = name;
    this.email = email;
    this.gender = gender;         
}

public String getName() {
    return name;
}

public String getEmail() {
    return email;
}

public Gender getGender() {
    return gender;
}
}

class Book  {
  private final String name;
  private final double price;
  private final int qtyInStock;
  private final Author author;

  Book(String name,Author a,double price,int qtyInStock) {
    this.name =name;
    this.author = a;
    this.price = price;
    this.qtyInStock  = qtyInStock;
}

public String getName() {
    return name;
}

public double getPrice() {
    return price;
}

public int getQtyInStock() {
    return qtyInStock;
}

  public Author getAuthor() {
     return author;
 }
}

对于类型安全,我将Gender定义为enum,而不是char,它可以接受可接受的值。此外,我已经扩展了您的示例以使类“可变(final字段,无set方法”。你可能想要也可能不想要。