public class Test {
private String s = null; public void get(Test tt) {
tt = new Test();
tt.s = "helloooooo"; //s是Test的私有变量,在这里可以被访问到吗????  
} public String toString() {
return s;
}
}

解决方案 »

  1.   

    应该可以,因为你是在Test这个类访问某个Test对象的属性,它还属于本类访问的范畴
      

  2.   

    不谈反射,get(Test tt);这里的tt是别的对象传进来的,如果把get(Test tt)放到别的类中,肯定访问不到tt.s这是为什么啊?
      

  3.   

    不可以访问,方法的参数中传过来的并不是本类的一个对象属性,而是只是本类的一个其他的对象,他俩的存储地址已经不一样了。
    如果想访问,你可以为类中的属性添加set/get方法来进行访问。
      

  4.   

    没什么好迷惑的...
    其实就是一个很不规范的代码编写而已
    这要在公司里这么写,马上项目经理就该找你谈话了按照javabean的规范,所有的内部变量都应该通过get/set函数进行访问
      

  5.   


    public class Test {
        private String s = null;    public void get(Test tt) {
           //调试的结果, 当new 了后 tt 也是null , 这个我也觉得奇怪, null 里面而且还有属性 s
            tt = new Test();        
            tt.s = "helloooooo"; //s是Test的私有变量,在这里可以被访问到吗????  
        }    public String toString() {
            return s;
        }
    }
      

  6.   

    定义就是那么个定义,只是你见得少。在jdk类库里很多equals方法都使用的这种方式
      

  7.   

    加了private之后 ,私有变量同类可随意使用,protected 同包可用且该类的子类可随意调用,public随意调用,lz可以参考一下  成员变量  和成员方法 ,如果说类是一个超级战士,由两部分组成,载体和工具,人就是属性,是变量,武器方法,需要武装和封装
      

  8.   

      Srting s 声明后有栈内存的 没有堆内存
      tt.s当然能打得到 为null而已  
      

  9.   

    在本类中可以访问,有内存的,为null
    其他类,隐藏,不能访问
      

  10.   

    本就是这么规定的,当然是记下来,只要记住private是本类可访问的,有问题就往上套就行了
      

  11.   

    就因为私有变量和方法都在Test类中,才可以访问的。
    一句话,本类中可以访问私有变量,对于其他类不可见。
      

  12.   


    说实在的 以前还真没意识到过,一直以为private变量,是对象内的访问,才知道是类内的访问
      

  13.   

    首先你这个方法这样定义是没有任何意义的!
    在本类定义方法将本类或共子类的对象作为参数传入,是设计上的错误!实际应用中不会出现这种情况!
    能访问到,是因为你是在本类调用的。就好比在本类可以使用this调用私有属性!那样也是允许的!
      

  14.   

    你在get方法里是新 new 对像了,有了两个不同的对象,变量s有没有值取决你通过那个对象去引用
      

  15.   

    public void get(Test tt) {
           //调试的结果, 当new 了后 tt 也是null , 这个我也觉得奇怪, null 里面而且还有属性 s
            tt = new Test();        
            tt.s = "helloooooo"; //s是Test的私有变量,在这里可以被访问到吗????  
        }get方法内部new出来的 tt,tt引用tt本身的对象s当然没问题了!!
      

  16.   

    其实private就是一个规矩而已,你遵守这个规矩就可以了,你千方百计的找出一些这个规矩的漏洞来,也没什么实际意义.
      

  17.   

    可以,实现完整的封装,你可以这样去做(只对POJO类):public class Test {
          
          private String s ;//定义变量
          
           //set/get方法赋值
              
          public void setS (String s){
               this.s=s;//引用
                }      public String getS (){
                  return s ;//返回
                      }      }
      

  18.   

    要想访问私有变量,采用setter和getter方法,你的那个方法没有任何意义!
      

  19.   

    要想访问私有变量,采用setter和getter方法,你的那个方法没有任何意义!
     
    确实,get方法就是用来返回本类成员我一开始看了下,也觉得是不可以。
     class Test {
        private String s = "123";    public void get(Test tt) {
           //调试的结果, 当new 了后 tt 也是null , 这个我也觉得奇怪, null 里面而且还有属性 s
            tt = new Test();        
         //   tt.s = "helloooooo"; //s是Test的私有变量,在这里可以被访问到吗????  
            System.out.println(tt.s);
        }    public String toString() {
            return s;
        }
    }
    public  class A{
    public static void main(String args[]){
    Test t1=new Test();
    Test t2=new Test();
    t1.get(t2);
    }
    }这个时候输出的123  你应该懂了吧。tt.s的s还是本类的s,并不是对象tt的s
      

  20.   


    你可不能说是没有意义哦~~~  私有变量按你说的必须通过setter,getter来访问,现在这个情况违反了  就值得研究了
      

  21.   

    可以访问的,那个私有变量在本类中都可以访问的,用get,set方法是一种java封装性的体现。这些方法一般都是公开的,供外部访问,而这个方法也可以访问他所在对象里面的private变量,这种方法更利于一个类里面变量的安全。
      

  22.   

    private-私有的 本类中可见
    protected-受保护的 只有本类或子类或父类中可以访问
    public-表示全局 类内部外部子类都可以访问
      

  23.   

    概念性的东西,有必要这么讨论吗?如果楼主对这个困惑,只能说明你对java基础知识欠缺的太厉害
      

  24.   


    "这个时候输出的123 你应该懂了吧。tt.s的s还是本类的s,并不是对象tt的s"
    照哥们您这种写法 这个s不可能是不是123的 我验证的结果恰恰相反 这个s应该是对象tt的
      

  25.   

    之前和LZ一样混淆概念了 概念确实写的就是private的关键字限制的是“类”内的访问权限,而不是“对象”内访问权限,其实现在一想 很简单的事,类内即使是直接对s访问的话,其实也是相当于对this.s的访问,也就是对this这个对象的私有变量的访问,而this这个对象和tt这个对象其实应该本质上是一样的我是这么理解的……不对的地方大家使劲拍……
      

  26.   

    请注意,在Java里面,是传值。tt是从外部传入的,但是在方法体内,你又new了一个tt出来,这个就和外面的tt没有什么关系了。Private修饰符只是告诉其它类型的访问者,这个是俺的私有的东西,你们无权访问。但是在类中,它可以随便访问自己的Private属性。
      

  27.   

    楼主是一个真正的java 菜鸟。
    鉴定完毕。
      

  28.   


    不要管方法体内new出来的那个Test对象,tt是从外面传进来的对象,为什么本对象可以访问它的成员?
      

  29.   

    人家已经解释的很清楚了,楼主为啥还是冥顽不灵?
    1.本地的同名对象已经覆盖了传进来的参数,参数相当于在本函数内被丢弃了
    2.在Test类的方法里,可以访问任何私有成员,就算你没有覆盖传进来的参数,直接使用传进来的参数,也是一样的结果,这是java访问控制的规则决定的,没有为什么,只有遵守。如果你还是无法理解,那么放弃学习java吧, 你只会食古不化,越学越糊涂,不适合做这个。
      

  30.   

    首先说明这种使用方法貌似找不到具体应用场景。单看上面的这种用法其实在内存中产生了两个对象  一个是this, 另一个就是在get中创建的tt其实如果你把tt = new Test();想象成局部内部类,只不过没有这样来写吧。
    tt = new Test(){};那tt在Test类里面去访问s就自然了。因为tt也属于Test类型了。不知道VM内部是怎么样来实现的,还请高手指点。
      

  31.   

    实际上问题并没有那么纠结,只是大家常规不这么写。所以乍一看有点别扭。从类的角度来看,访问权限是干嘛的?就是限制访问。那么怎么限制的呢?从私有权限来看。就是在该类外,不能访问该字段或方法。只有在本类中才可以访问该字段或方法。
    我现在问你两个问题,你就明白了。(1)tt.s算不算是Test类的私有字段。(我可以回答你,必须算)(2)你写的get()方法,是不是在Test类内?(我可以回答你,必须在)那么私有字段在本类中可以访问,没毛病。你可以尝试去理解。并不用死记硬背。
      

  32.   


    不要误导初学者。tt就是对象引用.new Test().产生了一个Test类的对象实例哪来的局部内部类。
      

  33.   

    这个情况是可以访问的,详细说说私有成员的访问吧 
    定义为private的成员,指的是,当前类能直接访问,你
      public void get(Test tt) {
            tt = new Test();
            tt.s = "helloooooo"; 
        }
    tt.s的tt代表Test的对象实例,而且现在的tt是在Test内部,也是当前类的范围,tt是某个Test的实例本身的指向,和this的含义是一样的,在都是Test的直接访问饮用,所以可以访问,不过,你的tt=new Test()是改变了tt的地址,所以外部的传入去的tt的s是没有被改变。特别protected比较不好理解
    在C++里,private的成员,代指的是,本类内的直接指针访问,
    protected是代指,本类成员和子类成员的直接指针访问,所以说java的protected是说法是同一个包或子类访问也是错误的说法。protected举例子
    class A

        protected int i;
    }class B extends A//B要和A不同包
    {
        A a=new A();
        B b=new B();
        public void method()
        {    super.i//访问正确   super代表B实例(用于访问父类方式的引用,如果没有被覆盖,和this同等),是A的子类,是A的直接实例指针
              this.i//访问正确   this代表B的实例,是A的子类并且是直接指针
                a.i//无法访问,明显,B是A的子类,却无法访问,因为a不是B的直接指针(引用)
               b.i//访问正确,b是A的子类,并且是子类的直接指针
        }           
    }
      

  34.   

    在对象的equals方法中,经常这么用,可以的!
      

  35.   


    我觉得这样理解是正确的,估计很多人写了很久的程序,也学了很多关于“面向对象编程”的概念。却很少去思考面向对象是个什么层次的概念。是编译期还是运行期?
    private 是一个编译指示符,是告诉编译器必须检查这个变量或方法是否在只在类引用,这不同于对于数组访问越界的检查。
    编译完成以后,tt.s该是哪个对象还是哪个对象,与什么私有不私有没关系。
    在内存中tt=new Test(),产生了一个对象,与传入的参数无关。
    而tt.s则是从该对象的某个地址引用了一个变量,如一个新对象包含10个string成员变量,每个字符串指针为32位(4字节)那么对象就是40字节大小,如果tt.s是位于tt的第3个变量,那么就是第9~12共4个字节表示的字符串地址(指针)。
    被编译后,tt指向new Test()返回的地址(这个地址在编译期不确定,但是new Test()过程会在tt变量地址中写入对象的首地址),而tt.s则指向对象首地址+8。
    为什么要用private, 仅仅是要求检查程序逻辑而已,让我们编写的程序逻辑更加严谨,与运行时没有关系。
    这也是为什么能用反射机制来查询到一个对象内的所有成员,一个对象的存储结构是一定的,因此只要知道这个结构和首地址,就可以知道每个成员变量的值,而不管其编译前是private还是public,编译后全都只是一个地址而已。
      

  36.   

    如果你编写两个类,其中一个类A访问了另一个类B的public成员,编译是可以通过的,但是编译后,如果你修改B类这个被引用成员的public变成private,然后只编译类B.java,而A不编译,再运行A,一样是不会报错的,即使A引用了B类中的private成员。
      

  37.   

    tt是本类的一个object,所以一定可以被访问。
    private针对的是其他类的object,这些object是无法访问的