包含私有属性的类的两个对象,能在一个对象中调用方法直接以'对象名.属性'
访问另一对象的私有属性,为什么? 私有属性不是只在类中可见,不可直接以
'对象.属性'方式访问吗??困惑!!!public class A{
public static void main(String[] args) {
new B().fuc(new B());
}
}class B {
private int x = 111;
public void fuc(B b){
System.out.println(b.x);
}
}
访问另一对象的私有属性,为什么? 私有属性不是只在类中可见,不可直接以
'对象.属性'方式访问吗??困惑!!!public class A{
public static void main(String[] args) {
new B().fuc(new B());
}
}class B {
private int x = 111;
public void fuc(B b){
System.out.println(b.x);
}
}
你这是 对象名.方法
不是 对象名.属性
就像你这里的,你只是调用它的方法,而在这里调用它的public方法是合法的,而它的方法又返回到实例中去执行,在那个实例的空间里,是允许调用它自己的私有属性的
他这是在用一个类的方法调用自己的属性,这样当然可以的
难道自己的类都不能掉用自己的属性吗?
他先实例化了一个这个类的对象,有通过这个类的对象调用这个类的方法
这个类的方法就是调用自己这个类的属性,所以说你的PUBLIC类只是调用的
那个类自己的方法,而不是一个类调用另外一个类的属性。
public void fuc(B b){
System.out.println(b.x);
} 应该说b.x是不可以访问的.
否则下面这个程序不是奇怪了吗?class B { public test(){
func(this); // 难道这一句不能执行? 我自己的东西如果都不能调用,那还要他干什么?
}
public void fuc(B b) {
System.out.println(b.x);
}
}
当然,这只是我自己的定义,呵呵。例如:class A{
private int i; public void f(A a){
i=2;//这一句当然能执行
a.i=2;//这一句就应该有争议了。
}
全看各个java的版本以及sun是如何定义的了。
比如以前做override的时候,出现了在jdk1.5下可以通过,jdk1.4下不能通过的问题。伪代码如下:
class A{}
class AA extentd A {}
class B{}
class BB extentd B {}class C {
public B method1(A a) {
//a.func()
}
}class CC extentd C {
public BB method1(AA aa) {
//aa.func()
}
}CC在jdk1.5下可以通过,jdk1.4下不能通过
呵呵...其实这个是要看jdk的设计了,这个也是实现封装的一个手段.我想各位都知道什么叫普通的java bean吧,基本上有这几点:1.一般是私有的属性
2.提供public的无参构造器
3.有setter和getter方法.然后用相应的setter和getter方法来访问属性值.
对于22楼的:也许是java的bug也说不定。
===================================================如果这是个bug的话,可能我们的全世界用java写的软件都要修改了,因为java bean用的太多了.甚至现在jstl都没法用了,我估计也要改改代码了...
getter,setter方法并不会访问外部对象的属性,只是访问自己的私有属性,所以很明显是可行的。
而搂主的代码中func方法,访问了外部对象B的私有属性,所以引起争议。尽管外部对象和this是同一个类:但不是同一个对象(至少很可能不是)。
23楼的朋友说的没错 大家想想普通的JAVA BEAN就明白了 x 和普通的JAVA BEAN中的私有属性有区别么?而fuc(B b)和普通的JAVA BEAN中属性对应的setter和getter方法有区别么?应该都没有区别吧 想想在JDBC访问数据库的程序里是如何封装数据的吧
把class B看成普通JAVA BEAN 把x看成BEAN中的私有属性 把fuc(B b)看成是x在BEAN中所对应的setter或getter方法 这样好理解一些 其实我们一直都在这么用 也正是这样反而让大家忽视了
一类的访问限制级别是'类',同一类的不同对象可以互相访问private成员;
另一类的访问限制级别是'对象',一个对象的private成员只有该对象本身才能访问,其它对象即使同属一类也不行.
前者如C系语言(JAVA,C++,C#),后者如smalltalk.
从某种意义上说,C系语言更像基于类的语言,而smalltalk是纯粹的面向对象的语言. 为什么C系语言要采取这样的方式,而不将面向对象贯彻得更彻底呢?
其实这是基于下面目的的一种折中:
用最简单的方式实现最好的封装.
在编程中,同类对象间访问彼此成员是经常要发生的.比如对象的复制,比较等问题.
如果private进行了'对象'级的限制,我们就不得不用诸如GetXxx()/SetXxx()等public方法对private成员进行操作.
这使得处理过程相当繁琐.
而更重要的是,仅仅为了类内问题,而用public方法处理本不该被暴露在类外的private成员,反而使类封装性遭到了不必要的破坏.
由上,我们看到过分追求对象的保护,反而会降低类的保护强度,这是适得其反的.
造成上述矛盾的根本原因是类保护和对象保护的层次差异.
大多数情况下,比起同类对象间的访问限制,我们更需要保证不同类对象间的访问限制.我认为原因是这样的,但以上内容只是我个人的思考.