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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hll 中级黑马   /  2013-9-13 12:38  /  2220 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hll 于 2013-9-13 18:34 编辑

子父类继承中,子类不会继承父类中的private属性,那么在下面这段程序中,我们创建了子类的对象,子类对象没有name属性。可是为什么可以用子类对象s.setName和s.getName 来操作name属性。而如果父类中没有setName()方法,而在子类中写setName方法就会报错?why???
  1. //人类
  2. class Person
  3. {
  4.         private String name;

  5.          Person(String name)
  6.             {
  7.                 this.name=name;
  8.             }

  9.         public String getName()
  10.            {
  11.                 return name;
  12.            }
  13.        public void setName(String name)
  14.           {
  15.                 this.name=name;
  16.           }
  17. }
  18. //学生类
  19. class Student extends Person
  20. {
  21.         Student(String name)
  22.         {
  23.                 super(name);
  24.         }
  25. }

  26. class Test
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.                 Student s=new Student("lisi");
  31.                 s.setName("zhangsang");
  32.                 System.out.println(s.getName());
  33.         }
  34. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

8 个回复

正序浏览
DxxD 中级黑马 2015-3-12 15:05:47
9#
卧槽。。。好乱啊,一边说可以继承,一边说不可以继承,个人比较偏向可以继承,只不过不能直接访问!!!
回复 使用道具 举报
hll 中级黑马 2013-9-13 18:33:25
8#
明白了,谢谢楼上各位
回复 使用道具 举报
private修饰属性,说明不想让外部知道,但是为了使用这些属性,就需要构造方法,让外部来调用这些属性,这就达到了封装的目的,即:你不知道里面是什么,但是给提供了访问的方法,你用就可以了。
在用子类继承的时候,这些属性,方法都会被继承(静态不考虑),私有数据绑定在了父类中,你不能直接调用,子类想使用父类的私有属性,就必须调用父类提供的调用方法了。至于你说不能在子类中定义getName方法,我的理解是:子类可以覆盖父类的方法,也可以定义新的方法,你的情况我理解为,父类中你定义了私有数据,而没有提供getName方法供外部访问,在子类中定义是不会报错的,你所说的应该是调用的时候,父类中没有定义这个方法我这么调用?子类中定义了这个方法,继承来的是绑定在父类中的属性,没有权限,当然访问不到。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
子类是不能继承父类的私有的方法和属性。
你的程序中,虽然定义了一个private的属性,但是同时也定义了两个public的方法来操作这个属性,
而父类中的public方法是可以使用的。
当调用子类的构造方法子类的时候,就会自动调用父类的构造方法的,所以说你这样(Student s=new Student("lisi");)是可以的,

因为name这个属性,因为它是私有的,所以子类是没有的,所以不能该操作它。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
子父类继承中,如果是私有的变量,可以使用,但是需要通过set和get方法,不能直接使用,setName是用来赋值的,在子类中不能直接赋值,必须在父类中赋值,子类来使用
回复 使用道具 举报
我来解释一下:
  1. //学生类
  2. class Student extends Person
  3. {
  4.         Student(String name)
  5.         {
  6.                 super(name);
  7.         }
  8. }
复制代码
此处的构造方法调用父类的构造方法。因为你代码中有: super(name);
所以在你主函数中:
  1. public static void main(String[] args)
  2.         {
  3.                 Student s=new Student("lisi");
  4.                 s.setName("zhangsang");
  5.                 System.out.println(s.getName());
  6.         }
  7. }
复制代码
Student s=new Student("lisi");调用的是父类的Person类中的构造方法。
学生类既然继承了Person类,那么就继承了父类中的方法,如果你没有覆盖(override),那就就调用父类中的方法。所以主函数中的方法调用就没有任何问题。
建议:多思考一下子类父类之间的构造器调用顺序,还有继承的概念。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
私有的方法和属性都不能继承。你上面的这个程序,定义了一个private的属性,然后定义了两个public的方法来操作这个属性,当调用子类的构造方法的时候,就会自动调用父类的构造方法的,所以说你这样(Student s=new Student("lisi");)是可以的,父类中的public方法是可以使用的,至于你说的这个什么 :
如果父类中没有setName()方法,而在子类中写setName方法就会报错?why???
也不是说你写这个方法就会报错,前提是你不能使用name这个属性,因为它是私有的,所以子类是没有的,所以不能该操作它

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
如果没记错的话父类的私有属性也是可以被继承的 只不过子类不能直接去访问父类的私有属性,必须通过调用父类的get和set方法来对私有属性进行操作;如果子类的方法不加注解@Override,不管父类中有没有setName方法子类都是是可以写setName方法的

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马