JAVA继承时this和super关键字
本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数。
- 在子类中指定this关键字。首先在本类中查找,如果本类中找不到,再在父类中查找。
class A { public void fun() { System.out.println("父类的fun()"); } } class B extends A { public void test() { this.fun(); } public void fun() { System.out.println("子类中的fun()"); } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } } |
输出结果是子类中的fun。如果我们将子类中的该函数删去,那么调用的就是父类中的fun。
class A { public void fun() { System.out.println("父类的fun()"); } } class B extends A { public void test() { this.fun(); } // public void fun() // { // System.out.println("子类中的fun()"); // } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } } |
输出父类中的fun
- 在子类中使用super,那么跳过子类查找直接从父类中查找
class A { public void fun() { System.out.println("父类的fun()"); } } class B extends A { public void test() { super.fun(); } public void fun() { System.out.println("子类中的fun()"); } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } } |
输出父类中的fun
- 在父类中指定this关键字。和子类中指定this关键字一样,先从子类中找覆写的方法,如果找到,直接调用子类的该方法,如果没找到再从父类中寻找。
class A { public void test() { this.fun(); } public void fun() { System.out.println("父类的fun()"); } } class B extends A { public void fun() { System.out.println("子类中的fun()"); } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } } |
输出子类中的fun
如果此时将子类中的fun删除
class A { public void test() { this.fun(); } public void fun() { System.out.println("父类的fun()"); } } class B extends A { // public void fun() // { // System.out.println("子类中的fun()"); // } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } } |
输出父类中的fun
但此时有一点需要注意的是,如果修改父类的fun的访问权限为private,这时输出的就是父类中的fun
class A { public void test() { this.fun(); } private void fun() { System.out.println("父类的fun()"); } } class B extends A { public void fun() { System.out.println("子类中的fun()"); } } public class Hello { public static void main(String[] args) throws Exception { B b = new B(); b.test(); } } |