【问题标题】:Accesing Private variables from a parent class - JAVA [duplicate]从父类访问私有变量 - JAVA [重复]
【发布时间】:2018-10-28 03:07:19
【问题描述】:

我没有包含 main 函数,因为它是空的。我正在尝试从父类访问私有变量 name 到子类,但随后它会抛出错误消息。它会是如果你能帮助我很好。顺便说一句,我是 JAVA 新手。

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() 未定义。必须 显式调用另一个构造函数。

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

    隐式超级构造函数 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;
    }
    

    【讨论】:

    • @Latheeshwar Raj 这是答案,你应该接受它
    【解决方案2】:

    您混合了几个概念。在您的 Author 类中,您有一个 protected getName() 函数。这意味着只有Author 类和Author 子类可以访问它。

    在您的项目中,您将Book 定义为存在 Author。但是,Book不是Author,它Author

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

    我的假设是,您希望有一个结构,其中 Book 有一个 Author

    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,它有可能接受的值。此外,我还扩展了您的示例以使类 ìmmutable(final 字段,没有 set 方法)。你可能想要也可能不想要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2010-10-23
      • 2017-12-01
      • 2012-05-09
      • 2016-03-08
      • 2015-09-25
      • 2014-02-09
      相关资源
      最近更新 更多