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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭.威 中级黑马   /  2014-10-14 02:13  /  1834 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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型的参数,也可以传年龄?
是不是构造函数都这样?
  

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

12 个回复

倒序浏览
只要你在new的时候传值,调用的就是有参数的构造函数,你这两个变量s1,s2new的时候都传值了,所以调用的都是Person(int age)构造函数,不是你想的s1调的是Person(),s2调的是Person(int age),你理解错了
回复 使用道具 举报
楼主你好,在你 Person s1=new Person(20);这件事的时候,类加载器就会自动帮你找到带参数的构造函数,如果类里面没有带参数的构造函数,则会报错
回复 使用道具 举报
如果一个类没有写上构造函数的时候,那么java编译器会为该类添加 一个无参的构造函数。如果一个类已经写上了一个构造方法的时候,那么java编译器不会再为该类添加无参的构造方法了。构造函数是由jvm调用的, 每创建了一个对应的对象,那么java虚拟机就会调用对应的构造方法一次。楼主传的是个int类型的,所以都是调用的是Person(int age) 这个构造函数
回复 使用道具 举报
你想一想重载就行了,不管你传的是20还是21只要是int类型的,他会自动调用Person(int age)这个方法。
回复 使用道具 举报
因为你的person类中建了两个构造函数,一个是空参数的,一个是带有一个int变量的构造函数,所以你两种对象都能创建
回复 使用道具 举报
zd12345 中级黑马 2014-10-14 11:34:25
7#
这个是重载问题。你要是传入参数就调用带参数的构造方法,不传入就调用不带参数的构造方法的
回复 使用道具 举报
郭.威 中级黑马 2014-10-14 16:06:31
8#
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:24
9#
838598737 发表于 2014-10-14 08:24
如果一个类没有写上构造函数的时候,那么java编译器会为该类添加 一个无参的构造函数。如果一个类已经写上了 ...

你好。Person()    Person s1=new Person(20)    ;这个里面没有(int  age),为什么也可以传20?
                     Person(int  age)   Person s2=new Person(21)
回复 使用道具 举报
就拿这句来说吧,Person s1=new Person(20);首先等号前面,Person s1意思是声明了一个用于接收Person类型对象的变量,这时候对象还没有建立。再看后面new Person(20),此时才建立了对象,调用的是带参数的构造函数。也就是说只有对象在被创建的时候才会调用相应的构造函数,即使用new语句的时候。单单写一句Person()是没有意义的。
回复 使用道具 举报
加油 中级黑马 2014-10-14 16:46:17
11#
你的理解是错误的,你创建的比如:   
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 16:46
你的理解是错误的,你创建的比如:   
Person s1=new Person(20);
上面这一句调用的是如下

谢谢啊,我明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马