class Array{                            //定义一个父类数组
private int temp[];
private int toop;
public Array(int len){              //父类数组的构造方法
if(len > 0){
temp = new int[len];
}else{
temp = new int[1];
}
}
public boolean add(int i){                       //添加元素到数组中;
if(this.toop == (int)(this.temp.length)){            //不懂的地方一
System.out.println("数组已满!插入出错");
return false;
}else{
this.temp[toop] = i;
toop++;
System.out.println("插入成功");
return true;
}
}
public int[] getArray(){
return this.temp;
}
}class ReverseArray extends Array{                    //继承;
public ReverseArray(int len){
super(len);
}
public int[] getArray(){
int t[] = new int[(int)super.getArray().length];
int count = t.length-1;
for(int i = 0;count >=0 ;i++,count--){
t[i] = super.getArray()[count] ;
}
return t;
}
}
public class ArrayDemo {
public static void main(String args[]){
ReverseArray a =null;
a = new ReverseArray(5);
System.out.print(a.add(23)+"\t'");          //不懂的地方二;
}

}
问题:我在main方法中“不懂的地方二”这个地方用子类对象调用了已经继承了的add方法,那么这个add方法究竟是属于子类还是仍然属于父类的呢?如果属于子类的话,那么“不懂的地方一”这里的this应该值的是调用此方法的对象把,也就是子类对象把,但是子类对象又不是不能够直接使用父类方法中private变量的吗?

解决方案 »

  1.   

    你的父类add方法是public,所以子类是能调用的。
      

  2.   

    刚才做了了个实验,对于这个this确实指向的只能是父类的属性,不管这个属性是私有的还是公有的,哪怕是子类自己也包含同样名字的属性,无论是因为类的属性没有多态性还是什么角度,感觉子类继承父类的方法,只是获取了对这个方法的使用权,或者说父类传递了一个类似引用(指针)的东西过来,继承来得父类方法不会有任何改变
      

  3.   

    五楼的意思是说其实子类中继承的add方法其实是属于父类的,父类给予子类的只是这个add方法的引用罢了,所以子类调用add方法其实是调用父类的add方法?
    继续坐等高手~
      

  4.   

    哈 这个问题其实蛮好玩的
    其实 我们   装载类 ,连接,初始化类之间有一个步骤叫做 。解析 , 解析主要就是解析常量池,把符号引用转换为直接引用。 那么对于方法的直接引用如何转换呢。就涉及到了一个叫方法表的数据结构。
    比如说我们有如下类
    public class Dog{
          public void dosomething():
          public void toString();
          
    }这个类的方发表是这样子的
    ptr to clone();
    ptr t0 eqals ();
    ...
    ...  省去的是Object中的方法
    ...
    ...
    ptr toString().... 注意这个方法  这个方法在子类中重新写了  所以它指向于 Dog 类型数据...
    ptr to wait(long,int);
    ptr to sayHello();....子类中定义的方法 指向Dog类型的数据其它 没有被重写的Object 方法指向 Object 类型的数据
    这就可以解释你的问题了
    在子类方法表中的 未被子类重载的父类方法, 指向的是父类型; 所以你的问题就解决了~~ 其实多态的实现也是这个机制。 还需要注意的是,在子类与父类的方法表中, 方法的偏移量是相同的。 
    但是在 子类型于实现接口中则不是这样,所以类解析要比接口解析会很多哦。
      

  5.   

    class A{
    private int A = 1;
    public void Test01(){
    this.Test02();    
    System.out.println(this.A);  //此处this是父类对象;  //标记一 }
    public void Test02(){
    System.out.println("this调用的是父类的Test02方法");
    }
    }class B extends A{
    private int A = 2;
    public void Test02(){
    System.out.println("this调用的是子类的Test02方法");
    System.out.println(this.A);         //标记二
    }
    }
    public class TextDemo02 {
    public static void main(String args[]){
    B b = new B();
    b.Test01();
    }
    }运行结果:this调用的是子类的Test02方法
    2             //此处是标记二的输出,因为先执行Test02
    1             //此处是标记一的输出,输出是父类的私有变量
    再做了个实验,似乎找到了点规律,不过具体原理还是不太了解:
    一、当子类继承了父类中的方法A,在子类调用A的时候,假若A中有父类的私有变量的时候(父类中用“this.私有变量名”,那么这个this其实是指父类的实例对象,并非子类对象,如果this是子类对象的话那么他就会调用自己的私有变量,结果就是2了,但是非也!);
    二、当子类的私有变量跟父类的私有同名的时候,私有变量的调用只能够在子类中重写后的方法中用this来调用,或者是只属于子类的方法中用this调用。或许JVM认为子类的私有变量必须在只属于你子类的方法中才能够调用把~
    三、子类中调用继承的方法A,方法A中有“this.重写的方法名”,那么此this是指子类对象,请看输出结果!愚人之见,不知对否,请高手评论~
      

  6.   

    谢谢zhao251021539的耐心答复,你的意思我已经大概明白了,不过如果像你所说的子类中未重写的方法其实是父类型的话,那么我8楼的那个试验中Test01方法中的this应该就是指父类对象咯,而父类对象调用Test02方法就是调用自身的Test02方法而非子类中重写的Test02方法咯,希望zhao251021539能够理解我意思并回复我,谢谢啦~
      

  7.   

    补充:“而父类对象调用Test02方法就是调用自身的Test02方法而非子类中重写的Test02方法咯”,但是结果并不是,结果是调用了子类的Test02方法~
      

  8.   

    ....我想想咋跟你解释啊
    前文我没怎么看 因为让LZ想的太具体了 我就挑重点说private属性或者函数不会被子类继承 还有 JAVA里没有属性重写这一说 打个比方 假设父类中含有私有变量A 子类无法访问父类私有变量A 即使子类也定义了个变量A 那么也是独立的 与父类的变量A毫无关系 在这种情况 你设置子类的变量A不会影响到父类的变量A的另外 如何确认子类是否重写父类方法有个简单的方式 就是用@Override注解来强调某个函数是重写的函数http://jiangzhengjun.iteye.com/blog/577040
      

  9.   

    即使System.out.println(this.A);  //此处this是父类对象;  //标记一 你把 this 去掉和你加this 是表示同一个意思哦,,这就是多态机制啊~~没什么问题吧?
    多态 3要素 继承 重写 父类引用指向子类对象
      

  10.   

    package MERAN;class A{
        private int A = 1;
        public void Test01(){
            this.Test02();    
            System.out.println(this.A);  //此处this是父类对象;  //标记一    }
        public void Test02(){
            System.out.println("this调用的是父类的Test02方法");
        }
    }class B extends A{
        private int A = 2;
        public void Test02(){
            System.out.println("this调用的是子类的Test02方法");
            System.out.println(this.A);         //标记二
        }
        public void Test03(){
         super.Test01();
        }
    }
    public class TestDemo02 {
        public static void main(String args[]){
            B b = new B();
            b.Test03();
        }
    }你的那段代码其实和这段是一个意思
    本是一个对B类型的引用,调用 它上面的super 方法也就是调用它父类的 Test01 方法,但保存的仍然是 B类型的引用 ,多态条件满足