代码如下:
- A a = new A();
package com.atguigu.bigdata;
public class TestObject {
public static void main(String[] args) {
A a = new A();
int result = a.getResult();
System.out.println("result: "+ result);
}
}
class A {
public int i = 10;
public int getResult() {
System.out.println("走A类方法");
return i+10;
}
}
class B extends A {
public int i = 20;
public int getResult() {
System.out.println("走B类方法");
return i + 20;
}
}
走A类方法
result: 20
- B a = new B();
package com.atguigu.bigdata;
public class TestObject {
public static void main(String[] args) {
B a = new B();
int result = a.getResult();
System.out.println("result: "+ result);
}
}
class A {
public int i = 10;
public int getResult() {
System.out.println("走A类方法");
return i+10;
}
}
class B extends A {
public int i = 20;
public int getResult() {
System.out.println("走B类方法");
return i + 20;
}
}
走B类方法
result: 40
3.A a = new B();
package com.atguigu.bigdata;
public class TestObject {
public static void main(String[] args) {
A a = new B();
int result = a.getResult();
System.out.println("result: "+ result);
}
}
class A {
public int i = 10;
public int getResult() {
System.out.println("走A类方法");
return i+10;
}
}
class B extends A {
public int i = 20;
public int getResult() {
System.out.println("走B类方法");
return i + 20;
}
}
3.1 去掉B类中的getResult方法
package com.atguigu.bigdata;
public class TestObject {
public static void main(String[] args) {
A a = new B();
int result = a.getResult();
System.out.println("result: "+ result);
}
}
class A {
public int i = 10;
public int getResult() {
System.out.println("走A类方法");
return i+10;
}
}
class B extends A {
public int i = 30;
/* public int getResult() {
System.out.println("走B类方法");
return i + 20;
}*/
}
走A类方法
result: 20
方法重写的要素:
1.方法名一致
2.父子类
3.子类访问权限大于父类
4.子类异常范围小于父类
我们来看内存图:
B是子类,包含父类A的所有。
java有一个动态绑定机制,当jvm执行对象的成员方法时,会将方法和当前对象的实际内存进行绑定
注意是成员方法,如果是属性就没有关系。动态绑定机制和属性没有关系。
上述去掉B类中的getResult方法的代码中, A a = new B();去内存B没有getResult方法。所以会去找A的方法,同时绑定A中public int i=10;为什么呢?
B中有几个 i 呢?两个 i;
两个i,我们怎么区分呢?
this 和 super
public class TestObject {
public static void main(String[] args) {
A a = new B();
int result = a.getResult();
System.out.println("result: "+ result);
}
}
class A {
public int i = 10;
public int getResult() {
System.out.println("走A类方法");
return this.i+10;
}
}
class B extends A {
public int i = 30;
/* public int getResult() {
System.out.println("走B类方法");
return i + 20;
}*/
}
动态绑定机制和属性没有关系。所以在哪声明就在哪使用。所以当前对象的 i 就是A类中声明的i。
4.加一个getI()方法。
public class TestObject {
public static void main(String[] args) {
A a = new B();
int result = a.getResult();
System.out.println("result: "+ result);
}
}
class A {
public int i = 10;
public int getResult() {
System.out.println("走A类方法");
return getI()+10;
}
public int getI() {
return i;
}
}
class B extends A {
public int i = 30;
public int getI() {
return i;
}
/* public int getResult() {
System.out.println("走B类方法");
return i + 20;
}*/
}
走A类方法
result: 40
为什么呢?
动态绑定机制。
B中没有getResult方法,去内存A中找,在A类中getResult方法又调用了一个getI()方法,getI()是成员方法,而B中有getI()方法,间接调用了B类的getI()方法,也进行绑定。则 i = 30。