class Test
{
    private int f()
    {
        return 0;
    }
    
    public static void main(String[] args)
    {
        Test t = new Test();
        t.f();
    }
}
问题描述:在main中,创建了一个Test对象t,而我们是不能直接通过Test对象访问Test的对象的private成员,所以,为什么上述代码没有错呢?

解决方案 »

  1.   

    为什么不能直接通过Test对象访问Test的对象的private成员?
      

  2.   

    我应该在举个例子
    class Other
    {   
        public static void main(String[] args)
        {
            Test t = new Test();
            t.f();
        }
    }和上面的代码没多大区别吧?
      

  3.   

    private是限制其他类对其进行访问,
    是不可能对自己对象的访问进行限制的。
    你的f()方法因为是非static的,
    所以在static方法中如果想调用,得通过对象来实现,
    这和private没有关系
      

  4.   

      在静态方法中不能直接调用类成员,或者类方法.多说一句,Main()方法是静态方法,不知你注意了没有?
      

  5.   

    作用域不同!一个在本类中, 一个在其它类中!  LZ看看JAVA基础!
      

  6.   

          是的,private是限制其他类对其进行访问,
         在本类中是可以访问本类的私有方法的,
          在其它类中时,就不能访问另外一个的私有方法。
         在main方法中如果想调用static方法时,得通过对象来实现,
         或者方法的本身是个static类型,这样才能调用、、、、、
      

  7.   

    我把意思说的再明白些
    在Test类中定义的一个Test对象和在其他类中定义的一个Test对象有什么不同?按照上面的例子,前者能够访问自身的所有成员(包括private,protected),而后者只能访问public(不在同一个包中)
      

  8.   

    private只能由1.该类中的函数、2.其友元函数访问。不能被任何其他类访问。
    在main方法里面已经重新创建了类的对象,所以该对象是在该方法内建立,所以该对象可以访问。
      

  9.   

    三楼+ 五楼答案就差不多了..
    这里要讲一下static 关健字在修饰属性时的特点了.    定义: static property 是类的成员,而不是哪个特定的对象.    生成时间 : 当jvm把加载此类时就生成了static property.(相当给了他内存空间).如果不是static那么只有在创建类的实例时才会分配空间.           
      
        
      

  10.   

    在对象还没有形成的时候,我们可以说private成员只能被该类的其他成员访问,class Test
    {
        private a = 0;
        void f()
        {
            System.out.println(a);//对象没有形成,我们正在建设类
        }
    }class Test
    {
        private int f()
        {
            return 0;
        }
        
        public static void main(String[] args)
        {
            Test t = new Test();//在建设类的时候,定义了该实例对象,却因为在类的定义中,可以访问private成员
            t.f();
        }
    }
    class Other
    {   
        public static void main(String[] args)
        {
            Test t = new Test();//不再Test类的定义中,不能访问private
            t.f();
        }
    }
    但是在形成对象后,对象暴露的属性应该是明确的呀!而现在,对象如果处于本体内(类的定义内),他的访问权限扩大了,而出了本体,他的权限有缩小了,这
      

  11.   

    我想说的是static和private这个东西没有什联系,你不用非要把他们放在一起。你只要记住private存在的意义是为了实现良好的封装,只让该类的方法去访问他。至于你说的static方法访问private变量,那这个private的变量必须是static的,要不你就要实例化对象,通过对象的方法来调用这个变量。
      

  12.   


    正因为static成员是和具体的对象没有关系,所以,在类Test中的stataic方法类创建的对象  和 在其他类中创建的Test对象,在暴露出的成员应该是一样的!
      

  13.   

    简单点说吧  main方法不就是这个类自己的方法么   就能访问自己的私有变量,当然是static的 所以用 对象.方法 来使用
      

  14.   

    private 不能访问是指2个以上的类相互访问,
    class Test
    {
        private int f()
        {
            return 0;
        }
        
        public static void main(String[] args)
        {
            Test t = new Test();
            t.f();
        }}
    这里,就一个类啊。如果加上那个
    public class Test
    {
        private int f()
        {
            System.out.println("I am f()!");
      return 0;
        }}class Other
    {   
        public static void main(String[] args)
        {
            Test t = new Test();
            t.f();
        }
    }肯定就是不行了!
      

  15.   

    恩,很对,访问权限应该看类,而不是盯着对象看
    private,其他类不能访问该类对象的private成员所以,一看对象,二看类,要访问对象的成员,先看对象所处的类!这就解释了“对象如果处于本体内(类的定义内),他的访问权限扩大了,而出了本体,他的权限有缩小了”的原因了。
      

  16.   

    类中的private成员或者函数,只能由类中的其他非类方法(即非静态方法)访问,
    因为类的静态方法中不存在this指针,无法访问.
    至于楼主所举的2个例子存在明显的差别,第一个之所以能正常运行,原因在于:
    创建的Test对象t本身在类Test中,这样对象t就能正常访问Test中的所有成员
    以及方法,这跟是否在静态方法没任何关系;
    换句话说,只要你在类Test中的任何一个方法中,创建一个Test对象,你都能够
    随意访问类Test中任何成员以及方法;