** 父类子类中的this指的是什么? **
** 多态本质是什么? **
class Base{
int a = 1;
public void f(){
System.out.println(this.a); //此处a为父类1
System.out.println(this.p()); //此处调用子类覆写方法; 多态特性1
System.out.println(this);
}
public String p(){
return "this is Base Object";
}
}
public class Test extends Base {
int a = 2;
public String p(){
System.out.println(this);
return "this is test";
}
public static void main(String[] args) {
Test t = new Test();
t.f();
t.a;
Base b = new Test(); //多态特性2
b.f()
}
}
父类和子类中this是同一个对象么?从结果看 两处打印this的是同一个字符串,但是这都是调用的toString()方法,两个this调用的是同个方法生成的,返回结果肯定是同一个字符串,并不能说名父类子类this一定是同一个对象。
new创建对象时候,会在内存里开辟出父类对象和子类对象中的属性,方法所用的空间。父类子类中的this指向的也是各自的对象,new后生成的对象也是指向子类对象。
java中的属性和方法有个特性,当对象处于子类时候,要使用属性或者方法,会先在子类对象中搜索,搜索不到在在父类中搜索。比如代码中t.a 如果Test中没有则会在Base中搜索。方法也是 因为t中没有f方法所以直接调用Base对象中的f。
当对象处于父类对象时候,调用其方法,会先从子类中搜所,子类中没有则会在父类中搜所,但是前提是父类中一定要有该方法,子类对象中如果也有该方法(方法重写),则会执行子类对象方法,这个现象也叫多态。至于父类对象中的属性则没有该规律,属性只能属于该父类,或者父类的父类,不可能是子类对象的属性。该代码中this.p就是调用的子类对象方法而不是父类对象中的方法,要是把父类中的p注释掉,则编辑器会报错。另外在代码中多态特性2的代码 则是经常看见的多态表现方式
结论:
1 属性和方法,从 ‘当前层’ 向上查找 最先找到先使用(大部分语言继承都这样)
2 方法 在'当前层' 或‘上层’具有该方法,同时具有‘底层’, 从‘底层’查找,使用‘底层‘方法 (多态)
Base{
public void f(){} //1
}
Sub1 extends Base{
}
Sub2 extends Sub1{
public void f(){} //2
}
Sub1 s2 = new Sub2()s2.f 会执行2处方法 规律2 多态
Sub1 s1 = new Sub1() s1.f 会执行1处方法 规律1
网友评论