代码在子类中是如何工作的?


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());  
}
}

我在这里有两个班级 人超类 和 员工子类.所以我只是想知道这段代码不应该工作,因为名字和姓氏变量在超类中是私有的?但是子类(即员工(如何继承这些成员并使用它?

我认为超类的私有变量不能继承,那么为什么它在这里工作正常?

我完全困惑,请帮忙...

虽然父类的私有变量不被子类继承,即雇员,但有一些称为gettersetter的公共函数允许从其子类访问类的私有成员。

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类构造函数中获取,其私有字段被初始化,然后初始化employeeempid

System.out.println(emp.get_first()+"  "+emp.get_last());  
System.out.println(emp.get_empid());

在这里,您也不直接访问private字段,而是调用将继承到employee的公共方法,并且可以在其引用时调用。

将类的成员保持为私有,并将他们的行为(方法(保持为公共是encapsulation的一部分,因此您不能直接访问,但可以使用公共方法设置和获取其值。

PS :尝试使用IDE制作getter和setter,如果它提供了选项并尝试遵循类和方法的命名约定。

让我们在这里回顾一下名字姓氏是如何初始化的:

  1. 在子类构造函数名字中,姓氏已被采用
  2. 然后在构造函数的主体中通过super(firstname,lastname)名字姓氏传递给父级(即人(要处理。
  3. 所以假设我们现在在父构造函数(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);  
}

最新更新