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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱辉 黑马帝   /  2012-2-16 10:28  /  2853 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱辉 于 2012-2-16 15:03 编辑

public class test {
             public static void main(String[] args) {
                          Father myfather = new Son();
                          Son s = new Son();
                               System.out.println(myfather.str );
                          System.out.println(myfather.getStr());
                          myfather.method();
                          s.method();
                          s.method2();
                                    
                                }

                        }
                        //父类:
                class Father {
                                 String str = "这是父类的属性";
                                public String getStr(){
                                return str;               
                                };
                                public void method(){
                                          System.out.print ("这是父类的方法");
                                }
                        }
                        //子类:
                class Son extends Father {
                                String str = "这是子类的属性";
                                public String getStr(){
                                                return str;               
                                }
                                public void method(){
                                          System.out.println("这是子类的方法");
                                }        
                                public void method2(){
                                          System.out.println("这是子类的方法2");
                                }
                        

                }
主函数里面new了对象,应该自动调用构造函数进行初始化,为什么父类和子类没有构造函数,也可以成功运行?构造函数在什么情况下才是必须要有的?

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 问的好

查看全部评分

11 个回复

倒序浏览
若是自己在类中没有定义构造函数,jvm会自动帮你定义一个无参的构造函数的。但是当你有定义了构造函数后,系统就不会再帮你定义无参的构造函数。

评分

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

查看全部评分

回复 使用道具 举报
当一个类中没有构造参数时,它就会调用默认的无参构造函数!所以肯定可以运行成功。。如果你需要用多种方式创建一个对象,你就需要用到构造函数的重载,一种是默认的构造函数,一种是使用形式参数。。这个时候构造函数是必须要有的。

评分

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

查看全部评分

回复 使用道具 举报
Father myfather = new Son();
1.你new的对象是调用的子类空参数构造函数,子类空参数构造函数又自动调用父类的空参数构造函数。每一个类默认都有一个空参数构造函数。所有能成功运行。

2.构造函数在你用的时候必须要有。例如:你现在用的空参数的构造函数,因为默认都会有,所以不用明确显示。如果你在new对象的类中定义了一个有参数构造函数,这时你又利用参构造函数new对象,就会出错,这时必须无参构造函数必须显示。

评分

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

查看全部评分

回复 使用道具 举报
构造函数什么时候都是必须有的,只不过如果你没有显式的写任何一个构造函数的话JVM在编译时会自动给你添加一个无参空内容的构造函数,不执行任何操作,但是可以用来初始化对象,如果你定义了一个有参数的构造函数,那么JVM就不会再给你写无参的构造函数,如果你创建对象时调用了无参的构造函数,JVM会报错。所以一般情况下写代码都要显式的把无参的和有参的构造函数都写出来,避免出现漏写的情况,毕老师说这是个写代码的好习惯。

评分

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

查看全部评分

回复 使用道具 举报
定义一个类时,如果没有定义构造函数,Java虚拟机会自动生成一个无参的构造函数,如果你手动定义了构造函数,JVM就不会自动生成无参的构造函数了。
简单地说,当你需要用参数实例化对象时,你可以定义有参构造函数

评分

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

查看全部评分

回复 使用道具 举报
当没有构造函数时jvm会自动帮你加一个无参构造函数。当你自己添加了构造函数,jvm不会帮你添加
回复 使用道具 举报
彭坤 中级黑马 2012-2-16 13:26:41
8#
你在主函数中new出来的父、子两个对象都是调用的无参的构造函数
Father myfather = new Son();//()括号里面是空的哦
Son s = new Son();//()括号里面是空的哦
而无参的构造函数不需要显式的声明,虚拟机会默认提供一个无参的构造函数。
当你定义了有参的构造方法后,虚拟机就不再提供无参的构造函数,如果你需要用到无参的构造函数,那么必须手动显式的声明一个。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
1、不写默认构造系统会自定义一个默认构造,无参构造方法
2、如果不希望这个类直接被new出来那么可以私有化构造方法
回复 使用道具 举报
朱辉 黑马帝 2012-2-16 15:03:13
10#
多谢大家的详细说明
回复 使用道具 举报
你写的构造函数是不带参数的 ,而jvm默认的也有个无参数的构造函数。
回复 使用道具 举报
当定义一个类似,如果没写构造函数,JVM会自动帮你添加一个无参的构造函数,以便进行初始化使用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马