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());
}
}
我在这里有两个类:人员超类和雇员子类。所以我只想知道此代码不应该工作,因为firstname和lastname变量在超类中是私有的?但是子类(即雇员)如何继承这些成员并使用它呢?
我认为超类的私有变量不能被继承,所以它在这里如何正常工作?
我完全困惑,请帮忙......
答案 0 :(得分:3)
尽管,父类的私有变量没有被子类(即雇员)继承,但是有一些公用函数分别称为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")
来设置名字。希望它会有所帮助。
答案 1 :(得分:2)
超类的私有变量不能被继承
是的,您绝对正确,它们不会继承。但是在您的代码中,您不是直接访问这些字段吗?
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
类构造函数中,并初始化其私有字段,然后初始化empid
中的employee
。
System.out.println(emp.get_first()+" "+emp.get_last());
System.out.println(emp.get_empid());
这里您也没有直接访问private
字段,而是在调用将继承到employee
并可以在其引用上调用的公共方法。
将类的成员保持为私有,并将其行为(方法)保持为公共是encapsulation
的一部分,因此您不能直接访问,而是可以使用公共方法设置和获取其值。
PS:如果可以使用IDE,则尝试使用getter和setter方法,并尝试遵循类和方法的命名约定。
答案 2 :(得分:0)
让我们在这里查看如何初始化名字和姓氏:
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);
}