子类使用了父类的私有属性?

子类使用了父类的私有属性?

package com.imooc.work;
 
public class Work {
 
    // 屬性:工作ming
    private String name;
 
    // 無參的構造方法
    public void Work() {
 
    }
 
    // 有餐的構造方法
    public void Work(String name) {
        this.setName(name);
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getName() {
        return name;
    }
    public String work() {
        String st="開心工作";
        return st;
    }
         
}
package com.imooc.work;
 
public class TestWork extends Work{
     
    private int testNum;
    private int bugNum;
     
    public  TestWork() {
         
    }
    public  TestWork(String name,int testNum,int bugNum) {
        this.setName(name);
        this.setTestNum(testNum);
        this.setBugNum(bugNum);
    }
     
    public int getTestNum() {
        return testNum;
    }
    public void setTestNum(int testNum) {
        this.testNum = testNum;
    }
    public int getBugNum() {
        return bugNum;
    }
    public void setBugNum(int bugNum) {
        this.bugNum = bugNum;
    }
    public String work() {
        String st=this.getName()+"工作的日報是:今天編寫了"+this.getTestNum()+"測試用例,發現了"
                +this.getBugNum()+"bug";
        return st;
                 
    }
     
 
}

老师,这段代码里,子类TestWork怎么可以使用父类的私有属性private String name呢?不是说子类只能继承父类的公有成员吗?

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,

1、参数列表的定义与属性区域直接定义的方式是不一样的

2、TestWork类没有自己的name属性。

3、这里this.getName() 中的this指的是子类的对象。

public修饰的getName()方法。

整个过程可以这样理解:

Test类通过TestWork tw = new TestWork("测试工作",10,5);创建对象,调用TestWork的有参构造方法,在有参构造方法中,调用父类的setName()方法,为父类的对象的name属性赋值,然后在底层会使用反射的方式赋给子类的对象,最后通过this.getName()方法进行获取的子类的name值。

同学可以不用深究原理,这里JVM在底层会帮我们完成哦~不用太纠结

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 天才少年25 提问者 #1
    老师,你这里的子类指的就是TestWork类吗?第二点你说,TestWork类没有name属性,但是最后又说获取子类的name属性。这是不是有点矛盾?
    2019-08-22 20:22:48
  • 天才少年25 提问者 #2
    老师,你这里的子类指的就是TestWork类吗?第二点你说,TestWork类没有name属性,但是最后又说获取子类的name属性。这是不是有点矛盾?
    2019-08-22 20:22:49
  • 好帮手慕酷酷 回复 提问者 天才少年25 #3
    同学你好, 1、子类指的是TestWork类 2、这里老师纠正一下,这里的TestWork类在底层内部会有一个name属性,这个name属性是JVM帮我们创建和完成的,没有继承父类得属性哦~ 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!​
    2019-08-23 09:52:42
好帮手慕酷酷 2019-08-22 18:45:08

同学你好,TestWork类中定了name的属性了哦~具体位置如下:

http://img1.sycdn.imooc.com//climg/5d5e72210001f5a105850141.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 天才少年25 #1
    但是它没有用语句声明啊,只是在参数列表里定义了,这个在属性区域直接定义,比如:private String name这种,还是有区别吧。
    2019-08-22 18:52:26
  • 提问者 天才少年25 #2
    TestWork类有自己的name属性吗?最后的Work方法中,有this. getName(),首先他这个类自己要有一个name属性,才能用getName方法呀
    2019-08-22 18:58:26
  • 提问者 天才少年25 #3
    子类没有自己的getName和setName方法,但是它继承了父类公有的getName和setName方法。然而父类的这两个方法是操作父类自身的私有属性name的。照这个逻辑,子类调用这两个方法时,最终指向的是父类私有属性name咯?
    2019-08-22 19:25:10
好帮手慕酷酷 2019-08-22 18:27:47

同学你好,同学是指在TestWork类的有参构造方法中使用了name属性吗?这里的name是我们定义的接收通过创建对象传递过来的name参数哦~没有使用父类的私有属性,然后调用父类public的setName()方法。具体如图:

http://img1.sycdn.imooc.com//climg/5d5e6d0600012b0605780128.jpg

另外,同学的构造方法编写的不正确,是没有返回类型的哦~应该删除void,修改后的代码如下:

http://img1.sycdn.imooc.com//climg/5d5e6e7d0001cf0f02240106.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 天才少年25 #1
    但是TestWork里,没有任何地方定义了name属性啊,那么这个类有自己的name属性吗
    2019-08-22 18:33:45
BraveSong灬 2019-08-22 18:21:28

应为set和get这两个方法是public修饰的,子类通过这个方法可以间接的访问父类属性

  • 提问者 天才少年25 #1
    那此时,子类到底有没有name这个属性呢?自身有没有?
    2019-08-22 18:28:39
  • BraveSong灬 回复 提问者 天才少年25 #2
    没有的,他只是通过get用父类的
    2019-08-22 18:31:18
  • 提问者 天才少年25 回复 BraveSong灬 #3
    这个类最后有一个Work方法,里面有一句this. getName(),那么,这里的this应该指的是子类自己,但是你要getName,首先你自己得要有一个name吧,不然怎么getName?
    2019-08-22 18:44:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师