子类为什么能通过继承父类中的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赋值上的呢?
本人小白,希望有大佬可以指点一下我理解上的错误!
这里的setName() 是调用的父类的方法。父类的方法是public 的,子类当然也可以调用。既然可以调用方法了,那当然可以为父类赋值。哪里逻辑不对吗?
其实你只要理解一句话就很好理解:子类实例既是子类类型,又是父类类型
这个子类实例没有继承自父类的private属性,这是对的,但是它自己同时又是父类类型呀,所以其实它是有这个属性的,只不过是属于父类类型的,public方法继承自父类类型就不用多说了,它调用这个方法实际上修改的是它属于父类类型这一面的私有属性
你的理解有一点误区。
首先,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
属性的值。
我想创建一个抽象的父类,其中包含方法公共抽象使用();和使用方法在不同的子类是不同的,但利用父方法的所有Rest,但我希望父类包含一个私有变量,但它需要设置从特定的孩子取决于孩子所以像我有一个家长车,我想与汽车一般工作,但为特定目的的use()方法和设置汽车图像我使用保时捷类这是一个孩子。我不希望汽车图像属性是可访问的,但同时如果它的私人我不能从子构造函数设置它,有什么想法吗?我的问题是如何设置一
本文向大家介绍python中子类继承父类的__init__方法实例,包括了python中子类继承父类的__init__方法实例的使用技巧和注意事项,需要的朋友参考一下 前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。 注意:这个名称的开始和结尾都是
问题内容: 我有及其继承的类。如何从课程中获取属性? 举例来说,让这些和对象: 我想做一些事情,例如: 并得到。我怎样才能做到这一点? 问题答案: 你不能。 实例仅继承父类的方法和属性,而不继承 实例 属性。您不应混淆两者。 是 实例的实例 属性。本实例将有他们 自己 的副本属性。 通常,您将对构造函数进行编码以采用两个参数: 另一种方法是保留对实例的引用: 从那里不再继承。像这样使用它:
问题内容: 我想知道如何将某些函数返回的父对象转换为子类。 我不能更改A类。如果可以的话,我可以对A类实现functionIneed,但是由于代码的结构,这是不可能的。 问题答案: Python不支持“广播”。您将需要编写代码,以便它可以适当地进行初始化。
超类 子类
ts 如何继承父类并修改属性? 相关代码