首页 > 代码库 > JAVA继承时this和super关键字

JAVA继承时this和super关键字

JAVA继承时thissuper关键字

本文主要讨论在方法前使用thissuper关键字时,编译器在什么地方查找对应的函数。

  1. 在子类中指定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

  1. 在子类中使用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

  1. 在父类中指定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();

}

}

 

JAVA继承时this和super关键字