【问题标题】:How the code is working here in the subclass?代码在子类中是如何工作的?
【发布时间】:2023-03-18 15:45:02
【问题描述】:
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());  
    }
}

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

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

我很困惑,请帮忙......

【问题讨论】:

  • private 字段 firstnamelastname 没有被继承。公共函数get_first()get_last() 是被继承的函数。如果您尝试调用 firstnamelastname 而不是函数,则会出现错误。
  • 因为您在超类中使用了封装。这意味着您的字段是私有的,但它们具有公共的 getter/setter 方法,允许子类访问/修改私有字段。
  • 您认为在employee 类中的哪个位置正在访问person 的私有字段?
  • 我的意思是在子类对象中我们不访问私有成员,但是这些成员存在于子类不知道的子类对象中?

标签: java


【解决方案1】:

虽然父类的私有变量不会被子类(即雇员)继承,但有一些称为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") 来设置名字。希望它可能会有所帮助。

【讨论】:

    【解决方案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类的构造函数并初始化其私有字段,然后初始化employeeempid

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

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

    将类的成员保持为私有并将其行为(方法)保持为公共是encapsulation 的一部分,这样您就无法直接访问,但可以使用公共方法设置和获取其值。

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

    【讨论】:

    • 那么我可以假设超类的私有成员存在于子类对象中,并且它们只需要通过 getter 和 setter 方法进行初始化,而不是直接在子类中初始化吗?
    • 您不能访问其子类中的类的私有成员。我没有明白你所说的存在的真正含义,你可以使用 getter 和 setter 来访问以及设置私有成员值。
    • 我的意思是在子类对象中我们不访问私有成员,但是这些成员存在于子类不知道的子类对象中?
    • 超类的私有成员在子类中不可用,您只能使用 getter/setter 访问它们。所以在子类对象中,你不能直接访问私有成员。一个类的成员只有在继承之后才能进入它的子类。
    【解决方案3】:

    让我们回顾一下 firstnamelastname 是如何在此处初始化的:

    1. 在子类构造函数中,firstname,lastname 已被采用
    2. 然后在 super(firstname,lastname) 的构造函数主体中,firstnamelastname 传递给要处理的父级(即 Person)。
    3. 所以假设我们现在在父构造函数(Person)中,因此,通过调用 set_first(firstname)set_last(lastname) ,参数 firstname 和 lastname 正在父类本身中设置为从子构造函数(即 Employee )

    关于这个描述没有违规。

    如果您想直接在 Employee 类中初始化私有变量,则会发生冲突:

    public employee(String firstname,String lastname,int empid){  
        this.firstname=firstname;      //Violation 
        this.lastname=lastname;        //Violation 
        set_empid(empid);  
    }
    

    【讨论】:

    • 你的意思是每次初始化子类中的私有变量都需要像这样使用getter和setter方法吗?否则无法初始化它们?
    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多