黑马程序员技术交流社区

标题: 关于对象初始化我也是看的醉了~大家帮忙看下思路对么 [打印本页]

作者: 清诗纪事    时间: 2014-12-4 17:41
标题: 关于对象初始化我也是看的醉了~大家帮忙看下思路对么
  1. class Person
  2. {
  3.         private String name;
  4.         private int age;
  5.         private static String country="cn";

  6.         Person(String name,int age){
  7.        
  8.                 this.name=name;
  9.                 this.age=age;
  10.         }

  11.         {
  12.        
  13.                 System.out.println(name+"..."+age);
  14.         }

  15.         public void setName(String name){
  16.        
  17.                 this.name=name;
  18.         }

  19.         public void speak(){
  20.        
  21.                 System.out.println(this.name+"..."+this.age);
  22.         }

  23.         public static void showCountry(){
  24.        
  25.                 System.out.println("country="+country);
  26.         }
  27. }


  28. class PersonDemo1
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 Person p=new Person("zhangsan",20);
  33.                 p.setName("lisi");
  34.         }
  35. }
复制代码




作者: 清诗纪事    时间: 2014-12-4 17:42
我去。。崩溃了,编辑那么久的思路怎么没有发表出来。。。
作者: zhou1234    时间: 2014-12-4 17:46
不完整啊,speak showCountry没打印出来,其他的对
作者: 清诗纪事    时间: 2014-12-4 17:50
思路:
1、Person p=new Person("zhangsan",20);之后把Person类从硬盘调到内存,并非配地址开始初始化
问题1、是不是Person类中所有的方法都存储在内存中的方法区?
2、因为构造代码块和static代码块的优先级比构造函数高,那么Person p=new Person("zhangsan",20);是先被构造代码块
{
        System.out.println(name+"..."+age);
}进行初始化的么?
3、构造函数Person(String name,int age){}是对默认空参数那个构造函数Person(){}的重载对么?
4、被构造代码块初始化之后,还要继续调用构造函数Person(String name,int age){}么?
作者: 清诗纪事    时间: 2014-12-4 18:38
清诗纪事 发表于 2014-12-4 17:42
我去。。崩溃了,编辑那么久的思路怎么没有发表出来。。。

麻烦看下我下边的思路和问题。。结果是name=null,age=0是因为只通过构造代码块进行初始化么?
作者: Mr.Ni    时间: 2014-12-4 18:54
清诗纪事 发表于 2014-12-4 18:38
麻烦看下我下边的思路和问题。。结果是name=null,age=0是因为只通过构造代码块进行初始化么? ...

先构造代码块再构造函数
构造代码是对所有的对象
构造函数是指符合参数列表类型的对象
作者: Mr.Ni    时间: 2014-12-4 19:01
1.是的
2.静态代码块(如果有)-->构造代码块——>对应的构造函数
3.是重载
4.要继续调用,你这里没在构造函数内调用speak();

作者: 清诗纪事    时间: 2014-12-4 19:52
Mr.Ni 发表于 2014-12-4 19:01
1.是的
2.静态代码块(如果有)-->构造代码块——>对应的构造函数
3.是重载

soga~明白了,原来输出结果不是name=zhangsan,age=20是因为在Person(String name,int age){}这个函数中没有输出,其实已经调用了,只要在这个重载函数中加个输出语句就可以了~~谢谢哈
作者: 等狂疯来    时间: 2014-12-4 20:44
我的理解是这样的:先执行Person p,即先进行类的加载,类的加载顺序是这样的,类成员(静态变量和静态构造代码块)的优先级是一样的,也即静态变量和静态构造代码块谁在前面谁就会被先执行;然后再执行new  Person ( " z hangsan",20); 即执行对象的创建,实例成员和构造代码块的优先级也是一样的(也即谁在前面谁就先执行),但都是优先于构造方法的执行,
作者: 李天富    时间: 2014-12-5 14:17
默认空参数的构造函数在你自定义构造函数之后就不存在了,所以,不是重载。你可以调用一下空参数构造函数试一下,会报错。
作者: as604049322    时间: 2014-12-5 14:33
构造代码快先执行,2个私有变量还没有被初始化呢,我在想难道楼主的程序没报错?
作者: 清诗纪事    时间: 2014-12-5 15:48
as604049322 发表于 2014-12-5 14:33
构造代码快先执行,2个私有变量还没有被初始化呢,我在想难道楼主的程序没报错? ...

p.setName("lisi");这行是注释掉的,没有报错,目的是想测试一下初始化的优先级~静态代码块-->构造代码块-->构造函数




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