我有一段代码:
public class firstClass 
{
public static void main(String[] args) 
{
Test obj=new Test("student");
obj.testGet(obj);

//System.out.println(new Test("test").name);
}
}class Test
{
private String name="";
public Test(String name)
{
this.name=name;
}
public void testGet(Test obj)
{
System.out.println(obj.name);
}
}
我在main函数中不能执行System.out.println(new Test("test").name);【已注释掉的那句】,可以理解,
但是为什么我在Test类中可以执行System.out.println(obj.name);,name不是private的吗?

解决方案 »

  1.   

    有点难表达,我把你的代码改成这样,你看看自己是不是能想明白?public class FirstClass {
        public static void main(String[] args) {
            Test obj = new Test("student");
            Test obj2 = new Test("student2");
            obj.testGet(obj2);        // System.out.println(new Test("test").name);
        }
    }class Test {
        private String name = "";    public Test(String name) {
            this.name = name;
        }    public void testGet(Test obj) {
            System.out.println(name);
        }
    }
      

  2.   

    然后对比一下这个,public class FirstClass {
        public static void main(String[] args) {
            Test obj = new Test("student");
            Test obj2 = new Test("student2");
            obj.testGet(obj2);        // System.out.println(new Test("test").name);
        }
    }class Test {
        private String name = "";    public Test(String name) {
            this.name = name;
        }    public void testGet(Test obj) {
            System.out.println(obj.name);
        }
    }
      

  3.   

    本类即可访问。看一下访问修饰符
    public--都可访问(公有)   
    private--类内可访问(私有)
    protected--包内和子类可访问(保护)
    不写(default)--包内可访问 (默认
      

  4.   

    嗯,可以这样说,可能不够规范,我是这样理解的。在OOP上,权限是class的事情,不是object的事情。所以你的访问权限控制是由你的代码在哪个类里面决定的。
      

  5.   

    testGet()方法可以访问得到name属性啊!
      

  6.   

    首先帮楼主重新排个版:public class firstClass
    {
       public static void main(String[] args)
       {
          Test obj=new Test("student");
          obj.testGet(obj);
          //System.out.println(new Test("test").name);
       }
    }
    class Test
    {
       private String name="";
       public Test(String name)
       {
          this.name=name;
       }
       public void testGet(Test obj)
       {
          System.out.println(obj.name);
       }
    }再来看楼主的问题:
    我在main函数中不能执行System.out.println(new Test("test").name);【已注释掉的那句】,可以理解,
    但是为什么我在Test类中可以执行System.out.println(obj.name);,name不是private的吗? 

    首先需要说明的一点是,System.out.println(obj.name);这句话并不是在main方法中直接执行的,而是通过公有的testGet()方法,也就是说,那个语句并不是main方法中独立的语句,而是testGet()方法中的语句,如果把代码改为如下,同样是无法通过编译的:public class firstClass
    {
       public static void main(String[] args)
       {
          Test obj=new Test("student");
          obj.testGet(obj);
          System.out.println(new Test("test").name); //此句无法通过编译
          System.out.println(obj.name); //此句同样无法通过编译
       }
    }
    class Test
    {
       private String name="";
       public Test(String name)
       {
          this.name=name;
       }
       public void testGet(Test obj)
       {
          System.out.println(obj.name);
       }
    }分清了这一层关系后,刚才的问题就清楚了:
    因为main方法是在Test类的外部的,所以在main方法中,即便是Test对象本身,也是无法直接访问已经封装的属性name的(如果把main方法放到Test类里面,Test对象就可以直接访问name了)。但是通过Test类对外提供的public的方法,在类的外部,我们可以间接的去访问甚至修改该类的属性总结:
    1.被封装的成员变量,在该类的内部可以直接访问,在该类的外部无法直接访问
    2.被封装的成员变量,无论在该类的内部还是外部,都可以通过该类的public方法去间接访问
      

  7.   

    set()设置值 get()得到值..你调用get()方法当然能得到值了..这有什么不能理解的?