当前位置: 首页 > 知识库问答 >
问题:

该字段在JAVA中不可见

董哲
2023-03-14

我目前正在开发一个程序,在我的子类中,我需要一个无参数构造函数,用空字符串初始化对象。

我尝试过使用super,我有setter和getter方法,但我一直得到“field Person.name不可见”。我得到这个地址和电话号码以及。

如何使其可见,并且我可以在不提供构造函数参数的情况下初始化对象?如果我做错了什么并需要修复某些内容,请告诉我(:

    // Create a class named Person
public class Person {
    
    // Fields: name, address, and phone number. (2 points)
    private String name;
    private String address;
    private String phoneNumber;

    // No argument constructor that initializes the object with empty strings for name, address, and phone. (2 points)
    public Person () {


        super();
        this.name = "";
        this.address = "";
        this.phoneNumber = "";

    }

    // 3 argument constructor that initializes the object with a name, address, and a phone number. (2 points)
    public Person2 (String name, String address, String phoneNumber) {

        this.name = name;
        this.address = address;
        this.phoneNumber = phoneNumber;


    }

    // Getter/setter methods for each of the fields. (3 points)

    // set/get name
    public void setName (String name) {

        this.name = name;

    }

    public String getName () {

        return this.name;
    }

    // set/get address
    public void setAddress (String address) {

        this.address = address;
    }

    public String getAddress () {

        return this.address;
    }

    // set/get phone number
    public void setPhoneNumber (String phoneNumber) {


        this.phoneNumber = phoneNumber;

    }

    public String getPhoneNumber () {

        return this.phoneNumber;
    }


    // toString method that returns a string for the name, address, and phone number (2 points)
    // (you can override the toString method as part of a class which is pretty swag)
    public String toString() {

        return "Name: " + name + "\n" + "Address: " + address + "\n" + "Phone: " + phoneNumber;

    }

}

// Create a subclass of Person named Customer
class Customer extends Person {

    // A field for a customer number. (1 point)
    private String customerNumber;

    public Customer () {
        
        //  A no argument constructor that initializes the object with an empty string for the name, address, phone, and customer number. (2 points)
        super(name, address, phoneNumber);

    }

    // A 4 argument constructor that initializes the object with a name, address, a phone number, and a customer number. (2 points)
    public Customer2 (String name, String address, String phoneNumber, String customerNumber) {
        
        this.name = name;
        this.address = address;
        this.phoneNumber = phoneNumber;
        this.customerNumber = customerNumber;

    }

    // Getter/setter method for the customer number field. (1 point)
    public void setCustomerNumber (String customerNumber) {

        this.customerNumber = customerNumber;

    }

    // toString method that prints the information from the Person toString as well as the customer number (2 points) 
    public String toString() {

        return "Name: " + name + "\n" + "Address: " + address + "\n" + "Phone: " + phoneNumber + "\n" + "Customer Number: " + customerNumber;

    }


}

共有3个答案

柴衡
2023-03-14

我不认为有任何实际需要在people类中调用超级构造函数。然而,在客户类的构造函数中,您应该只调用没有参数的超级构造函数。

编辑:或者你可以在声明时直接启动这些值,就像我上面的那个人说的。

另外,有点不相关,但是,你可以有一个构造函数,但是给参数默认值。所以你可以调用它,有参数和没有参数,而不需要重写它。

邢昊焜
2023-03-14

>

  • 您不能访问或分配到任何其他类中的private字段,但声明该字段的类除外。

    不能用类名称以外的任何名称声明构造函数。因此,Person2和Customer2都不是有效的构造函数或方法。(方法需要返回类型!)

    构造函数必须显式(通过super调用)或隐式地在其超类中链接无参数构造函数。

    基本上,您在超类中初始化私有字段的选择是使用super(...)调用来链接传递值的超类构造函数或调用子类构造函数中的超类setter方法。

    例如,Customer中的4参数构造函数可以是:

    public Customer (String name, String address, 
                     String phoneNumber, String customerNumber) {
        super(name, address, phoneNumber);
        this.customerNumber = customerNumber;
    }
    

    或者

    public Customer (String name, String address, 
                     String phoneNumber, String customerNumber) {
        super();
        setName(name);
        setAddress(address);
        setPhoneNumber(phoneNumber);
        this.customerNumber = customerNumber;
    }
    

    在我看来,前者更好。它更简洁易读。

    Customer中的toString()方法不能直接引用人员的私有字段。它可以使用fields的getter。

  • 柳德义
    2023-03-14

    如果字段被标记为私有访问,则只能从该类或其实例内部访问该字段。你应该使用get方法。或者,您可以获得toString的结果,并在此基础上进行构建。

    此外,所有构造函数都应该与类同名(没有添加“2”)。

    public class Person {
        
        private String name;
        private String address;
        private String phoneNumber;
    
        public Person() {
            this("", "", "");
        }
    
        public Person(String name, String address, String phoneNumber) {
            this.name = name;
            this.address = address;
            this.phoneNumber = phoneNumber;
        }
    
        public void setName (String name) {
            this.name = name;
        }
    
        public String getName () {
            return this.name;
        }
    
        public void setAddress (String address) {
            this.address = address;
        }
    
        public String getAddress () {
            return this.address;
        }
    
        public void setPhoneNumber (String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    
        public String getPhoneNumber () {
            return this.phoneNumber;
        }
    
       @Override
        public String toString() {
            return "Name: " + name + "\n" + "Address: " + address + "\n" + "Phone: " + phoneNumber;
        }
    }
    
    // Create a subclass of Person named Customer
    class Customer extends Person {
    
        private String customerNumber;
    
        public Customer () {
            this("", "", "", "");
        }
    
        public Customer (String name, String address, String phoneNumber, String customerNumber) {
            super(name, address, phoneNumber);
            this.customerNumber = customerNumber;
        }
    
        public String getCustomerNumber() {
            return customerNumber;
        }
    
        public void setCustomerNumber (String customerNumber) {
            this.customerNumber = customerNumber;
        }
    
        @Override
        public String toString() {
            return super.toString() + "\n" + "Customer Number: " + customerNumber;
        }
    }
    
     类似资料:
    • 定义不可变类的策略表明 所有字段都应该是最终字段。 对于ex: 为什么一定要最终决定? 因为我没有给出setter方法吗?它不能改变。谢谢。

    • 有没有可能在Avro模式中有一个可选字段(即该字段根本不出现在.json文件中)? 在我的Avro模式中,我有两个字段: 在我的JSON文件中,这两个字段可以存在也可以不存在。 但是,当它们不存在时,我会收到一个错误(例如,当我使用avro-tools命令行客户端测试这样的JSON文件时): 我理解,只要字段名存在于JSON中,它就可以是或值,但我要表达的是“如果这些字段名不存在,或者如果它们存在

    • 问题内容: 因此,前几天我正在上一堂课,当我意识到它会生成以下 工作 代码时,使用Eclipse的方法来创建equals方法: t.privateInt .. ???? 应该是私人的!因此,我想除了私有,受保护,受包保护和公共之外,还有其他领域可见性。 那么这里发生了什么?这个怎么称呼? 有人在哪里使用呢? 这不是中断封装吗?如果班上没有变种人而我改变了该怎么办?C ++也会发生这种情况吗?这是一

    • 类makitVerifications(models.Model): 类UserVerifyCountSerializer(序列化器。模型序列化器): UserVerifyCountSerializer_声明的_字段['makit_validate']=makitSerializer(只读=True) 类UserVerfiyCountViewSet(generics.ListCreateAPIVi

    • 问题内容: 我在假设,如果你有一个包含一个Java集<>内(或在地图<>对于这个问题的关键)的对象,所使用的任何字段,以确定身份或关系(通过纠正,,等。)无法更改而不会导致对集合的操作未指定的行为?(编辑:正如在其他问题中提到的) (换句话说,这些字段应该是不可变的,或者您应该要求从集合中删除对象,然后进行更改,然后重新插入。) 我问的原因是我正在阅读《Hibernate Annotations参