黑马程序员技术交流社区

标题: 建立对象的问题 [打印本页]

作者: 林康春    时间: 2012-1-1 02:35
标题: 建立对象的问题
本帖最后由 林康春 于 2012-1-2 13:16 编辑

class Person
{
        private Person(){}//这里是什么意思?        private String name = "hah";//定义name,默认值为:hah
        private int age;//定义age,默认值为0
        private static  String country = "cn";//该类中的static代码块
        Person(String name,int age)//在堆内存中建立对象的特有属性。
        {        this.name = name;
                this.age = age;
        }
       
        {
                System.out.println(name+".."+age);//打印name ,age
        }
}

class  PersonDemo
{
        public static void main(String[] args)
        {
                Person p = new Person();//建立对象
          
}
}
编译错误 :
PersonDemo.java:21: 找不到符号
符号: 构造函数 Person()
位置: 类 Person
                Person p = new Person();

不明白?什么问题呢?
                           ^

作者: 沈样    时间: 2012-1-1 03:42
因为你把默认的构造函数设为了private 这样的话,就不能在外部进行多个实例化了,你可以用staitc的get方法取得实例化这个类,这样就可以保证程序这有类被实例化一次,不知道说得对吗有错误请指出
作者: 詹英鹏    时间: 2012-1-1 11:04
首先这句话private Person(){},是把Person类的无参数构造函数给私有化了
所以该类只能在类内部建立对象,在外部就不能new对象了
想要Person对象,你必须在Person类内部定义一个函数来获取对象
比如:
private Person p=new Person();
Public Person getPerson()
{
      return p;
}
这样外部才能通过Public getPerson函数获取到该对象,
这其实就是一个单列的饿汉式
作者: 罗全涛    时间: 2012-1-1 11:12
首先你需要明确访问修饰符private、public的区别,给出的代码中 private Person(){ }
这里你将构造方法的访问权限设置成了private也就是只有本类自己可以访问,你在别的类中
是没有访问权限的,你需要将访问修饰符改为public公有的,那么别的类就能够进行访问,
建议你看看访问权限修饰符的文章。
作者: 为梦而战    时间: 2012-1-1 11:20
     代码中你写了两个构造函数,一个是无参数的Person(){},一个是带两个参数的Person(String name,int age){this.name=name;this.age=age;}
你用private修饰了无参数的构造函数后,那在类外就不能再创建无参数的对象了,这也是private修饰了此构造函数的作用,所以你在PersonDemo类中用new Person(),就会报错。你还有一个没有被修饰的带参数的构造函数,这个构造函数是可以在PersonDemo类中创建带两个参数的对象的,比如Person p1=new Person("zhangsan",25);这样是没有问题的。
作者: 代臣    时间: 2012-1-1 13:22
本帖最后由 代臣 于 2012-1-1 13:30 编辑

private Person(){}
private:私有,权限修饰符,用于修饰类中的成员(成员变量,成员函数(方法))。将Person()私有化以后,类以外即使已经建立了对象也不能直接访问。但是要使用Person()方法就需要在Person类中提供对应访问Person()方法的方式。
  1. class Person
  2. {
  3.         //构造代码块,输出人的共同属性“地球人”
  4.         {
  5.                 System.out.println("地球人:");
  6.         }
  7.         private Person(){}//这里是什么意思?        
  8.         /*"这里是什么意思?":上面这条语句就是定义一个私有化的Person构造函数,
  9.         函数体内容为空,类之外不可以调用这个函数。*/

  10.         private String name = "hah";//定义name,默认值为:hah
  11.     private int age;//定义age,默认值为0
  12.     private static String country = "cn";//该类中的static代码块

  13.     Person(String name, int age)//在堆内存中建立对象的特有属性。
  14.     {
  15.                 this.name = name;
  16.                 this.age = age;
  17.                 speak();
  18.     }
  19.         
  20.         /*如果你定义的是构造代码的话,构造代码块定义的一般是对象共享的属性或者内容,这个地方人的年龄和名字
  21.         应该是每个人特有的,除非同名,所以你利用代码块打印name和age没有意义。
  22.         下面定义了一个speak()方法打印name和age*/
  23.         public void speak()
  24.         {
  25.                 System.out.println(name+".."+age);//打印name ,age
  26.         }
  27. }

  28. class  PersonDemo
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 //Person p = new Person();//建立对象
  33.                 /*上面这条语句有问题吧,在定义构造函数Person()的时候,Person()方法的类型是private(私有)的,
  34.                 类之外无法调用private类型的方法,应该在Person类中提供访问Person()方法的方式*/

  35.                 //下面这条语句就能运行通过,因为Person(String name, int age)方法是可以被类之外调用的。
  36.                 Person p1 = new Person("xiaoli",20);
  37.         }
  38. }
复制代码

作者: 林康春    时间: 2012-1-1 13:56
为梦而战 发表于 2012-1-1 11:20
代码中你写了两个构造函数,一个是无参数的Person(){},一个是带两个参数的Person(String name,int age ...

直接分析到要点 谢谢了
作者: 林康春    时间: 2012-1-1 13:57
代臣 发表于 2012-1-1 13:22
private Person(){}
private:私有,权限修饰符,用于修饰类中的成员(成员变量,成员函数(方法))。将Per ...

说得很完整,辛苦了.同时让我加深了对构造代码块的理解
作者: 大梅    时间: 2012-1-1 14:13
  private Person(){}这样写的原因是为了防止使用者用无参的构造方法创建对象。
这样做的出发点一定是创建对象时,姓名和年龄属性不能为空。
记得毕老师的视频里讲写工具类的时候一般类中提供的方法都是静态的直接用类名调用,为了防止用户创建对象,在类中仅提供这种private修饰的构造方法。
作者: 为梦而战    时间: 2012-1-1 15:47
林康春 发表于 2012-1-1 13:56
直接分析到要点 谢谢了

相互学习!:handshake
作者: 付星    时间: 2012-1-1 18:03
private Person(){}这里private改为public就可以了,private意为私有,当你new Person()执行时就要调Person类中写的Person()构造方法,或者你不写这行,那JVM就提供一个public Person(){}这样的构造函数
作者: 刘健    时间: 2012-1-1 22:49
你问的第一个是默认构造方法,你将它设置为private就是说把这个方法设置为私有,外部程序不能访问,所以你new的时候new不出来啊,应该用public




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