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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李永涛 于 2012-12-5 12:14 编辑

怎么调用父类构造函数给子类字段赋值?它们之间是继承关系么?

评分

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

查看全部评分

8 个回复

倒序浏览
1.当写好一个类以后,默认会存在一个没有参数的构造函数
2. 当手动添加一个构造函数以后,会将默认的无参数的构造函数覆盖掉。
3.类的构造函数是不能被继承的。只能在子类中去调用父类的构造函数。
4.当父类的构造函数有参数时,子类实例化时,要首先实例化父类。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 崔维友 于 2012-12-5 02:31 编辑

        子类可以继承父类所有非私有的成员,不会继承构造方法和私有的成员。如果有重名现象,对方法来说就发生了重写。
         “调用父类构造函数给子类字段赋值 ”这种说法有误区:调用构造方法即是创建类的实例。子类创建实例会自动调用父类的构造方法,此时在父类构造方法改变子类自己的变量,就如在子类诞生前就改变子类诞生后才能使用的变量,这是不可以的。同时,如果在父类的构造方法中创建子类的实例,会造成死循环。
        但是好在构造函数也可以重载。我们保留一个空参的以备父类被继承后子类实例化时使用,然后创建个带参的作为父类自己实例化时改变已有子类实例的变量时使用。当然最简单的就是创建专用的方法来改变其它对象的变量,而不是通过构造方法。

一个简单的例子:
  1. class Father
  2. {
  3.         //保留一个空参构造方法,以备子类实例化时自动调用
  4.         Father()
  5.         {
  6.                 System.out.println("父类空参构造方法");
  7.         }

  8.         Father(Child child)
  9.         {
  10.                 child.nickname="Jackson";
  11.                 System.out.println("在父类带参构造方法中改变子类的变量了,nickname:"+child.nickname);
  12.         }
  13. }

  14. class Child extends Father
  15. {
  16.         String nickname="stan";

  17.         Child()
  18.         {
  19.                 System.out.println("新实例化的子类变量nickname:"+nickname);
  20.         }
  21. }

  22. class ExtendsDemo
  23. {
  24.         public static void main(String[] args)
  25.         {
  26.                 System.out.println("\t实例化一个子类");
  27.                 Child child=new Child();
  28.                 System.out.println("\n\t实例化一个改变子类变量的父类");
  29.                 Father father=new Father(child);
  30.                 System.out.println("\n\t最终子类的nickname : "+child.nickname);
  31.         }
  32. }
复制代码








评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
//当写好一个子类以后,会有一个默认的无参数的构造函数

//子类继承父类后。父类的构造函数是不能被继承的

//但是,子类也会有自己的构造函数,并且,子类的构造函数会默认调用父类的无参数的构造函数

//此时如果父类中没有无参数的构造函数,会报错

//改造方法

//改造方法2:在父类中增加一个无参数的就OK了   示例:

    class Father

    {

        public string lastName { get; set; }//定¨义?姓?氏?

        private  decimal property;//定¨义?工¤资哩?

        public decimal Property

        {

            get

            {

                return property;

            }

            set

            {

                property = value;

            }



        }

        public string bloodType { get; set; }//定¨义?血a型í

        public Father()

        {

        }


        public Father(string name,decimal pro,string blood)

        {


            lastName = name;

            Property = pro;

            bloodType = blood;

        }



    }

子类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace yuxi

{

    class Son : Father

    {

        //public Son(string name, decimal pro, string blood)

        //{

        //    base.lastName=name;

        //    base.Property = pro;

        //    base.bloodType = blood;


        //}

        //也可以这样下。效果同上注释:

        public Son(string name, decimal pro, string blood)

            : base(name, pro, blood)

        { }

        public void PlayGame()

        {

            Console.WriteLine(" my name is{0},my property is{1},my bloodtype is {2},I am a boy , I play games !", lastName,Property,bloodType);

        }


    }

}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
谢谢各位咯···解决了不少困惑
回复 使用道具 举报
崔维友 发表于 2012-12-5 02:28
子类可以继承父类所有非私有的成员,不会继承构造方法和私有的成员。如果有重名现象,对方法来说就 ...

这个看了但没看懂,也编译通不过所以没办法测试
回复 使用道具 举报
快乐之恋 发表于 2012-12-5 10:37
//当写好一个子类以后,会有一个默认的无参数的构造函数

//子类继承父类后。父类的构造函数是不能被继承 ...

这段代码明明是调用子类构造函数给父类字段赋值
偏要讲成调用父类构造函数给子类字段赋值。。。扯:o哪个老鸟指点下
回复 使用道具 举报
在子类中用base关键字可以调用父类的构造函数赋值的,不过只能给子类从父类继承过来的字段赋值
回复 使用道具 举报
高浩 中级黑马 2013-1-20 13:03:56
9#
该子类在调用其构造函数是,里面有一条隐式的父类构造函数(super();)用来给子类做初始化的,如果该父类中的构造函数都是带参数的,那就需要在子类的构造函数中手动添加父类的构造方法super(参数)否则会报错的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马