如下程序,求解三个输出的原理
答案:1 悬赏:40 手机版
解决时间 2021-02-02 13:59
- 提问者网友:火车头
- 2021-02-01 19:13
如下程序,求解三个输出的原理
最佳答案
- 五星知识达人网友:天凉才是好个秋
- 2021-02-01 20:04
前两个输出说明即便不在子类中显式调用父类构造方法,也会自动地调用父类的无参构造方法。
第三个输出是因为man类没有定义构造方法,使用的编译器自动生成的空构造方法,导致name域没有初始化,为空指针,所以执行say()方法,试图获得name.length()时报空指针异常。追问谢谢您的解答,刚补充了问题,我的疑问点是1、在父类person的构造函数中this怎么是man?2、既然this是man对象,那么this.i 怎么又是9?(父类person的值)3、构造函数调用的say方法怎么是子类重写的say?
三个问题可以归为Java的构造函数的实现原理,调用顺序追答this指针指的是man类对象m,所以调用toString方法自然是调用man类的toString方法输出man类的信息。JVM有机制确定运行时对象的实际类型(通过动态绑定方法表以及Class类实现)。
因为子类继承父类所有域
原理同1,这叫多态,JVM有机制确定对象的实际类型,并调用相应类型的方法。
追问谢谢解答,但还是有疑问
1、在构造器中this不是指向正在生成的对象吗?此时不是该指向person吗(父类所在的堆内存)
2、没明白您的意思
3、JVM具体机制是怎样的?类比2,say方法调用的是子类的,i成员变量却是父类,这其中的区别的原理是什么追答new man()这一句话只会在堆中生成一个man类的对象,这个对象首先有父类person的域int i=9,然后有自己的域int i=10以及String name=null。注意父类的域i和man类的域i是两个不同的变量。当你执行System.out.println(this)这句话时实际上隐式地调用了toString方法,而toString是一个自动覆盖的方法,它输出本类对象属性。所以此时发生多态,JVM会根据方法表找到具体该调用哪个toString,结果是man类的toString,所以打印man类对象的属性。而执行System.out.println(this.i)一句时,不涉及到方法覆盖,输出的是person类中的那个i。(因为println方法有println(int)的重载形式可以直接输出int型)。之前我看漏了man中还定义了一个i所以把事情想得简单了。为什么调用的是子类的say()和为什么调用的是子类的toString()是一个道理。
第三个输出是因为man类没有定义构造方法,使用的编译器自动生成的空构造方法,导致name域没有初始化,为空指针,所以执行say()方法,试图获得name.length()时报空指针异常。追问谢谢您的解答,刚补充了问题,我的疑问点是1、在父类person的构造函数中this怎么是man?2、既然this是man对象,那么this.i 怎么又是9?(父类person的值)3、构造函数调用的say方法怎么是子类重写的say?
三个问题可以归为Java的构造函数的实现原理,调用顺序追答this指针指的是man类对象m,所以调用toString方法自然是调用man类的toString方法输出man类的信息。JVM有机制确定运行时对象的实际类型(通过动态绑定方法表以及Class类实现)。
因为子类继承父类所有域
原理同1,这叫多态,JVM有机制确定对象的实际类型,并调用相应类型的方法。
追问谢谢解答,但还是有疑问
1、在构造器中this不是指向正在生成的对象吗?此时不是该指向person吗(父类所在的堆内存)
2、没明白您的意思
3、JVM具体机制是怎样的?类比2,say方法调用的是子类的,i成员变量却是父类,这其中的区别的原理是什么追答new man()这一句话只会在堆中生成一个man类的对象,这个对象首先有父类person的域int i=9,然后有自己的域int i=10以及String name=null。注意父类的域i和man类的域i是两个不同的变量。当你执行System.out.println(this)这句话时实际上隐式地调用了toString方法,而toString是一个自动覆盖的方法,它输出本类对象属性。所以此时发生多态,JVM会根据方法表找到具体该调用哪个toString,结果是man类的toString,所以打印man类对象的属性。而执行System.out.println(this.i)一句时,不涉及到方法覆盖,输出的是person类中的那个i。(因为println方法有println(int)的重载形式可以直接输出int型)。之前我看漏了man中还定义了一个i所以把事情想得简单了。为什么调用的是子类的say()和为什么调用的是子类的toString()是一个道理。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯