关于java同一个类的不同对象其间私有域之间的访问权限

关于java同一个类的不同对象之间私有域之间的访问权限
public class 同类不同对象访问权限
{
public static void main(String[] args)
{
Demo d1=new Demo("12");
Demo d2=new Demo("12");
System.out.println( d1.ifEqual1(d2));
Demo2 d3=new Demo2("1");
System.out.println( d1.ifEqual2(d3));
}
}
class Demo
{
private String i;
public Demo(String i)
{
this.i=i;
}
public boolean ifEqual1(Demo demo)
{
return this.i.equals(demo.i);
}
public boolean ifEqual2(Demo2 demo2)
{
return this.i.equals(demo2.i);
}
}
class Demo2
{
private  String i;
public Demo2(String i)
{
this.i=i;
}
}


首先,Demo 类的 ifEqual2方法是没有访问权限编译不过去的。
d1和d2都是Demo的对象变量,因为new了两次,在堆内存里应该是分开存储的吧,那为什么d1还可以不通过d2自己的方法(get方法),来得到d2的私有数据域呢?和两个对象是一个类的有关系吗?
同样,问什么ifEqual2方法就不行了呢?因为是不同类?
虚心求教!!!
------解决思路----------------------
实际上,方法能不能访问相应的数据是和它们之间的逻辑关系相关的,和在什么地方储存没有关系.说白了就是它们所属的类的关系:是属于一个类、同一个包的类、子类还是没有任何关系。
不知道楼主是否了解C语言,这里使用C语言模仿了楼主的源码,可以更好的解释这个问题。如果关于源码有什么不懂的,可以参考这个链接http://coolshell.cn/articles/11377.html
main.c
#include <stdio.h>
#include "demo.h"

int main(void)
{
//Demo1 d;  错误!storage size of 'd' isn't known.不知道应该分配多大内存
Demo1 *d1 = createDemo1(1);
Demo1 *d2 = createDemo1(2);
printf( "%d\n", Demo1ifEqual1(d1, d2) );

Demo2 *d3 = createDemo2(3);
printf( "%d\n", Demo1ifEqual2(d1, d3) );

destroyDemo1(d1);
destroyDemo1(d2);
destroyDemo2(d3);
return 0;
}


demo.h
#ifndef DEMO_H
#define DEMO_H

#include <stdbool.h>

struct _Demo1;
struct _Demo2;
typedef struct _Demo1 Demo1;
typedef struct _Demo2 Demo2;

Demo1 *createDemo1(int i);
bool Demo1ifEqual1(Demo1* thiz, Demo1* demo);
bool Demo1ifEqual2(Demo1* thiz, Demo2* demo);
void destroyDemo1(Demo1 *d);

Demo2 *createDemo2(int i);
bool Demo2ifEqual2(Demo2* thiz, Demo2* demo);
void destroyDemo2(Demo2 *d);

#endif


demo1.c
#include <stdlib.h>
#include "demo.h"

struct _Demo1{
int i;
};

Demo1 *createDemo1(int i)
{
Demo1 *d = (Demo1 *)malloc(sizeof(Demo1));
d->i = i;
return d;
}

bool Demo1ifEqual1(Demo1* thiz, Demo1* demo)
{
return thiz->i == demo->i;
}

bool Demo1ifEqual2(Demo1* thiz, Demo2* demo)
{
//return thiz->i == demo->i; 错误,dereferencing pointer to incomplete type, 不知道demo2是否有i这个成员,也不知道位置
return 1;
}

void destroyDemo1(Demo1 *d)
{
free(d);
}


demo2.c
#include <stdlib.h>
#include "demo.h"

struct _Demo2{
int i;
};

Demo2 *createDemo2(int i)
{
Demo2 *d = (Demo2 *)malloc(sizeof(Demo2));
d->i = i;
return d;
}

bool Demo2ifEqual2(Demo2* thiz, Demo2* demo)
{
return thiz->i == demo->i;
}

void destroyDemo2(Demo2 *d)
{
free(d);
}

------解决思路----------------------
d1和d2都是Demo的对象变量,因为new了两次,在堆内存里应该是分开存储的吧
是分开存储的,在堆中是不同的对象

那为什么d1还可以不通过d2自己的方法(get方法),来得到d2的私有数据域呢?
private修饰的变量,在本类内时有权限访问的,出了类就访问不到了。d1 和 d2 都是Demo 类的实例,比较方法ifEqual1 是Demo 的实例方法,所以实例是可以访问到的,作为Demo 类的实例,在类的内部自然可以访问到自己的私有变量。如果出了Demo 类,d1不可以再访问到i的值。

和两个对象是一个类的有关系吗?
是因为两个对象是一个类的实例的原因。

同样,问什么ifEqual2方法就不行了呢?因为是不同类?
确实是因为不同类的原因。