为什么学生(学生)可以使用实例变量?

时间:2015-12-08 14:18:52

标签: java class private access-modifiers

所以在构造函数Student(Student s)中为什么我可以使用s.name?通常当我们使用具有私有实例变量的对象时,我们需要键入s.getName(),假设有一个方法来访问信息。为什么在这种情况下我们可以使用s.names.score1

我认为这是因为它属于自己的班级,但我无法解决原因。

/** 
 * Manage a student's name and three test scores.
 */
public class Student {
    //Each student object has a name and three test scores
    private String name;             //Student name
    private int test1;               //Score on test 1
    private int test2;               //Score on test 2
    private int test3;               //Score on test 3

    /**
     * Default Constructor
     * Initializes name, test1, test2, and test3 to the default values
     */
    public Student() {
        this("", 0,0,0);
    }

    /**
     * Constructs a Student object with the user supplying the name
     * test1, test2, and test3
     */
    public Student(String nm, int t1, int t2, int t3) {
        name = nm;
        test1 = t1;
        test2 = t2;
        test3 = t3;
    }

    /**
     * Constructs a Student object with the user supplying
     * a Student object as the parameter
     */
    public Student(Student s){
        this(s.name = "bill",s.test1,s.test2,s.test3);
    }

5 个答案:

答案 0 :(得分:2)

构造函数是类的成员,因此可以访问私有成员,甚至是类的其他实例。它们是的私有,而不是对象。也可以从方法和属性访问器直接访问私有成员。

答案 1 :(得分:2)

Java中的关键字private表示如果您在班级内工作,则只能访问该成员。请检查以下示例:

public class Person {
    private String name;
    ...
    public equals(Person other) {
        // You're inside the person class here, therefore you can access
        // Every member of any Person object (no matter if the object is "this" or any other)
        return this.name.equals(other.name)
    }
}

我认为最好理解这一点,就是要明确自己,使用任何类成员与在对象this上使用它是一样的。例如。如果你写:

person = "Peter Grand";

相同
this.person = "Peter Grand";

答案 2 :(得分:2)

因为publicprivate和其他访问修饰符是在class级别指定的,而不是在实例(对象)级别。因此,在一个类中,您可以访问该类的所有实例的所有private成员;在继承的类中,您可以访问该类的所有受保护成员,等等。

这是有道理的,因为setter肯定需要访问私有成员:如何设置实例的字段?对于构造函数,它是一样的。

此外请注意,构造函数有时是唯一可以设置字段的成员:如果字段标记为final

答案 3 :(得分:1)

private表示您可以在自己的类中访问它,但不能从类外部访问它。因为您从name类构造函数中访问Student它可以正常工作。

答案 4 :(得分:1)

成员name被声明为private,这意味着可以在您自己的类的范围内访问该变量(,因此在所有嵌套范围中)。