黑马程序员技术交流社区
标题:
继承中private属性的继承问题
[打印本页]
作者:
hll
时间:
2013-9-13 12:38
标题:
继承中private属性的继承问题
本帖最后由 hll 于 2013-9-13 18:34 编辑
子父类继承中,子类不会继承父类中的private属性,那么在下面这段程序中,我们创建了子类的对象,子类对象没有name属性。可是为什么可以用子类对象s.setName和s.getName 来操作name属性。而如果父类中没有setName()方法,而在子类中写setName方法就会报错?why???
//人类
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
}
//学生类
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Test
{
public static void main(String[] args)
{
Student s=new Student("lisi");
s.setName("zhangsang");
System.out.println(s.getName());
}
}
复制代码
作者:
Yuan先生
时间:
2013-9-13 13:18
如果没记错的话父类的私有属性也是可以被继承的 只不过子类不能直接去访问父类的私有属性,必须通过调用父类的get和set方法来对私有属性进行操作;如果子类的方法不加注解@Override,不管父类中有没有setName方法子类都是是可以写setName方法的
作者:
白磊
时间:
2013-9-13 14:03
私有的方法和属性都不能继承。你上面的这个程序,定义了一个private的属性,然后定义了两个public的方法来操作这个属性,当调用子类的构造方法的时候,就会自动调用父类的构造方法的,所以说你这样(Student s=new Student("lisi");)是可以的,父类中的public方法是可以使用的,至于你说的这个什么 :
如果父类中没有setName()方法,而在子类中写setName方法就会报错?why???
也不是说你写这个方法就会报错,前提是你不能使用name这个属性,因为它是私有的,所以子类是没有的,所以不能该操作它
作者:
mo﹎雲℡
时间:
2013-9-13 14:17
我来解释一下:
//学生类
class Student extends Person
{
Student(String name)
{
super(name);
}
}
复制代码
此处的构造方法调用父类的构造方法。因为你代码中有: super(name);
所以在你主函数中:
public static void main(String[] args)
{
Student s=new Student("lisi");
s.setName("zhangsang");
System.out.println(s.getName());
}
}
复制代码
Student s=new Student("lisi");调用的是父类的Person类中的构造方法。
学生类既然继承了Person类,那么就继承了父类中的方法,如果你没有覆盖(override),那就就调用父类中的方法。所以主函数中的方法调用就没有任何问题。
建议:多思考一下子类父类之间的构造器调用顺序,还有继承的概念。
作者:
赵凯
时间:
2013-9-13 15:14
子父类继承中,如果是私有的变量,可以使用,但是需要通过set和get方法,不能直接使用,setName是用来赋值的,在子类中不能直接赋值,必须在父类中赋值,子类来使用
作者:
lonely_zb
时间:
2013-9-13 15:32
子类是不能继承父类的私有的方法和属性。
你的程序中,虽然定义了一个private的属性,但是同时也定义了两个public的方法来操作这个属性,
而父类中的public方法是可以使用的。
当调用子类的构造方法子类的时候,就会自动调用父类的构造方法的,所以说你这样(Student s=new Student("lisi");)是可以的,
因为name这个属性,因为它是私有的,所以子类是没有的,所以不能该操作它。
作者:
张晓辉
时间:
2013-9-13 17:36
private修饰属性,说明不想让外部知道,但是为了使用这些属性,就需要构造方法,让外部来调用这些属性,这就达到了封装的目的,即:你不知道里面是什么,但是给提供了访问的方法,你用就可以了。
在用子类继承的时候,这些属性,方法都会被继承(静态不考虑),私有数据绑定在了父类中,你不能直接调用,子类想使用父类的私有属性,就必须调用父类提供的调用方法了。至于你说不能在子类中定义getName方法,我的理解是:子类可以覆盖父类的方法,也可以定义新的方法,你的情况我理解为,父类中你定义了私有数据,而没有提供getName方法供外部访问,在子类中定义是不会报错的,你所说的应该是调用的时候,父类中没有定义这个方法我这么调用?子类中定义了这个方法,继承来的是绑定在父类中的属性,没有权限,当然访问不到。
作者:
hll
时间:
2013-9-13 18:33
明白了,谢谢楼上各位
作者:
DxxD
时间:
2015-3-12 15:05
卧槽。。。好乱啊,一边说可以继承,一边说不可以继承,个人比较偏向可以继承,只不过不能直接访问!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2