private 的问题

wafer_w 2002-07-12 04:55:24
同一个类的不同对象可以相互访问对方的private变量,这个该怎么理解??
...全文
39 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajoo 2002-07-15
  • 打赏
  • 举报
回复
how can compiler know y!=this?
the statment "a and b are the same object" is determined at runtime.
so, it is not feasible to say "method can only access private members of the object itself".
in other words, access protection is at class-level. not object level.
wafer_w 2002-07-15
  • 打赏
  • 举报
回复
我比较赞同 hyla1978(蛙雨) 的说法。
wafer_w 2002-07-15
  • 打赏
  • 举报
回复
请注意:上面帖出的程序是编译和运行过的,是正确的。

to: wjmmml(笑着悲伤)

那么以下程序按照你的观点也是正确的咯?(实际上呢?)

class You{
private int i;
You(int i){
this.i = i;
}
boolean compareTo(Me m){
return this.i > m.i;
}
}

class Me{
private int i;
You(int i){
this.i = i;
}
boolean compareTo(You y){
return this.i > y.i;
}
}

public class Ptest{
public static void main(String[] args){
You y1 = new You(4);
Me m = new Me(3);
System.out.println(y1.compareTo(m));
}
}
aiur 2002-07-12
  • 打赏
  • 举报
回复
我认为wjmmml(笑着悲伤)说的是对的。
Y1并没有直接调用Y2的i,在CompareTo方法里参数是类You的一个实例(即Y2)
Y1是通过传了Y2这个参数,然后是Y2访问了私有变量i
hyla1978 2002-07-12
  • 打赏
  • 举报
回复
严格来说,在面向对象的程序设计里,直接去访问成员变量是一件非常危险的事情。一般都是通过一定的方法去访问。
hyla1978 2002-07-12
  • 打赏
  • 举报
回复
其实你程序里的y1不是直接去调用y2里的私有变量,y2只不过通过y1本身的方法使用了自身的变量。但是这和你说的一个类的不同的实例对象可以互相访问对方的私有变量是不一样的。
hyla1978 2002-07-12
  • 打赏
  • 举报
回复
其实你程序里的y1不是直接去调用y2里的私有变量,y2只不过通过y1本身的方法使用了自身的变量。但是这和你说的一个类的不同的实例对象可以互相访问对方的私有变量。
sunni 2002-07-12
  • 打赏
  • 举报
回复
liushmh(c++) :也许你误会了,假设有class A 的两个对象a1 a2 ,a1 能访问
a2里的某个元素 那么必然是A里定义了 访问该元素的方法
而private是对于class来说的 不是object
hyla1978 2002-07-12
  • 打赏
  • 举报
回复
类是对象的一个设计蓝图,它提供了完整的功能,具体的实现由各个对象实例去完成,不同的事例的对象都拥有各自的实例变量,一个类的不同的实例变量都拥有各自的实例变量的一个拷贝,对于私有的变量只有自己的类的实例对象才可以直接访问。一个类不同的实例对象可以访问类变量。因为它对于不同的实例对象只有一个拷贝,是共享。还记得线程里start方法吗,它就是类方法(也叫静态方法)。
liushmh 2002-07-12
  • 打赏
  • 举报
回复
这样好象不行哦。
私有成员不是属于对象的吗?别的对象还可以存取,那还叫私有?
私有成员的值应该只能通过方法返回得到,不能直接取出。
这样不是破坏了类的封装性。
java能够这样吗?
c++是不能的。
wjmmml 2002-07-12
  • 打赏
  • 举报
回复
当然不是了,你是怎么调用的,其实你在调用中,即y1的compareTo函数中使用了y2.i但是,你仔细看看是y1调用了compareTo得到了参数y2,而最终y2调用了自己的成员变量y2.i,y1没有调用y2的i。而是通过y2调用的i。明白了吗?我感觉你对调用这个概念有点模糊。直接.取成员才叫调用
cherami 2002-07-12
  • 打赏
  • 举报
回复
我感觉这是一句费话,同一个类的不同对象绝大部分存在于其它类中,而在其它类中是不能访问类的私有成员的,即时他们相互自己可以使用对方的私有变量,但是由于他们存在的环境不允许这样做,等于不能!而在类自身中访问根本就没有什么可说的。
wafer_w 2002-07-12
  • 打赏
  • 举报
回复
请看如下程序:

class You{
private int i;
You(int i){
this.i = i;
}
boolean compareTo(You y){
return this.i > y.i;
}
}
public class Ptest{
public static void main(String[] args){
You y1 = new You(4);
You y2 = new You(3);
System.out.println(y1.compareTo(y2));
}
}

//在这里调用y1的compareTo方法不是就直接访问了y2.i这个私有变量了?
wjmmml 2002-07-12
  • 打赏
  • 举报
回复
private的作用范围是:在定义的类内有效。你的情况是他们在访问自己的对象里面的private。因为是同一个类的对象所以他们有相同的成员变量,所以你在调用时,他们访问各自的。不是对方的。

62,614

社区成员

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

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