能不能在static方法中访问对象的private成员?

mingzi520 2009-04-10 10:29:39

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成员,所以,为什么上述代码没有错呢?

...全文
882 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
总结的不错!
奇葩的钩子 2009-04-10
  • 打赏
  • 举报
回复
类中的private成员或者函数,只能由类中的其他非类方法(即非静态方法)访问,
因为类的静态方法中不存在this指针,无法访问.
至于楼主所举的2个例子存在明显的差别,第一个之所以能正常运行,原因在于:
创建的Test对象t本身在类Test中,这样对象t就能正常访问Test中的所有成员
以及方法,这跟是否在静态方法没任何关系;
换句话说,只要你在类Test中的任何一个方法中,创建一个Test对象,你都能够
随意访问类Test中任何成员以及方法;
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 renmms 的回复:]
private 不能访问是指2个以上的类相互访问,

Java codeclassTest
{privateintf()
{return0;
}publicstaticvoidmain(String[] args)
{
Test t=newTest();
t.f();
}

}

这里,就一个类啊。

如果加上那个

Java codepublicclassTest
{privateintf()
{
System.out.println("I am f()!");return0;
}

}classOther
{publicstaticvoidmain(String[] args)
{
Te…
[/Quote]


恩,很对,访问权限应该看类,而不是盯着对象看
private,其他类不能访问该类对象的private成员

所以,一看对象,二看类,要访问对象的成员,先看对象所处的类!

这就解释了“对象如果处于本体内(类的定义内),他的访问权限扩大了,而出了本体,他的权限有缩小了”的原因了。
pejayshine 2009-04-10
  • 打赏
  • 举报
回复
同意
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jwhndsc 的回复:]
简单点说吧  main方法不就是这个类自己的方法么  就能访问自己的私有变量,当然是static的 所以用 对象.方法 来使用
[/Quote]

终于有人理解我的意思了!哈哈
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
而现在,对象如果处于本体内(类的定义内),他的访问权限扩大了,而出了本体,他的权限有缩小了,这
renmms 2009-04-10
  • 打赏
  • 举报
回复
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();
}
}

肯定就是不行了!
上谷鹤 2009-04-10
  • 打赏
  • 举报
回复
简单点说吧 main方法不就是这个类自己的方法么 就能访问自己的私有变量,当然是static的 所以用 对象.方法 来使用
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wolfKingTy 的回复:]
这里要讲一下static 关健字在修饰属性时的特点了.

定义: static property 是类的成员,而不是哪个特定的对象.

生成时间 : 当jvm把加载此类时就生成了static property.(相当给了他内存空间).如果不是static那么只有在创建类的实例时才会分配空间.
[/Quote]

正因为static成员是和具体的对象没有关系,所以,在类Test中的stataic方法类创建的对象 和 在其他类中创建的Test对象,在暴露出的成员应该是一样的!
justinavril 2009-04-10
  • 打赏
  • 举报
回复
我想说的是static和private这个东西没有什联系,你不用非要把他们放在一起。你只要记住private存在的意义是为了实现良好的封装,只让该类的方法去访问他。至于你说的static方法访问private变量,那这个private的变量必须是static的,要不你就要实例化对象,通过对象的方法来调用这个变量。
mingzi520 2009-04-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();
}
}


但是在形成对象后,对象暴露的属性应该是明确的呀!

而现在,对象如果处于本体内(类的定义内),他的访问权限扩大了,而出了本体,他的权限有缩小了,这
小霍夫 2009-04-10
  • 打赏
  • 举报
回复
三楼+ 五楼答案就差不多了..


这里要讲一下static 关健字在修饰属性时的特点了.

定义: static property 是类的成员,而不是哪个特定的对象.

生成时间 : 当jvm把加载此类时就生成了static property.(相当给了他内存空间).如果不是static那么只有在创建类的实例时才会分配空间.





nerain 2009-04-10
  • 打赏
  • 举报
回复
private只能由1.该类中的函数、2.其友元函数访问。不能被任何其他类访问。
在main方法里面已经重新创建了类的对象,所以该对象是在该方法内建立,所以该对象可以访问。
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zl_bright 的回复:]
private是限制其他类对其进行访问,
是不可能对自己对象的访问进行限制的。
你的f()方法因为是非static的,
所以在static方法中如果想调用,得通过对象来实现,
这和private没有关系

[/Quote]
我把意思说的再明白些
在Test类中定义的一个Test对象和在其他类中定义的一个Test对象有什么不同?

按照上面的例子,前者能够访问自身的所有成员(包括private,protected),而后者只能访问public(不在同一个包中)
xiebinghu 2009-04-10
  • 打赏
  • 举报
回复
是的,private是限制其他类对其进行访问,
在本类中是可以访问本类的私有方法的,
在其它类中时,就不能访问另外一个的私有方法。
在main方法中如果想调用static方法时,得通过对象来实现,
或者方法的本身是个static类型,这样才能调用、、、、、
luojihaidao 2009-04-10
  • 打赏
  • 举报
回复
作用域不同!

一个在本类中, 一个在其它类中!  LZ看看JAVA基础!
hellen_99010 2009-04-10
  • 打赏
  • 举报
回复
在静态方法中不能直接调用类成员,或者类方法.多说一句,Main()方法是静态方法,不知你注意了没有?
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
……
台城柳月 2009-04-10
  • 打赏
  • 举报
回复
private是限制其他类对其进行访问,
是不可能对自己对象的访问进行限制的。
你的f()方法因为是非static的,
所以在static方法中如果想调用,得通过对象来实现,
这和private没有关系
mingzi520 2009-04-10
  • 打赏
  • 举报
回复
我应该在举个例子


class Other
{
public static void main(String[] args)
{
Test t = new Test();
t.f();
}
}



和上面的代码没多大区别吧?
加载更多回复(2)

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧