黑马程序员技术交流社区

标题: 继承 [打印本页]

作者: qmayuan    时间: 2013-8-18 11:39
标题: 继承
说是有这么三个类  Person   Student  GoodStudentStudent继承Person   GoodStudent 继承Student
那么 GoodStudent 构造方法中可以访问Person的指定构造方法么? 我一直没有想到解决办法 ,求大神指导。

就是我想到   GoodStudnet gs = (GoodStudent ) new Person(“参数");  就是调用Person的有参构造方法,
这段代码编译器运行不会出错,但是运行就会报错~!  我想到了向上转型失败,但是原理能不能帮我讲一下  谢谢啦~!

作者: yangqing    时间: 2013-8-18 12:06
子类能继承父类的所有共性内容,所以子类的子类也能访问父类的共性内容。所以GoodStudent可以访问person类中的构造方法。 如果楼主的问题是不能调用 可能是修饰符的问题--私有了。
编译器只是检测语法错误,而不会检查逻辑错误。
参数化类型是不考虑类型参数的继承关系。
作者: qmayuan    时间: 2013-8-18 12:54
yangqing 发表于 2013-8-18 12:06
子类能继承父类的所有共性内容,所以子类的子类也能访问父类的共性内容。所以GoodStudent可以访问person类 ...

比如我GoodStudent  的构造方法想访问Person有参构造函数应该怎么访问   如果用 super(),  那么访问的是Student的无参构造方法。

作者: straw    时间: 2013-8-18 15:27
qmayuan 发表于 2013-8-18 12:54
比如我GoodStudent  的构造方法想访问Person有参构造函数应该怎么访问   如果用 super(),  那么访问的是S ...

首先楼主的你的代码段:GoodStudent gs=new person("你好!"); 这是错误的!原因是子类不能应用父类的实例,而父类能应用子类的实例.


楼主不是很明白上面兄弟的意思.好吧,我来在给你解释解释...
1,首先子类可以访问父类所有的共性方法或属性,就是用public来修饰的方法或者属性.
   但是如果是private来修饰的方法或者属性的话,子类不能访问了.
2,那么楼主如果想调用父类的有参构造函数,则该构造函数必须是public的.或者其他非private修饰的构造函数.
下面是我对楼主的问题写的代码:
  1. public class Person {
  2. //Persion的有参构造函数
  3. public Person(String value){
  4. System.out.println("Persion的构造函数:"+value);
  5. }
  6. }
复制代码
  1. public class Student extends Person{
  2. public Student(String value) {
  3. //调用父类的构造函数
  4. super(value);
  5. }
  6. }
复制代码

  1. <P>public class GoodStudent extends Student{
  2. public GoodStudent(String value) {
  3. //调用父类的构造函数
  4. super(value);
  5. }
  6. public static void main(String[] ages){
  7. //调用person的有参构造函数,其实调用本类的同样有参函数就可以了
  8. GoodStudent gs=new GoodStudent("你好!");
  9. }
  10. }</P>
复制代码
这样就可以调用父类的有参构造函数了.
可是你会发现每一个Person的子类都同样有一个相同参数的构造函数.原因是父类Person的有参构造函数的public修饰的,子类都继承了.说明子类
可以经过该构造函数来创建父类实例.既然如此那么子类就必须也有一个相同参数的构造函数,否则将违反子类可以继承全部父类共性方法属性的原则.
而子类的有参构造函数体重则在返回调用父类的相同参数的构造函数.






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2