黑马程序员技术交流社区

标题: 父类与子类继承中的小问题 [打印本页]

作者: meng    时间: 2013-8-15 17:57
标题: 父类与子类继承中的小问题
当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数,这句话应该怎么理解呢?父类中
构造函数带不带参数?默认的构造函数不是都有一个不带参数吗?怎么会没有空参数的构造函数?

作者: yangxin540    时间: 2013-8-15 18:17
  1. class Person{
  2.     private String name;
  3.     Person(String name){}//这个类中就没有空参数的构造函数
  4. }
复制代码
此时在子类中就必须使用super(name);来访问父类的构造函数,访问父类的构造函数这是super,没有this,你不要弄混啦!
作者: 645420297    时间: 2013-8-15 18:35
不写的话就会有一个空参的构造,自己写了的话 原来的就会被覆盖了 空参的就没有了
作者: masterV    时间: 2013-8-15 18:42
本帖最后由 魏先勇 于 2013-8-15 18:46 编辑

当你再一个类中显式的定义了构造函数的时候,Java就不再给这个类提供默认的构造函数了。子类的构造函数如果没有显式写上super();那么默认在函数的第一行都会加上super();如果父类中没有定义空参数的构造函数,就必须显式用super关键字调用父类带参数的构造方法。或者通过this关键字调用本类的其他构造方法(这个构造方法中一定也使用super关键字调用了父类的构造方法)。附上一段代码:

  1. public class Student extends Person
  2. {
  3.         public String name;
  4.         public int age;
  5.         
  6.         Student(String name)
  7.         {
  8.                 super(name);
  9.         }
  10.         
  11.         Student(String name, int age)
  12.         {
  13.                 this(name);
  14.                 this.age = age;
  15.         }
  16. }

  17. class Person
  18. {
  19.         public String name;
  20.         
  21.         Person(String name)
  22.         {
  23.                 this.name = name;
  24.         }
  25. }
复制代码

作者: hoyouly    时间: 2013-8-15 19:18
(1)当你定义的一个类中没有写任何构造函数的时候,
系统会默认的给这个类一个空参数的构造函数,这个叫默认构造函数
但是当你在这个类中定义了构造函数,哪怕这个构造函数是空参数的,它也不叫默认构造函数,
而是叫空参数的构造函数,

一,        子类中所有构造函数都默认的第一行都是super();只不过这句super是隐式的,
二,        当父类中没有定义空的构造函数时,要手动的添加一个super语句,来指定访问父类中的构造函数
三,        this()语句于spuer()不能共存,因为他们两个都是必须要写在方法的第一行,一个方法只能有一个第一行,所以当他们同时出现的时候,编译会报错,但当一个方法中出现this()语句的时候,会把默认的隐式spuer()语句覆盖掉,


但当你定义的父类中即有空参数的构造函数,又有带参数的构造函数,
例如
class fu
{
        Fu()
        {
                System.out.println("父类的无参构造函数");
        }
        Fu(int  x)
        {
                System.out.println("父类中的有参构造函数,参数为:"+x);
        }
}

子类要继承这个父类,那么子类中的构造函数就需要指明调用的是父类的哪个构造函数了,
class Zi extends Fu
{
        Zi()
        {               
                //super();  //调用无参构造函数可以
                //super(1);//调用有参的构造函数也可以
                System.out.println("子类的无参构造函数");
        }
        Zi(int x)
        {
                //super();  
                //super(1);
                System.out.println("子类中的有参构造函数,参数X为:"+x);
        }
}
这是我的一点理解,希望对你有帮助
作者: 心灵之歌    时间: 2013-8-15 19:32
class Animal
{
        public String name;
        
        Animal(String name)
        {
                this.name = name;//this访问本类的属性
        }
}
class Dog extends Animal
{
      //  public String name;
        public int age;
        
        Dog(String name)
        {
                super(name);//super访问父类中的属性
        }
        
        Dog(String name, int age)
        {
                this(name);//this访问本类中的属性
                this.age = age;
        }
}

当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数,这句话应该怎么理解呢?父类中
构造函数带不带参数?默认的构造函数不是都有一个不带参数吗?怎么会没有空参数的构造函数?
//////如果自己有写构造函数,那默认的空参数构造函数就没有了!
作者: 付龙    时间: 2013-8-15 22:08
基础不扎实啊,回头在复习下
作者: 张俊生    时间: 2013-8-15 23:54
亲,如问题已解决请将分类的未解决改为已解决。

以后的问题贴也要及时更改分类哦~

保持队形,谢谢合作
作者: meng    时间: 2013-8-16 10:11
645420297 发表于 2013-8-15 18:35
不写的话就会有一个空参的构造,自己写了的话 原来的就会被覆盖了 空参的就没有了 ...

我以为写了的话算方法的重载呢?你肯定不是重载吗?

作者: meng    时间: 2013-8-16 10:14
心灵之歌 发表于 2013-8-15 19:32
class Animal
{
        public String name;

我懂了,看来那不叫方法的重载了,因为写了构造函数以后,默认的构造函数就没有了





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