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)是为了便于解释,实际中不可这样写。初学内存模型,如理解不当欢迎大家指正!
相关文章推荐
- JAVA面向对象基础:继承、变量隐藏、方法重写、包、修饰符、this、super
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- 关于Java中子类能否继承和重写父类的静态方法问题
- Java中的类成员访问控制符和继承重写父类的方法时的类成员访问控制符的相关问题
- java继承方法重写权限问题
- 简单的java实验,涉及到 类继承以及接口问题,方法体的重写(区别于重载)
- java 继承 方法重写 自动转型 多态 接口 抽象类
- JAVA中的静态方法和非静态方法的继承覆盖问题
- Java JPanel继承重写paint方法,无法清除原内容
- Java学习之面向对象(方法的重写 overwrite,super的使用,继承中的构造方法)
- Java方法重写问题
- Java写贪吃蛇游戏,用双缓冲重写update方法解决了闪烁问题,有出现了这个问题……
- java 中 static 方法 的继承问题
- java代码继承。。。找出不能继承父类方法的问题
- 用java中继承和方法重写实现求最大公约数和最小公倍数
- java方法的重载,重写,super,this,final关键字
- java 继承 方法重写 自动转型 多态 接口 抽象类
- 在继承中重写方法时抛出异常的问题
- java继承并重写方法时抛出一样的异常或不抛异常,既不能多也不能少,范围既不能打也不能小
- Java中方法和变量在继承时的覆盖问题