黑马程序员技术交流社区

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

作者: 郭.威    时间: 2014-10-14 02:13
标题: 关于构造函数
class Person
{
        private int age;
        Person()//构造方法这是,和类名相同的方法
        {
                System.out.println(age);
        }
        Person(int age)
        {
                this.age=age;
                System.out.println(age);
        }
        public  int bi(Person s)//比什么传什么,比较人就传一个人和一个变量
        {
                return this.age-s.age;//this.age==s.age  显示的是boolean型,前提是int型也改成boolean型
        }                                                //this代表s1,s代表s2,this代表本类引用,
}
class PersonDemo4
{
        public static void main(String[] args)
        {
                Person s1=new Person(20);//传参数
                Person s2=new Person(21);
                int x=s1.bi(s2);//函数调用
                System.out.println(x);//输出
        }
}
Person方法中是不是有没有参数都可以传年龄?(我也知道,就是不知道为什么?)
比如:Person()    Person s1=new Person(20);
Person(int  age)   Person s2=new Person(21)
为什么第一个里面没有int型的参数,也可以传年龄?
是不是构造函数都这样?
  


作者: yangyujoe    时间: 2014-10-14 05:29
只要你在new的时候传值,调用的就是有参数的构造函数,你这两个变量s1,s2new的时候都传值了,所以调用的都是Person(int age)构造函数,不是你想的s1调的是Person(),s2调的是Person(int age),你理解错了
作者: HM2014nuli    时间: 2014-10-14 07:10
楼主你好,在你 Person s1=new Person(20);这件事的时候,类加载器就会自动帮你找到带参数的构造函数,如果类里面没有带参数的构造函数,则会报错
作者: 838598737    时间: 2014-10-14 08:24
如果一个类没有写上构造函数的时候,那么java编译器会为该类添加 一个无参的构造函数。如果一个类已经写上了一个构造方法的时候,那么java编译器不会再为该类添加无参的构造方法了。构造函数是由jvm调用的, 每创建了一个对应的对象,那么java虚拟机就会调用对应的构造方法一次。楼主传的是个int类型的,所以都是调用的是Person(int age) 这个构造函数
作者: Quasimodo    时间: 2014-10-14 08:56
你想一想重载就行了,不管你传的是20还是21只要是int类型的,他会自动调用Person(int age)这个方法。
作者: EDDY_Liang    时间: 2014-10-14 11:18
因为你的person类中建了两个构造函数,一个是空参数的,一个是带有一个int变量的构造函数,所以你两种对象都能创建
作者: zd12345    时间: 2014-10-14 11:34
这个是重载问题。你要是传入参数就调用带参数的构造方法,不传入就调用不带参数的构造方法的
作者: 郭.威    时间: 2014-10-14 16:06
838598737 发表于 2014-10-14 08:24
如果一个类没有写上构造函数的时候,那么java编译器会为该类添加 一个无参的构造函数。如果一个类已经写上了 ...

你好。Person()    Person s1=new Person(20)    ;这个里面没有(int  age),为什么也可以传20?
                     Person(int  age)   Person s2=new Person(21)
作者: 郭.威    时间: 2014-10-14 16:08
838598737 发表于 2014-10-14 08:24
如果一个类没有写上构造函数的时候,那么java编译器会为该类添加 一个无参的构造函数。如果一个类已经写上了 ...

你好。Person()    Person s1=new Person(20)    ;这个里面没有(int  age),为什么也可以传20?
                     Person(int  age)   Person s2=new Person(21)
作者: 李天富    时间: 2014-10-14 16:12
就拿这句来说吧,Person s1=new Person(20);首先等号前面,Person s1意思是声明了一个用于接收Person类型对象的变量,这时候对象还没有建立。再看后面new Person(20),此时才建立了对象,调用的是带参数的构造函数。也就是说只有对象在被创建的时候才会调用相应的构造函数,即使用new语句的时候。单单写一句Person()是没有意义的。
作者: 加油    时间: 2014-10-14 16:46
你的理解是错误的,你创建的比如:   
Person s1=new Person(20);
上面这一句调用的是如下
Person(int age)
         {
                 this.age=age;
                 System.out.println(age);
         }//它代表你在堆内存中创建了一个对象S1,他是被有参的函数接收的
然后你又输入了: Person(int  age)   Person s2=new Person(21)
这代表你又在堆内存中创建了一个s2的对象,这个对象的传值仍然是传给有参的构造函数,你可以重新输出一句话在有参的构造方法中输入 System.out.println("有参的构造方法输出了"+age);
再无参的构造方法中输入 System.out.println("无参的构造方法输出了"+age);你查看一下输出结果,就会证明了

作者: 面具猴    时间: 2014-10-14 17:03
那两个都是调用有参数的构造方法啊,
作者: 郭.威    时间: 2014-10-14 17:38
加油 发表于 2014-10-14 16:46
你的理解是错误的,你创建的比如:   
Person s1=new Person(20);
上面这一句调用的是如下

谢谢啊,我明白了




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