关于子类创 4000 建对象调用父类方法时this的问题(以及方法重写)
2018-03-22 15:20
381 查看
如下实例提出问题:
class T{
T(){
System.out.println("T()");
}
void foo(){this.bar();}
void bar(){
System.out.println("T.bar");
}
}
class B extends T{
B(){
System.out.println("B()");
}
void foo(){
super.foo();
}
void bar(){
System.out.println("B.bar");
}
}
public class test {
public static void main(String[] args) {
B b=new B();
b.foo();
}
}
结果输出如下:
其实我相信这样的结果可能大家都是惊讶的,b.foo()实际是调用了父类中的foo()方法,方法主体为this.bar
由结果可以得到this实际指的是子对象。
分析:
由输出结果可见,当创建子类对象时首先调用了父类的构造方法,再调用子类的构造方法,值得注意的是传给父类构造方法的this指针和传给子类构造方法的this指针完全相同,也就是说调用父类构造方法的并不是父类的对象,所以在创建子类对象时并没有创建父类对象。this指向的仍然是子对象,同时由于子类重写了父类的bar()方法,所以输出为B.barr
在原代码上做轻微改动如下:
class T{
T(){
System.out.println("T()");
}
void foo(){this.bar();}
void bar(){
System.out.println("T.bar");
}
}
class B extends T{
B(){
System.out.println("B()");
}
void foo(){
super.foo();
}
/*void bar(){
System.out.println("B.bar");
}*/
}
public class test {
public static void main(String[] args) {
B b=new B();
b.foo();
}
}
输出结果如下:
由于此时子类并未重写父类方法,故输出为T.bar
class T{
T(){
System.out.println("T()");
}
void foo(){this.bar();}
void bar(){
System.out.println("T.bar");
}
}
class B extends T{
B(){
System.out.println("B()");
}
void foo(){
super.foo();
}
void bar(){
System.out.println("B.bar");
}
}
public class test {
public static void main(String[] args) {
B b=new B();
b.foo();
}
}
结果输出如下:
其实我相信这样的结果可能大家都是惊讶的,b.foo()实际是调用了父类中的foo()方法,方法主体为this.bar
由结果可以得到this实际指的是子对象。
分析:
由输出结果可见,当创建子类对象时首先调用了父类的构造方法,再调用子类的构造方法,值得注意的是传给父类构造方法的this指针和传给子类构造方法的this指针完全相同,也就是说调用父类构造方法的并不是父类的对象,所以在创建子类对象时并没有创建父类对象。this指向的仍然是子对象,同时由于子类重写了父类的bar()方法,所以输出为B.barr
在原代码上做轻微改动如下:
class T{
T(){
System.out.println("T()");
}
void foo(){this.bar();}
void bar(){
System.out.println("T.bar");
}
}
class B extends T{
B(){
System.out.println("B()");
}
void foo(){
super.foo();
}
/*void bar(){
System.out.println("B.bar");
}*/
}
public class test {
public static void main(String[] args) {
B b=new B();
b.foo();
}
}
输出结果如下:
由于此时子类并未重写父类方法,故输出为T.bar
相关文章推荐
- 关于重写servlet的service()方法时调用父类service方法的问题
- 关于C++中子类调用父类方法的一个问题
- java中关于子类实例化时调用父类无参构造方法的问题
- ejb客户端的三种调用方法,以及InitialContext lookup后的jndi对象在服务重启后缓存失效的问题
- 8.python之面相对象part.5(子类调用父类的方法,以及super关键字)
- 关于多态性的动态绑定问题, 对象调用方法的执行过程.
- 关于“如何做到在一个类内不通过创建另一个类的对象,却调用另一个类的方法”的问题
- Java的重写与调用父类方法问题
- 关于Android Fragment生命周期以及其他方法的调用执行顺序问题
- 关于Java中子类能否继承和重写父类的静态方法问题
- 关于子类继承父类后调用方法的问题
- JavaSE8基础 多态扩展性 父类引用作为函数参数,调用所装子类对象的重写方法
- 关于继承时子类重写父类方法和覆盖父类变量的若干问题 (待进一步研究)
- 关于子类继承父类后调用方法的问题
- Java父类对象调用子类实体:方法重写与动态调用
- 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址
- [cocos2d-x]关于update回调,以及继承后子类调用父类的Update处理的问题
- java方法重写的时候,一个调用父类还是子类方法的问题
- 关于C++中子类调用父类方法的一个问题
- 浅析关于ObjectC中的自定义初始化方法和便利构造器以及重写父类的description方法的理解