黑马程序员技术交流社区

标题: 继承,子类初始化的问题!! [打印本页]

作者: 黑马一刘昭    时间: 2013-5-14 15:51
标题: 继承,子类初始化的问题!!
本帖最后由 梦亦无痕 于 2013-5-14 17:51 编辑

理论是:
若我们显示的让子类去调用父类有参数的构造方法,默认的隐式的构造方法就不会被调用了;


但是,这段代码为什么执行的不是这个效果,或者说我写错了?谢谢,求大神!!

class per//父类
{
        String name ;
        per()//默认修饰符为default
        {
                System.out.println("您好!");
        }
        per(String name)//默认修饰符为default
        {
                this.name = name;
                System.out.println("hello");
        }
}

class stu extends per//子类
{
        stu()
        {
                System.out.println("————————>您好!");
        }
}

class  kollpg
{
        public static void main(String[] args)
        {
                //new per("kio");
                new stu();//创建一个新的对象;它会去调用构造方法,顺序是先调用父类对象的构造方法,然后是子类的!
        }
}


作者: long    时间: 2013-5-14 16:13
本帖最后由 long 于 2013-5-14 16:15 编辑

给楼主纠正一下:默认修饰符为空白,也就是没有修饰符,它给予被修饰的成员包访问权限(可在同一个包内被访问)。
class stu extends per//子类
{
        stu()
        {   
           spuper(); //这里有一条隐式的super();语句, 编译器会偷偷给补充上 ,不信楼主可以给源文件加上,输出结果是一样的   
           System.out.println("————————>您好!");
        }
}

楼主的子类构造函数没有显示的先去调用父类有参数的构造方法,所以子类构造函数每次调用前都会先调用父类的无参构造方法。

new per("kio"); //创建一个per类的对象,该对象跟stu类不沾边,有没有该条语句后面的语句new stu();的输出都是一样的

作者: 殇_心。    时间: 2013-5-14 16:43
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
作者: xuemeng    时间: 2013-5-14 17:25
class stu extends per//子类
{
        stu()
        {               
                        //当创建子类对象时, 子类对象会隐式的调用父类的无参构造器
                        //也就是说, 这里其实有一个 super()调用语句, 该语句就是在调用父类的无参构造器,因为是隐式调用所以我们就看不见,当然你也可以写出来,不过写出来后就不叫隐式调用了
                        //super(); //这里其实有个super()调用语句,调用父类无参构造器
                        //关于你说的当我们现实调用父类有参构造方法后,默认的隐式构造方法不会被调用这句话是正确的,没有一点问题
                   // 因为你这段代码,你根本就没有显示调用父类的有参构造方法啊,这里我给加上吧
                   super("haha");//这才是显示调用父类的有参构造方法啊, 当你new stu()时,程序就会执行构造函数中的代码,先执行super("haha"),也就是调用父类的有参构造器,
                   //即 per(String name) {}这个构造器, 执行完这个构造器里面的代码,然后就执行本类的输出语句.  
                   //这里加上super("haha")后, 程序就不会执行per(){}这个构造方法了, 因为你显示的调用了父类的有参构造器per(String name)构造器
                  
                  
                   //构造器也叫构造函数, 也叫构造方法,  另外 类名命名应该用驼峰式命名法  没个单词首字母大写, 希望能养成好习惯!!毕竟要走程序员这条路, 那么你就得遵循这个规矩
                  
                System.out.println("————————>您好!");
        }
}

class  kollpg
{
        public static void main(String[] args)
        {
                //new per("kio");
                new stu();//创建一个新的对象;它会去调用构造方法,顺序是先调用父类对象的构造方法,然后是子类的!
        }
}

作者: 黑马一刘昭    时间: 2013-5-14 17:53
xuemeng 发表于 2013-5-14 17:25
class stu extends per//子类
{
        stu()

谢谢,你讲的真好,费心了。真心感谢!!希望以后我也可以帮助到你!:handshake
作者: 黑马一刘昭    时间: 2013-5-14 17:57
long 发表于 2013-5-14 16:13
给楼主纠正一下:默认修饰符为空白,也就是没有修饰符,它给予被修饰的成员包访问权限(可在同一个包内被访 ...

谢谢你的回答,我清楚了,衷心感谢,希望我以后也可以帮助到你!:handshake




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