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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 精彩生活向钱看 中级黑马   /  2013-6-1 07:37  /  1662 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 精彩生活向钱看 于 2013-6-1 12:28 编辑
  1. class Person
  2. {
  3.       private String name;
  4.       private int age;
  5.       Person(String name)
  6.             {
  7.                  this.name=name;
  8.             }
  9.        public void speak()
  10.            {
  11.                 System.out.println(name+":"+age)
  12.            }
  13. }
  14. class Demo
  15. {
  16.        public static void main (String[]args)
  17.       {
  18.              person p=new person("旺财");
  19.              p.speak();
  20.       }
  21. }
复制代码
问题是这样的,private不是私有吗,它私有的东西能在该类中有效,name和age被私有了,为什么在下边输入”旺财“是可以的,为什么?请各位高手解答!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
虽然name 和age被你私有化了,可是你建了一个带参数的构造函数,它可以向外提供访问方式,所以你建立Person实例的时候首先访问Person的构造函数,就把旺财穿进去了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
  1. class Person
  2. {
  3.       private String name;
  4.       private int age;
  5.       Person(String name)                  //构造函数
  6.             {
  7.                  this.name=name;           //此方法将外部数据写入内部私有变量name
  8.             }
  9.        public void speak()
  10.            {
  11.                 System.out.println(name+":"+age)
  12.            }
  13. }
  14. class Demo
  15. {
  16.        public static void main (String[]args)
  17.       {
  18.              person p=new person("旺财");  //调用构造函数 将旺财作为参数传递,而非直接访问其私有变量name  
  19.              p.speak();
  20.       }
  21. }
  22. }
复制代码
已帮你添加注释,便于理解

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
在创建类的实例时,会访问类的构造函数。分两种情况:
1、在类中没有人为定义构造函数,即系统默认的构造函数,以上例就是:Person p = new Person();此时访问的是默认构造函数Person(){},
2、在类中人为定义了构造函数,即带参数的构造函数,就如楼主定义的那样:
Person(String name)
{
    this.name = name;
}
楼主在Person p = new Person("旺财");时,系统访问构造函数Person(String name){this.name = name;},此时参数旺财已经赋值给私有的name了。而在p.speak();时输出的name已经是"旺财"了。

另外楼主需要注意的是:
1、注意区分大小写,类名与构造函数名必须一致,而楼主person p =new person("旺财");
2、在类Demo中,并没有直接访问类Person的私有name和age,而是访问的类Person中的非私有方法,只不过该方法可以访问私有name和age,这是可以的。
但是如果在Demo中直接使用p.name或p.age,这是不允许的 ,这叫做直接在类外访问private成员。
3、对于类中private变量的访问,通常是通过方法来实现的。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报

1,这里是你写的

朋友随便说一句,以后自己写代码加上注释,虽然是简单最好也加
//建立Person类
class Person

{
//私有化成员变量name
      private String name;
//私有化成员变量age
      private int age;
//建立构造函数(构造函数是给对象初始化用的)
      Person(String name)

            {
//this代表本类对象的引用
                 this.name=name;

            }
//建立speak()方法
       public void speak()

           {

                System.out.println(name+":"+age)

           }

}
//建立Demo类
class Demo

{

       public static void main (String[]args)

      {
           //建立对象
             person p=new person("旺财");
           //调用speak()方法
             p.speak();

      }

}

你是把对象建立在本类方法中,本类对象调用本类方法当天可以访问了!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
你只是对成员变量进行了私有化,但类中的构造函数并没有私有化,在其他类中仍可以调用类中的构造函数进行实例化对象。所以Person p=new Person("旺财");可是当你想单独赋值给成员变量时如。p.name = "wanghaohua";将会编译出错。如果想要连对象建立都不能做的话,你就要私有化相应的构造函数就是
private Person(String name)
            {
                 this.name=name;
            }

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
Person p = new Person("旺财")
age 和name可以通过set方法进行设置,get方法获得
这句调用的是有参构造
Person(String name)

            {

                this.name=name;

           }

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
  此问题不解释 看视频去
回复 使用道具 举报
他是通过构造方法中的name传递到私有的name上的,所以能访问到。如果直接访问是要报错的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马