黑马程序员技术交流社区

标题: 匿名对象的使用问题 [打印本页]

作者: 高贵杰    时间: 2013-3-4 17:28
标题: 匿名对象的使用问题
本帖最后由 高贵杰 于 2013-3-11 16:53 编辑

class Person
{
private String name;
private int age;
Person()
{
  System.out.println("A:姓名="+name+": 年龄="+age);
}
Person(String n)
{
  name = n;
  System.out.println("B:姓名="+name+": 年龄="+age);
}
Person(String n,int a)
{
  name = n;
  age = a;
  System.out.println("C:姓名="+name+": 年龄="+age);
}
public void setName(String n)
{
  name = n;
}
public String getName()
{
  return name;
}
public void setAge(int a)
{
  if(a>1 && a<100)
  age = a;
}
public int getAge()
{
  return age;
}
void show()
{
  System.out.println("姓名="+name+": 年龄="+age);
  //System.out.println("姓名="+name);
}
}
class  PersonDemo2
{
public static void main(String[] args)
{
  /*
  Person p = new Person();//对象一建立就会调用与之对应的构造函数
  p.setName("zhangs");
  p.setAge(44);
  p.show();
  */
  new Person("hfiei",2).show();
  //Person p = new Person();
  //Person p1 = new Person("jdjkeki");//这里面的赋值是构造函数里面变量的赋值
  //Person p2 = new Person("jdjkeki",44);
}
}

输出结果:
C:姓名=hfiei: 年龄=2
姓名=hfiei: 年龄=2


以上代码是我练习的时候写的,标红部分是匿名对象的调用,我的本意是想看看匿名对象传参数的时候会报什么错误,没想到居然是运行成功的。根据运行结果,我知道先调用了构造函数,然后调用了Person类中的函数。

但是我想知道具体的运行过程,为什么这么写能够运行成功,还有匿名对象是对对象方法进行一次调用,为什么还能赋值成功,请大家帮忙看看。



作者: 陈圳    时间: 2013-3-4 17:39
new Person("hfiei",2).show();
调用这个构造函数:
Person(String n,int a)
{
  name = n;
  age = a;
  System.out.println("C:姓名="+name+": 年龄="+age);
}
本来就应该是正常的,你认为会出错,你感觉它会错在哪里?
他虽然只调用一次,但是你通过构造函数(构造函数里有输出语句)给它赋了值,他又调用了输出方法(又输出一次),然后匿名对象使用完.被回收了...就是这个过程...
作者: lzw123451    时间: 2013-3-4 17:48
很高兴为美女服务
首先匿名对象和普通对象没有什么区别,只是没有用一个变量来保存对象的地址(对象的引用),所以不可能再找出来用了。
new Person("hfiei",2).show();  你这句话,创建了一个对象,并调用了它的方法。这是完整的一句。用完之后再找不出这个对象。

作者: lzw123451    时间: 2013-3-4 17:56
至于过程没什么好说的, 加载PersonDemo2类 - 运行main函数 - 运行第一行代码 - 加载Person类 - 隐式、显示初始化 - 根据传的参数选择构造函数创建对象 - 调用show方法。

作者: 聂斌    时间: 2013-3-4 18:34
同学:
当你在写这句话时new Person("hfiei",2).show();,,,这句话相当于下面的
Person p=new Person("hfiei",2);
p.show();
他们是等效的,,只是匿名函数是简写方式,,,,
匿名对象使用方式:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。这里只说方法没说属性,因为调用属性没有意义....但是如果对一个对象进行多个成员调用,必须给这个对象起个名字。
                //如果对一个对象进行多个成员调用,必须给这个对象起个名字。
作者: 高贵杰    时间: 2013-3-5 08:41
陈圳 发表于 2013-3-4 17:39
new Person("hfiei",2).show();
调用这个构造函数:
Person(String n,int a)

我当时没有考虑到我前面有写构造函数,基于匿名对象只调用一次对象方法的定义,所以我当时认为传参会出错。
当运行成功我又陷入另外一个误区,构造函数在对象一建立就执行,既然在调用构造函数的时候已经执行过一次,应当已成为垃圾被回收。不过我现在知道我当时在这个地方犯了一个错误,匿名对象一建立会调用相应的构造方法,但当关键字new实例化对象时,又满足匿名对象调用一次对象方法,所以执行两次。

不知道我这次的理解对不对,还有问题的话请帮我指正,谢谢!
作者: 陈圳    时间: 2013-3-5 09:21
高贵杰 发表于 2013-3-5 08:41
我当时没有考虑到我前面有写构造函数,基于匿名对象只调用一次对象方法的定义,所以我当时认为传参会出错 ...

既然进了这个论坛,就应该看过毕老师的视频吧?先往前学,学得感觉吃力了,再往回重看视频,巩固一下知识.这些思想还有方式,开始接触时,是有些困难,多复习复习,练练就好了.




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