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变量的吗?
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变量的吗?
继续坐等高手~
其实 我们 装载类 ,连接,初始化类之间有一个步骤叫做 。解析 , 解析主要就是解析常量池,把符号引用转换为直接引用。 那么对于方法的直接引用如何转换呢。就涉及到了一个叫方法表的数据结构。
比如说我们有如下类
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 类型的数据
这就可以解释你的问题了
在子类方法表中的 未被子类重载的父类方法, 指向的是父类型; 所以你的问题就解决了~~ 其实多态的实现也是这个机制。 还需要注意的是,在子类与父类的方法表中, 方法的偏移量是相同的。
但是在 子类型于实现接口中则不是这样,所以类解析要比接口解析会很多哦。
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是指子类对象,请看输出结果!愚人之见,不知对否,请高手评论~
前文我没怎么看 因为让LZ想的太具体了 我就挑重点说private属性或者函数不会被子类继承 还有 JAVA里没有属性重写这一说 打个比方 假设父类中含有私有变量A 子类无法访问父类私有变量A 即使子类也定义了个变量A 那么也是独立的 与父类的变量A毫无关系 在这种情况 你设置子类的变量A不会影响到父类的变量A的另外 如何确认子类是否重写父类方法有个简单的方式 就是用@Override注解来强调某个函数是重写的函数http://jiangzhengjun.iteye.com/blog/577040
多态 3要素 继承 重写 父类引用指向子类对象
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类型的引用 ,多态条件满足