黑马程序员技术交流社区

标题: 关于构造函数的问题 [打印本页]

作者: 朱辉    时间: 2012-2-16 10:28
标题: 关于构造函数的问题
本帖最后由 朱辉 于 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了对象,应该自动调用构造函数进行初始化,为什么父类和子类没有构造函数,也可以成功运行?构造函数在什么情况下才是必须要有的?
作者: 刘基军    时间: 2012-2-16 11:09
若是自己在类中没有定义构造函数,jvm会自动帮你定义一个无参的构造函数的。但是当你有定义了构造函数后,系统就不会再帮你定义无参的构造函数。
作者: 张勇    时间: 2012-2-16 11:13
当一个类中没有构造参数时,它就会调用默认的无参构造函数!所以肯定可以运行成功。。如果你需要用多种方式创建一个对象,你就需要用到构造函数的重载,一种是默认的构造函数,一种是使用形式参数。。这个时候构造函数是必须要有的。
作者: 余松霖    时间: 2012-2-16 11:14
Father myfather = new Son();
1.你new的对象是调用的子类空参数构造函数,子类空参数构造函数又自动调用父类的空参数构造函数。每一个类默认都有一个空参数构造函数。所有能成功运行。

2.构造函数在你用的时候必须要有。例如:你现在用的空参数的构造函数,因为默认都会有,所以不用明确显示。如果你在new对象的类中定义了一个有参数构造函数,这时你又利用参构造函数new对象,就会出错,这时必须无参构造函数必须显示。
作者: 孙汇川    时间: 2012-2-16 11:15
构造函数什么时候都是必须有的,只不过如果你没有显式的写任何一个构造函数的话JVM在编译时会自动给你添加一个无参空内容的构造函数,不执行任何操作,但是可以用来初始化对象,如果你定义了一个有参数的构造函数,那么JVM就不会再给你写无参的构造函数,如果你创建对象时调用了无参的构造函数,JVM会报错。所以一般情况下写代码都要显式的把无参的和有参的构造函数都写出来,避免出现漏写的情况,毕老师说这是个写代码的好习惯。
作者: 冯祖焱    时间: 2012-2-16 11:22
定义一个类时,如果没有定义构造函数,Java虚拟机会自动生成一个无参的构造函数,如果你手动定义了构造函数,JVM就不会自动生成无参的构造函数了。
简单地说,当你需要用参数实例化对象时,你可以定义有参构造函数
作者: 黄锦成    时间: 2012-2-16 11:33
当没有构造函数时jvm会自动帮你加一个无参构造函数。当你自己添加了构造函数,jvm不会帮你添加
作者: 彭坤    时间: 2012-2-16 13:26
你在主函数中new出来的父、子两个对象都是调用的无参的构造函数
Father myfather = new Son();//()括号里面是空的哦
Son s = new Son();//()括号里面是空的哦
而无参的构造函数不需要显式的声明,虚拟机会默认提供一个无参的构造函数。
当你定义了有参的构造方法后,虚拟机就不再提供无参的构造函数,如果你需要用到无参的构造函数,那么必须手动显式的声明一个。
作者: 丁晓宇    时间: 2012-2-16 14:20
1、不写默认构造系统会自定义一个默认构造,无参构造方法
2、如果不希望这个类直接被new出来那么可以私有化构造方法
作者: 朱辉    时间: 2012-2-16 15:03
多谢大家的详细说明
作者: b_boywindy    时间: 2012-2-16 15:25
你写的构造函数是不带参数的 ,而jvm默认的也有个无参数的构造函数。
作者: 陈伟    时间: 2012-2-17 11:15
当定义一个类似,如果没写构造函数,JVM会自动帮你添加一个无参的构造函数,以便进行初始化使用




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