子类为什么能通过继承父类中的setName方法给自己设置父类中被private修饰的name属性?

新手上路,请多包涵

子类为什么能通过继承父类中的setName方法给自己设置父类中被private修饰的name属性?

父类

public abstract class Employee {
    private String name;
    public String getName(){return name;}
    public void setName(String name) {this.name = name;}
    public abstract void showMsg();
}

子类

public class Manager extends Employee{
    private Clerk clerk;
    public Manager(){}
    public Manager(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void showMsg(){System.out.println(this.getName());
    }
}

测试类

下方图片是测试类,可以打印出名字.(请忽略我图片中除了name的其他属性)
下面是我的理解:private不是修饰了name吗?那Manager类中不应该没有name这个属性吗?虽然有setName方法,但是本类中没有name属性,怎么还能给name赋值上的呢?
本人小白,希望有大佬可以指点一下我理解上的错误!
image.png

阅读 430
avatarAI BotBETA

你的理解有一点误区。

首先,private 关键字确实表示这个属性只能在当前类中被访问和修改。在这个例子中,name 属性是 Employee 类的一个私有属性,所以只有 Employee 类内部的方法可以访问和修改它。

然后,子类 Manager 继承了父类 Employee。这意味着 Manager 类可以访问 Employee 类中所有的公有(public)和受保护(protected)成员(包括方法和属性)。同时,由于 Manager 类可以调用 Employee 类的公有方法,因此它可以通过调用 setName 方法来间接修改 Employee 类中的 name 属性。

所以,尽管 Manager 类中没有定义 name 属性,但它仍然可以通过调用 setName 方法来设置 Employee 类中的 name 属性的值。这是因为 setName 方法在 Employee 类中被定义为公有的,所以可以在任何 Employee 的子类中被调用。

换句话说,private 关键字阻止的是外部类直接访问和修改 name 属性,但并没有阻止 Employee 类自身的方法(如 setName)去访问和修改它。因此,Manager 类可以通过调用 setName 方法来间接地修改 name 属性的值。

2 个回答

其实你只要理解一句话就很好理解:
子类实例既是子类类型,又是父类类型
这个子类实例没有继承自父类的private属性,这是对的,但是它自己同时又是父类类型呀,所以其实它是有这个属性的,只不过是属于父类类型的,public方法继承自父类类型就不用多说了,它调用这个方法实际上修改的是它属于父类类型这一面的私有属性

这里的setName() 是调用的父类的方法。父类的方法是public 的,子类当然也可以调用。既然可以调用方法了,那当然可以为父类赋值。哪里逻辑不对吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏