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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林康春 黑马帝   /  2012-1-1 02:35  /  3520 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林康春 于 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();

不明白?什么问题呢?
                           ^

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

11 个回复

倒序浏览
因为你把默认的构造函数设为了private 这样的话,就不能在外部进行多个实例化了,你可以用staitc的get方法取得实例化这个类,这样就可以保证程序这有类被实例化一次,不知道说得对吗有错误请指出

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
首先这句话private Person(){},是把Person类的无参数构造函数给私有化了
所以该类只能在类内部建立对象,在外部就不能new对象了
想要Person对象,你必须在Person类内部定义一个函数来获取对象
比如:
private Person p=new Person();
Public Person getPerson()
{
      return p;
}
这样外部才能通过Public getPerson函数获取到该对象,
这其实就是一个单列的饿汉式

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
首先你需要明确访问修饰符private、public的区别,给出的代码中 private Person(){ }
这里你将构造方法的访问权限设置成了private也就是只有本类自己可以访问,你在别的类中
是没有访问权限的,你需要将访问修饰符改为public公有的,那么别的类就能够进行访问,
建议你看看访问权限修饰符的文章。
回复 使用道具 举报
     代码中你写了两个构造函数,一个是无参数的Person(){},一个是带两个参数的Person(String name,int age){this.name=name;this.age=age;}
你用private修饰了无参数的构造函数后,那在类外就不能再创建无参数的对象了,这也是private修饰了此构造函数的作用,所以你在PersonDemo类中用new Person(),就会报错。你还有一个没有被修饰的带参数的构造函数,这个构造函数是可以在PersonDemo类中创建带两个参数的对象的,比如Person p1=new Person("zhangsan",25);这样是没有问题的。

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 代臣 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
为梦而战 发表于 2012-1-1 11:20
代码中你写了两个构造函数,一个是无参数的Person(){},一个是带两个参数的Person(String name,int age ...

直接分析到要点 谢谢了
回复 使用道具 举报
代臣 发表于 2012-1-1 13:22
private Person(){}
private:私有,权限修饰符,用于修饰类中的成员(成员变量,成员函数(方法))。将Per ...

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

相互学习!:handshake
回复 使用道具 举报
付星 黑马帝 2012-1-1 18:03:45
11#
private Person(){}这里private改为public就可以了,private意为私有,当你new Person()执行时就要调Person类中写的Person()构造方法,或者你不写这行,那JVM就提供一个public Person(){}这样的构造函数
回复 使用道具 举报
刘健 黑马帝 2012-1-1 22:49:20
12#
你问的第一个是默认构造方法,你将它设置为private就是说把这个方法设置为私有,外部程序不能访问,所以你new的时候new不出来啊,应该用public
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马