为啥在 Student(Student s) 中可以使用实例变量? [复制]

Posted

技术标签:

【中文标题】为啥在 Student(Student s) 中可以使用实例变量? [复制]【英文标题】:Why in the Student(Student s) can I use the instance variables? [duplicate]为什么在 Student(Student s) 中可以使用实例变量? [复制] 【发布时间】:2016-03-13 12:14:39 【问题描述】:

那么在构造函数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);
    

【问题讨论】:

就像你说的:private 表示变量可以在你自己的类的范围内访问(因此在所有嵌套的范围内)。 有人需要重新了解安全修饰符。 :P 如果你不能从构造函数中访问私有变量,你怎么能设置一个没有setter的类变量的值呢? 公平地说 - privateclass 而不是 object 私有的并不完全明显。 @Powerlord 我认为 OP 的困惑来自一个实例的构造函数引用 另一个 实例的“私有”数据这一事实。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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";

【讨论】:

你的意思是other.name而不是Person.name 谢谢@Holloway。我更正了!【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于为啥在 Student(Student s) 中可以使用实例变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Student s = new Student();在内存中做了哪些事情?

c语言输出字符串为啥是乱码?

熟悉常用的HBase操作

熟悉常用的HBase操作

熟悉常用的HBase操作

熟悉常用的HBase操作