我有一段代码:
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的吗?
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的吗?
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);
}
}
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);
}
}
public--都可访问(公有)
private--类内可访问(私有)
protected--包内和子类可访问(保护)
不写(default)--包内可访问 (默认
{
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方法去间接访问