A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Alex_Guo 中级黑马   /  2014-12-9 23:28  /  1479 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不知道图片能不能上传哈,一个简单的问题:子类的getValue()不是返回子类的i吗?难道子类继承了父类的private属性吗(肯定不会啊)?既然可以打印出getValue(),为什么value打印不出来呢?小弟基础比较差,希望高手们指点。

15 个回复

倒序浏览
有点看不清楚哦!第一次发图片,我直接复制这个小练习吧。如下:
package ee;
/**
* @author Alex
*测试一下子类是否可以继承父类的private属性
*/

//父类,里面有一个private成员变量
class TestPrivateSuper{
          
        private int value = 1;
       
        public TestPrivateSuper(int i) {
                // TODO Auto-generated constructor stub
                this.value = i;
        }
       
        int getValue(){
                  return value;
        }
}

//下面这个类继承了TestPrivateSuper,里面的value打印不出来,但是为什么tp.getValue()能得到呢?
public class TestPrivate extends TestPrivateSuper {

          TestPrivate(int i){
                    super(i);
          }
         
           public static void main(String[] args){
                     TestPrivate tp = new TestPrivate(1);
                     System.out.println(tp.getValue());
                     System.out.println(value);
           }
          
}
问题如上,谢谢大家了、
回复 使用道具 举报
当然不可以打印出来了,因为你定义的是private类型的
tp.getValue()能获取到value的值,是因为你定义了一个getValue()方法
你私有化了一个属性,但你对外提供了一个获取到属性值的方法,所以tp.getValue()能获取到value的值
回复 使用道具 举报
本帖最后由 曛丨黯淡浮华 于 2014-12-9 23:49 编辑

tp.getValue() --->  是因为你继承了父类,你可以使用父类的方法。

你要是直接value, 你就错了~ 因为value被private修饰,

你想访问他,你可以提供一个方法,getValue()就是这个方法。
还有,没有直接value的, 就算value没有被private修饰,你也无法从主函数调用它,

你需要new 一个对象来指向它 ,tp.value ---> 这样才是正确的调用。

评分

参与人数 1技术分 +1 收起 理由
船长 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
曛丨黯淡浮华 发表于 2014-12-9 23:46
tp.getValue() --->  是因为你继承了父类,你可以使用父类的方法。

你要是直接value, 你就错了~ 因为value ...

表述的真棒,船长给31个赞,专业点赞20年
回复 使用道具 举报
曛丨黯淡浮华 发表于 2014-12-9 23:46
tp.getValue() --->  是因为你继承了父类,你可以使用父类的方法。

你要是直接value, 你就错了~ 因为value ...

谢谢,但是,一个子类继承父类以后,那方法就是子类的方法了,那么子类方法肯定访问的是子类的属性,但是这个子类没有i哦。我这样理解是不是错了?
回复 使用道具 举报
船长 发表于 2014-12-9 23:45
当然不可以打印出来了,因为你定义的是private类型的
tp.getValue()能获取到value的值,是因为你定义了一个 ...

船长能不能回答下我下面的问题啊?
回复 使用道具 举报
Alex_Guo 发表于 2014-12-10 00:12
谢谢,但是,一个子类继承父类以后,那方法就是子类的方法了,那么子类方法肯定访问的是子类的属性,但是 ...

难道子类的继承方法可以得到父类的private属性?
回复 使用道具 举报
船长 发表于 2014-12-9 23:55
表述的真棒,船长给31个赞,专业点赞20年

谢谢船长大大  ~
回复 使用道具 举报
Alex_Guo 发表于 2014-12-10 00:12
谢谢,但是,一个子类继承父类以后,那方法就是子类的方法了,那么子类方法肯定访问的是子类的属性,但是 ...

" i " 是形参呀, 形式参数你明白吗?  那是在方法体里边的, 不是在成员位置,他并不是一个属性。

  它相当于一个传递的参数。 i是在方法里,不是在类里,不要混淆了
回复 使用道具 举报
唐的 初级黑马 2014-12-10 00:33:35
11#
让父类封装下字段 ,提供set get方法
回复 使用道具 举报
曛丨黯淡浮华 发表于 2014-12-10 00:28
" i " 是形参呀, 形式参数你明白吗?  那是在方法体里边的, 不是在成员位置,他并不是一个属性。

   ...

明白形参,我这里说的属性是value,我的意思是子类的getValue()应该得到的是子类的value,但是子类一来没有定义value,二来不能继承父类的private value属性,那么只有一种可能了,就是super(1),初始化父类,把父类的属性value设为1,然后子类的继承方法可以访问父类的属性value
回复 使用道具 举报
唐的 发表于 2014-12-10 00:33
让父类封装下字段 ,提供set get方法

提供了以后呢?
回复 使用道具 举报
Alex_Guo 发表于 2014-12-10 00:39
明白形参,我这里说的属性是value,我的意思是子类的getValue()应该得到的是子类的value,但是子类一来没 ...

不知道这样理解对不对呀?
回复 使用道具 举报
本帖最后由 曛丨黯淡浮华 于 2014-12-10 01:09 编辑
Alex_Guo 发表于 2014-12-10 00:39
明白形参,我这里说的属性是value,我的意思是子类的getValue()应该得到的是子类的value,但是子类一来没 ...

1. 子类不能继承父类的private属性,方法。

2. 既然不能继承,那么父类一般情况下会暴露出去2个方法,通过这2个方法来调用vaule ~

3. 这2个方法分别是setValue() , getValue()

4. 子类初始化的时候,调用了自身的构造函数,里面又再调用了super(),  这个super()是隐式的。

5. 也就是说,当子类实例化,那么父类也会随着子类实例化,这是绑定关系。

6. 然后value 就有在内存开辟一个空间,并且赋于 1 的值,

7. 但是,你的子类构造函数调用了父类的构造函数  super(i), 也就说明,你的父类构造函数已经

    初始化了 , 隐式也不再执行了, 然后你的构造函数又一次的为value赋值,

    也就是说,假设你的子类构造函数,传入一个10 ,那么value就不是1了,而是10了,
我写了个比较简单的例子,你看清楚 ——


  1. class Fu
  2. {
  3.         private int value = 1;

  4.         public void setValue(int value)
  5.         {
  6.                 this.value = value;
  7.         }

  8.         public int getValue()
  9.         {
  10.                 return value;
  11.         }
  12. }

  13. class Zi extends Fu
  14. {
  15.         public Zi(int value)
  16.         {
  17.                 setValue(value);
  18.         }

  19.         public static void main(String[] args)
  20.         {
  21.                 Zi zi = new Zi(10);
  22.                 System.out.println(zi.getValue());
  23.         }
  24. }
复制代码



回复 使用道具 举报
曛丨黯淡浮华 发表于 2014-12-10 01:00
1. 子类不能继承父类的private属性,方法。

2. 既然不能继承,那么父类一般情况下会暴露出去2个方法,通 ...

大神,谢谢,能不能留个QQ,想加你!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马