包含私有属性的类的两个对象,能在一个对象中调用方法直接以'对象名.属性'
访问另一对象的私有属性,为什么? 私有属性不是只在类中可见,不可直接以
'对象.属性'方式访问吗??困惑!!!public class A{
     public static void main(String[] args) {
           new B().fuc(new B());
     }
}class B {
     private int x = 111;
     
     public void fuc(B b){
         System.out.println(b.x);
      }
}

解决方案 »

  1.   

    new B().fuc(new B()); 
    你这是 对象名.方法
    不是 对象名.属性
      

  2.   

    这就是面向对象的封装性啊       只考虑能不能见到这个方法,至于这个方法能不能见到什么就不是对象的事了,那是方法的事.
    就像你这里的,你只是调用它的方法,而在这里调用它的public方法是合法的,而它的方法又返回到实例中去执行,在那个实例的空间里,是允许调用它自己的私有属性的
      

  3.   

    明明是调用方法的 方法是public的啊
      

  4.   

    我倒是觉得,func()方法应该不能访问参数b的x属性。
      

  5.   

    <<java就业培训>>上的例子,上面说的就是怎样直接访问私有属性.所以有点迷惑,谢谢大家!!
      

  6.   

    这个我觉得很明显啊
    他这是在用一个类的方法调用自己的属性,这样当然可以的
    难道自己的类都不能掉用自己的属性吗?
    他先实例化了一个这个类的对象,有通过这个类的对象调用这个类的方法
    这个类的方法就是调用自己这个类的属性,所以说你的PUBLIC类只是调用的
    那个类自己的方法,而不是一个类调用另外一个类的属性。
      

  7.   

    我感觉问题应该是在这里
    public   void   fuc(B   b){ 
                      System.out.println(b.x); 
                } 应该说b.x是不可以访问的.
      

  8.   

    是不是因为fuc是在它本身类中,所以可以访问?
      

  9.   

    应该说是x对于fuc是可见的吧.
      

  10.   

    在 class B 里面的方法,访问 b.x 当然可以了。
    否则下面这个程序不是奇怪了吗?class B {  public test(){
        func(this); // 难道这一句不能执行? 我自己的东西如果都不能调用,那还要他干什么?
      }
      public void fuc(B b) {
        System.out.println(b.x);
      }
    }
      

  11.   

    按照我一般的理解,私有属性是对象私有,而不是类,也就是说,私有属性只能自己访问。相同类的其他对象也不能访问。
    当然,这只是我自己的定义,呵呵。例如:class A{
      private int i;  public void f(A a){
        i=2;//这一句当然能执行
         a.i=2;//这一句就应该有争议了。
      }
      

  12.   

    也许是java的bug也说不定。
    全看各个java的版本以及sun是如何定义的了。
    比如以前做override的时候,出现了在jdk1.5下可以通过,jdk1.4下不能通过的问题。伪代码如下:
    class A{}
    class AA extentd A {}
    class B{}
    class BB extentd B {}class C {
       public B method1(A a) {
           //a.func()
       }
    }class CC extentd C {
       public BB method1(AA aa) {
          //aa.func()
       }
    }CC在jdk1.5下可以通过,jdk1.4下不能通过
      

  13.   


    呵呵...其实这个是要看jdk的设计了,这个也是实现封装的一个手段.我想各位都知道什么叫普通的java bean吧,基本上有这几点:1.一般是私有的属性
    2.提供public的无参构造器
    3.有setter和getter方法.然后用相应的setter和getter方法来访问属性值.
    对于22楼的:也许是java的bug也说不定。
    ===================================================如果这是个bug的话,可能我们的全世界用java写的软件都要修改了,因为java bean用的太多了.甚至现在jstl都没法用了,我估计也要改改代码了...
      

  14.   

    不同意楼上的说法,
    getter,setter方法并不会访问外部对象的属性,只是访问自己的私有属性,所以很明显是可行的。
    而搂主的代码中func方法,访问了外部对象B的私有属性,所以引起争议。尽管外部对象和this是同一个类:但不是同一个对象(至少很可能不是)。
      

  15.   

    ~
    23楼的朋友说的没错 大家想想普通的JAVA BEAN就明白了 x 和普通的JAVA BEAN中的私有属性有区别么?而fuc(B   b)和普通的JAVA BEAN中属性对应的setter和getter方法有区别么?应该都没有区别吧 想想在JDBC访问数据库的程序里是如何封装数据的吧
    把class   B看成普通JAVA BEAN 把x看成BEAN中的私有属性 把fuc(B   b)看成是x在BEAN中所对应的setter或getter方法 这样好理解一些 其实我们一直都在这么用 也正是这样反而让大家忽视了
      

  16.   

    按private的作用级别,OOP语言大体可以分两类:
    一类的访问限制级别是'类',同一类的不同对象可以互相访问private成员;
    另一类的访问限制级别是'对象',一个对象的private成员只有该对象本身才能访问,其它对象即使同属一类也不行.
    前者如C系语言(JAVA,C++,C#),后者如smalltalk.
    从某种意义上说,C系语言更像基于类的语言,而smalltalk是纯粹的面向对象的语言.   为什么C系语言要采取这样的方式,而不将面向对象贯彻得更彻底呢?
    其实这是基于下面目的的一种折中:
    用最简单的方式实现最好的封装.
    在编程中,同类对象间访问彼此成员是经常要发生的.比如对象的复制,比较等问题.
    如果private进行了'对象'级的限制,我们就不得不用诸如GetXxx()/SetXxx()等public方法对private成员进行操作.
    这使得处理过程相当繁琐.
    而更重要的是,仅仅为了类内问题,而用public方法处理本不该被暴露在类外的private成员,反而使类封装性遭到了不必要的破坏.
    由上,我们看到过分追求对象的保护,反而会降低类的保护强度,这是适得其反的.
    造成上述矛盾的根本原因是类保护和对象保护的层次差异.
    大多数情况下,比起同类对象间的访问限制,我们更需要保证不同类对象间的访问限制.我认为原因是这样的,但以上内容只是我个人的思考.