package practice;
class person{
private String firstname;
private String lastname;
public person(String firstname,String lastname){
set_first(firstname);
set_last(lastname);
}
public String get_first() {
return firstname;
}
public void set_first(String firstname) {
this.firstname=firstname;
}
public void set_last(String lastname) {
this.lastname=lastname;
}
public String get_last() {
return lastname;
}
}
class employee extends person {
private int empid;
public employee(String firstname, String lastname, int empid) {
super(firstname,lastname);
set_empid(empid);
}
public void set_empid(int empid) {
this.empid=empid;
}
public int get_empid() {
return empid;
}
}
class testing_super_keyword {
public static void main(String args[]) {
employee emp=new employee("Paul","Anderson",1234);
System.out.println(emp.get_first()+" "+emp.get_last());
System.out.println(emp.get_empid());
}
}
我在这里有两个班级 人超类 和 员工子类.所以我只是想知道这段代码不应该工作,因为名字和姓氏变量在超类中是私有的?但是子类(即员工(如何继承这些成员并使用它?
我认为超类的私有变量不能继承,那么为什么它在这里工作正常?
我完全困惑,请帮忙...
虽然父类的私有变量不被子类继承,即雇员,但有一些称为getter
和setter
的公共函数允许从其子类访问类的私有成员。
public String get_first() {
return firstname;
}
public void set_first(String firstname) {
this.firstname=firstname;
}
public void set_last(String lastname) {
this.lastname=lastname;
}
public String get_last() {
return lastname;
}
当您要从父级访问名字时,您将看到从员工对象调用get_first()
以获取名字。如果要设置名字,则需要调用set_first("name")
来设置名称。希望它可能会有所帮助。
超类的私有变量不能继承
是的,你是绝对正确的,他们不会继承。但是在您的代码中,您没有直接访问这些字段,对吗?
public employee(String firstname,String lastname,int empid){
super(firstname,lastname);
set_empid(empid);
}
在这里,您将参数(从main方法(传递给employee
构造函数,参数的名称类似于person
中的字段,但它们并不相同。您可以像这样更改参数名称,它仍然可以正常工作。
public employee(String fName, String lName,int empid){
super(fName,lName);
set_empid(empid);
}
在这里,参数值被super
类构造函数中获取,其私有字段被初始化,然后初始化employee
empid
。
System.out.println(emp.get_first()+" "+emp.get_last());
System.out.println(emp.get_empid());
在这里,您也不直接访问private
字段,而是调用将继承到employee
的公共方法,并且可以在其引用时调用。
将类的成员保持为私有,并将他们的行为(方法(保持为公共是encapsulation
的一部分,因此您不能直接访问,但可以使用公共方法设置和获取其值。
PS :尝试使用IDE制作getter和setter,如果它提供了选项并尝试遵循类和方法的命名约定。
让我们在这里回顾一下名字和姓氏是如何初始化的:
- 在子类构造函数名字中,姓氏已被采用
- 然后在构造函数的主体中通过
super(firstname,lastname)
,名字和姓氏传递给父级(即人(要处理。 - 所以假设我们现在在父构造函数(Person(中,所以,通过调用
set_first(firstname)
和set_last(lastname)
,参数firstname和lastname正在使用从子构造函数(即员工(传递的值在父类本身中设置
。
关于此描述,没有违规行为。
如果要直接在 Employee 类中将私有变量初始化为 :
public employee(String firstname,String lastname,int empid){
this.firstname=firstname; //Violation
this.lastname=lastname; //Violation
set_empid(empid);
}