黑马程序员技术交流社区

标题: 一个小问题,可我一直想不明白 [打印本页]

作者: xiwangliujiao    时间: 2012-4-26 10:50
标题: 一个小问题,可我一直想不明白
public class Person {
  private int age;
  void speak(){
         System.out.println("age:="+age);
}
}
public class PersonDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Person p=new Person();
                //p.age=-20;
                p.speak();
        }

},在方法p.speak()中访问的不就是私有变量age吗?为什么这样可以访问到呢?
作者: 光sail    时间: 2012-4-26 10:57
在方法p.speak()中访问到私有变量age,是因为使用变量age所在类Person的对象p去调用的,所以能访问到
作者: 张亭    时间: 2012-4-26 11:06
age是Person的私有成员, 只有Person内成员可以访问
speak()方法不正是Person内的成员函数么?当然可以访问
主函数中建立一个Person的对象,在主函数中只能访问speak()
而不能直接访问age变量,如System.out.println(p.age);
这样的代码是通不过编译的,这就是私有的意思喽
另外,一个源文件中是不可以有两个public 类的

作者: 马浩    时间: 2012-4-26 12:23
public class Person {
  private int age;//age虽然被私有化,但确能被本类中的方法访问
  void speak(){
         System.out.println("age:="+age);//这个方法可以访问私有化的age
}
}
public class PersonDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Person p=new Person();
                //p.age=-20;
                p.speak();//产生的对象p调用了speak()
        }

}
//这样一来,对象p调用了speak(),speak()去访问被私有化的age就是可以的,如果不调用方法,直接访问就是不行的
作者: 高彰谦    时间: 2012-4-26 13:09
如果private修饰的变量或者函数,连内部都不能访问,请问谁还可以访问?
private修饰符,主要是在外部得到对象的引用时不能直接访问,且对子类也是不可见的。
作者: 林德燚    时间: 2012-4-26 13:18
用private修饰的变量只能被本类访问,而你age是用private修饰的,外部不可以访问,但是你例子中访问它的是本类的一个方法;
所以可以访问age;
如果你用你创建的对象p来访问age就不可以,
扩展点,
  1、 java为了数据封装的严谨性,都会把成员变量设私有;提供getter,setter方法;
  2、  用private修饰的构造函数不可以被外部类实例化,这也是单例模式的设计基础;

   
作者: 黄或俊    时间: 2012-4-26 16:03
private是封装的一种表现形式
封装:将属性、不对外提供的内容都影藏起来,仅对外提供公共的访问方式

你理解上面这句话你就会恍然大悟啦!~
作者: 邵中国    时间: 2012-4-26 16:53
方法相当于封装后提供给外面的接口,直接p.age不行,通过方法访问就可以
作者: xiwangliujiao    时间: 2012-4-26 16:56
那在main函数调用它算不算是外部呢、?
作者: 付左军    时间: 2012-4-26 18:52
私有变量age在该类方法speak中可以被访问到

作者: 亚男    时间: 2012-4-26 19:09
p.speak()不是反问的私有变量age,这只是创建一个的对象(名字为p)用p调用persion中的方法,在这个speak()的方法里只是输出了一句和年龄相关的话,而这个speak()方法在person类中是可以访问其中的变量的
作者: 张成龙    时间: 2012-4-26 19:20
age被private修饰时,只能被本类对象访问,p.speak()是通过Person类中提供的方法speak()方法访问的,并非p直接访问age,
如果不注释掉这句//p.age=-20;编译就会失败,说明p不能直接访问age。
作者: 付左军    时间: 2012-4-26 21:26
speak()访问到的是本类中age

作者: kevindavid    时间: 2012-4-26 21:27
你们抢得真快!我刚看到你们就有这么多了让我无语了
作者: 李建强    时间: 2012-4-27 08:54
对于我这样的菜鸟来说,找到个能回答的问题真难,好不容易出现了一个,第一页都快么有了- -!
作者: HeiMaYSL    时间: 2012-4-27 14:13
class Person {
   private int age;
   void speak(){
                                        System.out.println("age:="+age);       //因为此方法是本类的方法,所以可以访问该类中的私有成员;
                                }
                                         }
class Test {

        /**
          * @param args
          */
         public static void main(String[] args) {
                 // TODO Auto-generated method stub
                 Person p=new Person();          //创建了一个对象p;
                // p.age=-20;           //该对象p不能调用age并赋值,因为age是另一个类中的私有变量,不能被其他类访问。
                                                         //--而这种私有修饰,一般用于封装。
                 p.speak();             //对象p可以调用其它类的方法,因为,这个方法是其它类中的方法,而它就能访问其它类中的私有成员。也就是说本类中的方法可以调用本类中的私有成员。
         }
}

建议你去看看关于私有修饰符的应用和概念。




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