黑马程序员技术交流社区

标题: 默认构造函数 [打印本页]

作者: 陈雪平    时间: 2012-12-16 12:41
标题: 默认构造函数
昨天看到构造函数这一节,有点迷惑,到底什么是默认构造函数,是没有参数的构造函数么?不过默认的不是系统自动给的吗,既然本类都有构造函数了,还会给默认构造函数?实在有点想不通,求解惑!!
作者: 翁鹏    时间: 2012-12-16 13:38
本帖最后由 翁鹏 于 2012-12-16 13:43 编辑

如果你没有写任何构造函数,java编译器会给你自动加上一个无参数的构造函数。(你自己在代码里没有写任何构造函数的情况下)

如果你在代码里写了构造函数,不管是有参数的还是没有参数的,编译器就不会给你加那个无参数构造函数了。


编译器加的那个构造函数应该是这样的:
public ClassName()
{
        supur();                  //(这也是编译器默认加上的,你可以选择不写)
}

所以你也可以自己显示写一个这样的构造函数(再强调一遍:你自己写了构造函数,编译器就不会给你加默认的无参数构造函数了)

作者: netboy032    时间: 2012-12-16 13:41
如果你不显示写构造函数的话,系统就会给类一个默认的不带参数的构造函数啊。如果你在代码中写明了构造函数的话,系统就以你写的构造函数为准,默认的不带参数的构造函数就没有了,除非你显示写了一个不带参数的构造函数。
作者: 李培根    时间: 2012-12-16 13:44
一个类中是必须要有构造函数的,在没有自定义的情况下会默认存在一个空参数的构造函数。
如果用户自定义了构造函数,不管定义的构造函数是不是空参数的,默认的空参数的构造函数就没有了。
作者: 郑传庆    时间: 2012-12-16 13:48
默认的构造函数是指当创建一个类(A)时,该类(A)里面没有写构造函数,这时java虚拟机会自动为该类创建一个默认无参的构造函数,而在实例化(A a = new A())该类时,调用的是虚拟机提供的构造函数。而当你该类(A)指定无参(A a = new A())或者有参(A a = new A( String name, String score))的构造函数时,java虚拟机就不会为该类创建一个无参的构造函数,而在实例化该类时,调用的是自己写的构造函数。举个例子:

public class Seller{
   
   public static void maim(String[] args){
          Student student = new Student();//这时调用的是 java虚拟机提供的无参的构造函数
          /*
           * 这时不是调用 java虚拟机提供的无参的构造函数,因为Student1类已经有构造函数了,所以这里调用的是自己写的一个没带参数的构造函数
           */
          Student1 student1 = new Student1();
         
   }
   /**
    *没有构造函数的类
    */
  class Student {
        private String name;
        private String score;
      
        public String  getName(){
               return name;
        }
        public void setName(){
                this.name = name;
        }
        public String  getScore(){
               return score;
        }
        public void setScore(){
               this.score = score;
        }
   }
   /**
    *有构造函数的类
    */
  class Student1 {
        private String name;
        private String score;
      
        public String  getName(){
               return name;
        }
        public void setName(){
                this.name = name;
        }
        public String  getScore(){
               return score;
        }
        public void setScore(){
               this.score = score;
        }

        public Student(){ System.out.println("自己写的构造函数");}
        public Student(String name,String score){
               this.name = name;
               this.score = score;
        }
  }
}

希望对楼主有帮助



作者: 陈雪平    时间: 2012-12-16 15:03
那这个显示写出的无参数的构造函数,也能称为默认构造函数么?
作者: 翁鹏    时间: 2012-12-16 15:09
陈雪平 发表于 2012-12-16 15:03
那这个显示写出的无参数的构造函数,也能称为默认构造函数么?

不能,只有编译器给你加的的构造函数,才是默认的无参数构造函数。

自己显示写出来的就是普通的构造函数。

其实你自己思考一下为什么要加构造函数就能够理解得更加透彻。
作者: 陈雪平    时间: 2012-12-16 15:54
翁鹏 发表于 2012-12-16 15:09
不能,只有编译器给你加的的构造函数,才是默认的无参数构造函数。

自己显示写出来的就是普通的构造函数 ...

恩恩,谢谢啦,我会好好想想的!!
作者: yuchen208    时间: 2012-12-16 16:14
javap编译时就会出现默认的构造方法

Test.jpg (565.17 KB, 下载次数: 70)

Test.jpg

作者: yuchen208    时间: 2012-12-16 16:22
在写无参构造方法时覆盖默认的

test1.jpg (508.93 KB, 下载次数: 67)

test1.jpg

作者: yuchen208    时间: 2012-12-16 17:32
默认构造方法,是方便实例化,类之间的调用 如下图:
要是没有默认构造方法,那么这个类也没有意义了
除了单例模式XX

TEST2.jpg (841.19 KB, 下载次数: 73)

TEST2.jpg





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