黑马程序员技术交流社区

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

作者: 探花    时间: 2014-4-1 20:14
标题: 关于构造函数的问题
构造函数也是一个函数,是不是没有返回值,函数名和类名一样那,什么情况下会设置构造函数,什么情况下不能设置构造函数构造函数有什么作用,还有如果
在一个代码中怎么设置构造函数请高手一 一 仔细解答,谢谢,有代码更好

作者: 闲人    时间: 2014-4-1 20:34
额,我只知道构造函数时用来创建实例对象的,可以让子类进行重载,其他就不清楚了,我是新来的,请多多关照
作者: Up↑Lee↗    时间: 2014-4-1 20:36
对象一建立就会调用与之对应的构造函数。


构造函数的作用:可以用于给对象进行初始化。


构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。

当在类中自定义了构造函数后,默认的构造函数就没有了。


构造函数和一般函数在写法上有不同。

在运行上也有不同。

构造函数是在对象一建立就运行。给对象初始化。
而一般方法是对象调用才执行,给是对象添加对象具备的功能。
一般函数不能调用构造函数
一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。


什么时候定义构造函数呢?
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。


作者: 探花    时间: 2014-4-1 21:18
Up↑Lee↗ 发表于 2014-4-1 20:36
对象一建立就会调用与之对应的构造函数。

构造函数的作用:可以用于 ...

嗯 谢谢
作者: ╰青青子佩ˊゝ    时间: 2014-4-1 21:33
建议看毕老师的基础视频!
作者: 探花    时间: 2014-4-1 21:39
╰青青子佩ˊゝ 发表于 2014-4-1 21:33
建议看毕老师的基础视频!

看了,有些时候会想不透
作者: ╰青青子佩ˊゝ    时间: 2014-4-1 21:57
关于你的问题我总结了5点,希望能帮到你。
  1. //1.构造函数没有返回值,不能定义return语句
  2. class Person{
  3.         private String name ;
  4.         //2.与类名一样,可以被public 、private修饰
  5.         //3.构造函数的作用是给对象初始化,也就是说创建对象时,就让对象具有一些属性。如,一生下孩子,就要有名字,那么设置名字的属性值就可以在构造函数中完成。
  6.         public Person(String name){
  7.                 this.name = name ;
  8.         }
  9. }       
  10. //4.当你要让这个类只存在一个对象(单例设计模式)时,可以用private来修饰构造函数,让其不能被创建对象,而是靠类的静态方法去获取一个对象,如下面这段代码。
  11. class Single{
  12.         private Single(){}
  13.         private static Single s = new Single();
  14.         public static Single getInstance(){
  15.                 return s ;
  16.         }
  17. }
  18. //5.对于怎么设置构造函数,爱怎么设置就怎么设置。注意不能有返回值和return语句就行了。
复制代码

作者: 杨殿生    时间: 2014-4-1 22:40
/*
构造函数
对象一建立就会调用与之对应的构造函数
细节:
        当一个类汇总没有定义构造函数时,那么系统会默认给该类加一个
        空参数的构造函数
        当在类中自定义了构造函数的时候,系统就不会给该类定义够造函数
特点:
        1,函数名与类名相同
        2,不用定义返回值类型
        3,不可以写return语句
作用:
        可以给于给对象进行初始化


构造函数和一般函数在写法上有不同


在运行上也不同
构造函数时在一个对象一建立就运行,给对象初始化
而一般方法是对象调用才执行,是给对象添加对象具备的功能


一个对象建立,构造方法只能运行一次
而一般方法可以被该对象调用多次

什么时候定义构造函数呢?
当分析事物时,该事物就具备一些特性或者行为,那么将这些内容
定义在构造函数中
*/
class Person
{
        private String name;
        private int age;
        Person()
        {
                System.out.println("a:name="+name+"     "+"age="+age);
                cry();
        }
        Person(String n)
        {
                name=n;
                System.out.println("b:name="+name+"     "+"age="+age);
                cry();
        }
        Person(String n,int a)
        {
                name=n;
                age=a;
                System.out.println("c:name="+name+"     "+"age="+age);
                cry();
        }
        public void setName(String n)
        {
                name=n;
        }
        public String getName()
        {
                return name;
        }
        public void cry()
        {
                System.out.println("cry");
        }

}
class  PersonDemo2
{
        public static void main(String[] args)
        {
//                Person p1=new Person();
//                p1.cry();
               
                Person p2=new Person("lisi");
                System.out.println(p2.getName());
                p2.setName("libusi");
                System.out.println(p2.getName());
                               

               
                //Person p3=new Person("wangwu",10);

        }
}

作者: 刘先斌    时间: 2014-4-1 22:48
构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。
特点:
 1:该函数的名称和所在类的名称相同。
 2:不需要定义返回值类型。
 3:该函数没有具体的返回值。
记住:所有对象创建时,都需要初始化才可以使用。

注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。

构造函数和一般函数有什么区别呢?
 1:两个函数定义格式不同。
 2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
    一般函数,是对象创建后,需要调用才执行,可以被调用多次。
   
什么时候使用构造函数呢?
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

构造代码块和构造函数有什么区别?
  构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。
  构造函数:是给与之对应的对象进行初始化。它具有针对性。

Person p = new Person();
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
作者: 孔丽阁    时间: 2014-4-1 23:14
给你一个个人的解释,应该会更形象点:构造函数就是专门用来构造一个对象实例的方法,所以返回值可以省略。现在假设有一个类
class Dog{
   private String name;
   private int age;
   public Dog(){}
   public Dog(String name,int age){
      this.name = name;
      this.age = age;
   }
}
这里边有两个构造函数,第一个是无参构造函数,它的作用就是可以实例化一个无名无年龄的Dog对象。
第二个构造函数也可以实例化一个Dog对象,只不过有名字和年龄。当然,你还可以定义多个构造函数。
作者: 相见欢    时间: 2014-4-2 13:23
构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。
特点:
 1:该函数的名称和所在类的名称相同。
 2:不需要定义返回值类型。
 3:该函数没有具体的返回值。
记住:所有对象创建时,都需要初始化才可以使用。

注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。

构造函数和一般函数有什么区别呢?
 1:两个函数定义格式不同。
 2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
     一般函数,是对象创建后,需要调用才执行,可以被调用多次。
   
什么时候使用构造函数呢?
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

构造代码块和构造函数有什么区别?
  构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。
  构造函数:是给与之对应的对象进行初始化。它具有针对性。

Person p = new Person();
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
作者: Peach2014    时间: 2014-4-2 16:02
本帖最后由 Peach2014 于 2014-4-2 16:03 编辑

你可以将类理解为生产手机的机器,
构造函数就是机器的电路板(构造函数作用),用来设定手机的制造规格,如果你不设定,它就按照默认的规格制造(默认构造函数);
没有返回值,可以理解为它设置之后不需要给其他机器汇报情况;
和类名一样可以理解为给手机贴商标(是我这个机器制造的)

作者: 黄泉    时间: 2014-4-2 17:29
“构造函数是一种很特殊的函数,因为他没有返回值。这和‘返回值为void’有极大的差别。返回void时,一般函数并不返回任何东西,但是一般的函数能够选择是否要返回些什么东西。构造函数则绝对不返回任何东西,而且你也没有任何选择。如果它有一个返回值,而且你有权利选择你自己的返回型别(return   type),编译器势必得通过某种方式来知道如何处理那个返回值。”

构造方法对返回类型没有选择权,也就是说不加任何返回修饰符,以示与其他的方法的区别 ,而void类型表示函数可以控制不让返回值,

简单来说有return就代表着有选择权,即使是void,编译器调用构造函数只是确定它发生,如果有返回值的话编译器就不得不知道针对返回值该这么去做,还有程序员亦可以随意调构造函数了,这样会威胁到程序的安全




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