您的位置:首页 > 编程语言 > Java开发

Java继承中方法重写与this问题

2018-02-09 23:56 253 查看

Java继承中方法重写与this问题

先看一下程序 :public class A {
public void gogo() {
this.print();
}
public void print() {
System.out.println("输出A");
}
}
class B extends A{
public void print() { //方法重写
System.out.println("输出B");
}
}
public class test {
    public static void main(String[] args) {
        B b = new B();
        b.gogo();
    }
}

 运行结果为:输出B
    问题:A作为一个基类,被B类继承,B中又将A的print()方法重写。main方法中创建B的对象,执行b.gogo(); 显然,是调用的A类的gogo()方法;A类的gogo()方法中又调用print()方法;这里的print()方法是A中的还是B中的?通过运行结果易得,是调用的B类中重写的方法。这里涉及到this关键字的用法,现对此详细讨论。

   1、首先要明确几点:
    (1)this是当前子类对象的引用
    (2)所有方法的定义,都会默认添加隐性形参this和super,即例程中print()方法定义时,java默认定义为print(this,super);
    (3)除Object类之外的所有类的构造器中,第一句必须是super();即父类的构造器是无法继承的,必须在此调用一下。 在自己写的类中即使没有这一句,java也会自动默认加上。

    2、JVM在运行java程序时,内存部署可粗略分为线程栈、堆、方法区(也是推形式存放)。线程栈中存放执行程序时的局部变量,堆中存放类的实例对象,方法区中存放类的具体信息(包括属性、程序、常量池、static变量和方法等)。
    3、当运行此程序,即运行java test时,test类的信息加载到方法区。此处main方法前加static关键词,将main声明为静态方法,是依赖于类存在的,而不是对象,就是说即使没有test类的实例对象,也可以在存放static量的区域中直接搜索并调用程序入口(main),这也是main方法前加static关键字的原因。(圈1)
    4、执行B b = new B();时,在线程栈中创建局部变量b(圈2),在方法区中加载A类和B类信息(圈3),以此为模板在堆中创建B的对象(圈4),b指向B的对象。
    5、执行b.gogo();时,实际传入参数b.gogo(this,super);this指的是b。B类中没有重写gogo(this,super)方法,所有调用从A类继承的gogo(this,super)方法,此处的this仍然是上一个this,指的是b,因此,gogo(this,super)中执行this.print();(等同于print(),this写不写表示的都一样)为B类中重写的print();



以上括号内的(this,super)是为了便于解释,实际中不可这样写。初学内存模型,如理解不当欢迎大家指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐