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

时间:2018-09-15 10:38:07

标签: java

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变量在超类中是私有的?但是子类(即雇员)如何继承这些成员并使用它呢?

我认为超类的私有变量不能被继承,所以它在这里如何正常工作?

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

3 个答案:

答案 0 :(得分:3)

尽管,父类的私有变量没有被子类(即雇员)继承,但是有一些公用函数分别称为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")来设置名字。希望它会有所帮助。

答案 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)

让我们在这里查看如何初始化名字姓氏

  1. 在子类构造函数的名字中,姓氏已被使用
  2. 然后在super(firstname,lastname)名字姓氏的构造函数主体中传递给要照顾的父级(即Person)。
  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);  
}