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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiwangliujiao 黑马帝   /  2012-4-26 10:50  /  2726 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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吗?为什么这样可以访问到呢?

15 个回复

倒序浏览
在方法p.speak()中访问到私有变量age,是因为使用变量age所在类Person的对象p去调用的,所以能访问到
回复 使用道具 举报
age是Person的私有成员, 只有Person内成员可以访问
speak()方法不正是Person内的成员函数么?当然可以访问
主函数中建立一个Person的对象,在主函数中只能访问speak()
而不能直接访问age变量,如System.out.println(p.age);
这样的代码是通不过编译的,这就是私有的意思喽
另外,一个源文件中是不可以有两个public 类的
回复 使用道具 举报
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就是可以的,如果不调用方法,直接访问就是不行的
回复 使用道具 举报
如果private修饰的变量或者函数,连内部都不能访问,请问谁还可以访问?
private修饰符,主要是在外部得到对象的引用时不能直接访问,且对子类也是不可见的。
回复 使用道具 举报
用private修饰的变量只能被本类访问,而你age是用private修饰的,外部不可以访问,但是你例子中访问它的是本类的一个方法;
所以可以访问age;
如果你用你创建的对象p来访问age就不可以,
扩展点,
  1、 java为了数据封装的严谨性,都会把成员变量设私有;提供getter,setter方法;
  2、  用private修饰的构造函数不可以被外部类实例化,这也是单例模式的设计基础;

   
回复 使用道具 举报
private是封装的一种表现形式
封装:将属性、不对外提供的内容都影藏起来,仅对外提供公共的访问方式

你理解上面这句话你就会恍然大悟啦!~
回复 使用道具 举报
方法相当于封装后提供给外面的接口,直接p.age不行,通过方法访问就可以
回复 使用道具 举报
那在main函数调用它算不算是外部呢、?
回复 使用道具 举报
私有变量age在该类方法speak中可以被访问到
回复 使用道具 举报
p.speak()不是反问的私有变量age,这只是创建一个的对象(名字为p)用p调用persion中的方法,在这个speak()的方法里只是输出了一句和年龄相关的话,而这个speak()方法在person类中是可以访问其中的变量的
回复 使用道具 举报
age被private修饰时,只能被本类对象访问,p.speak()是通过Person类中提供的方法speak()方法访问的,并非p直接访问age,
如果不注释掉这句//p.age=-20;编译就会失败,说明p不能直接访问age。
回复 使用道具 举报
speak()访问到的是本类中age
回复 使用道具 举报
你们抢得真快!我刚看到你们就有这么多了让我无语了
回复 使用道具 举报
对于我这样的菜鸟来说,找到个能回答的问题真难,好不容易出现了一个,第一页都快么有了- -!
回复 使用道具 举报
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可以调用其它类的方法,因为,这个方法是其它类中的方法,而它就能访问其它类中的私有成员。也就是说本类中的方法可以调用本类中的私有成员。
         }
}

建议你去看看关于私有修饰符的应用和概念。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马