为啥在 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.name
、s.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的类变量的值呢?
公平地说 - private
是 class 而不是 object 私有的并不完全明显。
@Powerlord 我认为 OP 的困惑来自一个实例的构造函数引用 另一个 实例的“私有”数据这一事实。
【参考方案1】:
构造函数是类的成员,因此可以访问私有成员,甚至是类的其他实例。它们是 class 私有的,而不是 object 私有的。私有成员也可以直接从方法和属性访问器访问。
【讨论】:
【参考方案2】:因为public
、private
和其他访问修饰符是在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) 中可以使用实例变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章