解决方案 »

  1.   

    实际上,方法能不能访问相应的数据是和它们之间的逻辑关系相关的,和在什么地方储存没有关系.说白了就是它们所属的类的关系:是属于一个类、同一个包的类、子类还是没有任何关系。
    不知道楼主是否了解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);#endifdemo1.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);
    }
      

  2.   

    d1和d2都是Demo的对象变量,因为new了两次,在堆内存里应该是分开存储的吧
    是分开存储的,在堆中是不同的对象那为什么d1还可以不通过d2自己的方法(get方法),来得到d2的私有数据域呢?
    private修饰的变量,在本类内时有权限访问的,出了类就访问不到了。d1 和 d2 都是Demo 类的实例,比较方法ifEqual1 是Demo 的实例方法,所以实例是可以访问到的,作为Demo 类的实例,在类的内部自然可以访问到自己的私有变量。如果出了Demo 类,d1不可以再访问到i的值。和两个对象是一个类的有关系吗?
    是因为两个对象是一个类的实例的原因。同样,问什么ifEqual2方法就不行了呢?因为是不同类?
    确实是因为不同类的原因。
      

  3.   


    看来和我想的一样,,但是好难接受。我理解的private是类内可以访问,类的每个实例里自己能访问得到,但没想到类的不同实例间也可以访问。。
    那类和它的实例到底算是什么关系像你说的那样,类的实例也算是类内部吗?