JAVA继承时this和super关键字

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

  1. 在子类中指定this关键字。首先在本类中查找,如果本类中找不到,再在父类中查找。
  1. class A
  2.  
  3. {
  4.  
  5. public void fun()
  6.  
  7. {
  8.  
  9. System.out.println("父类的fun()");
  10.  
  11. }
  12.  
  13. }
  14.  
  15. class B extends A
  16.  
  17. {
  18.  
  19. public void test()
  20.  
  21. {
  22.  
  23. this.fun();
  24.  
  25. }
  26.  
  27. public void fun()
  28.  
  29. {
  30.  
  31. System.out.println("子类中的fun()");
  32.  
  33. }
  34.  
  35. }
  36.  
  37. public class Hello
  38.  
  39. {
  40.  
  41. public static void main(String[] args) throws Exception
  42.  
  43. {
  44.  
  45. B b = new B();
  46.  
  47. b.test();
  48.  
  49. }
  50.  
  51. }

输出结果是子类中的fun。如果我们将子类中的该函数删去,那么调用的就是父类中的fun。

  1. class A
  2.  
  3. {
  4.  
  5. public void fun()
  6.  
  7. {
  8.  
  9. System.out.println("父类的fun()");
  10.  
  11. }
  12.  
  13. }
  14.  
  15. class B extends A
  16.  
  17. {
  18.  
  19. public void test()
  20.  
  21. {
  22.  
  23. this.fun();
  24.  
  25. }
  26.  
  27. // public void fun()
  28.  
  29. // {
  30.  
  31. // System.out.println("子类中的fun()");
  32.  
  33. // }
  34.  
  35. }
  36.  
  37. public class Hello
  38.  
  39. {
  40.  
  41. public static void main(String[] args) throws Exception
  42.  
  43. {
  44.  
  45. B b = new B();
  46.  
  47. b.test();
  48.  
  49. }
  50.  
  51. }

输出父类中的fun

  1. 在子类中使用super,那么跳过子类查找直接从父类中查找
  1. class A
  2.  
  3. {
  4.  
  5. public void fun()
  6.  
  7. {
  8.  
  9. System.out.println("父类的fun()");
  10.  
  11. }
  12.  
  13. }
  14.  
  15. class B extends A
  16.  
  17. {
  18.  
  19. public void test()
  20.  
  21. {
  22.  
  23. super.fun();
  24.  
  25. }
  26.  
  27. public void fun()
  28.  
  29. {
  30.  
  31. System.out.println("子类中的fun()");
  32.  
  33. }
  34.  
  35. }
  36.  
  37. public class Hello
  38.  
  39. {
  40.  
  41. public static void main(String[] args) throws Exception
  42.  
  43. {
  44.  
  45. B b = new B();
  46.  
  47. b.test();
  48.  
  49. }
  50.  
  51. }

输出父类中的fun

  1. 在父类中指定this关键字。和子类中指定this关键字一样,先从子类中找覆写的方法,如果找到,直接调用子类的该方法,如果没找到再从父类中寻找。
  1. class A
  2.  
  3. {
  4.  
  5. public void test()
  6.  
  7. {
  8.  
  9. this.fun();
  10.  
  11. }
  12.  
  13. public void fun()
  14.  
  15. {
  16.  
  17. System.out.println("父类的fun()");
  18.  
  19. }
  20.  
  21. }
  22.  
  23. class B extends A
  24.  
  25. {
  26.  
  27. public void fun()
  28.  
  29. {
  30.  
  31. System.out.println("子类中的fun()");
  32.  
  33. }
  34.  
  35. }
  36.  
  37. public class Hello
  38.  
  39. {
  40.  
  41. public static void main(String[] args) throws Exception
  42.  
  43. {
  44.  
  45. B b = new B();
  46.  
  47. b.test();
  48.  
  49. }
  50.  
  51. }

输出子类中的fun

如果此时将子类中的fun删除

  1. class A
  2.  
  3. {
  4.  
  5. public void test()
  6.  
  7. {
  8.  
  9. this.fun();
  10.  
  11. }
  12.  
  13. public void fun()
  14.  
  15. {
  16.  
  17. System.out.println("父类的fun()");
  18.  
  19. }
  20.  
  21. }
  22.  
  23. class B extends A
  24.  
  25. {
  26.  
  27. // public void fun()
  28.  
  29. // {
  30.  
  31. // System.out.println("子类中的fun()");
  32.  
  33. // }
  34.  
  35. }
  36.  
  37. public class Hello
  38.  
  39. {
  40.  
  41. public static void main(String[] args) throws Exception
  42.  
  43. {
  44.  
  45. B b = new B();
  46.  
  47. b.test();
  48.  
  49. }
  50.  
  51. }

输出父类中的fun

但此时有一点需要注意的是,如果修改父类的fun的访问权限为private,这时输出的就是父类中的fun

  1. class A
  2.  
  3. {
  4.  
  5. public void test()
  6.  
  7. {
  8.  
  9. this.fun();
  10.  
  11. }
  12.  
  13. private void fun()
  14.  
  15. {
  16.  
  17. System.out.println("父类的fun()");
  18.  
  19. }
  20.  
  21. }
  22.  
  23. class B extends A
  24.  
  25. {
  26.  
  27. public void fun()
  28.  
  29. {
  30.  
  31. System.out.println("子类中的fun()");
  32.  
  33. }
  34.  
  35. }
  36.  
  37. public class Hello
  38.  
  39. {
  40.  
  41. public static void main(String[] args) throws Exception
  42.  
  43. {
  44.  
  45. B b = new B();
  46.  
  47. b.test();
  48.  
  49. }
  50.  
  51. }

JAVA继承时this和super关键字的更多相关文章

  1. java中关于类的封装与继承,this、super关键字的使用

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5454849.html. this关键字: this代表当前对象,它有以下几种用途: 1.本类 ...

  2. 乐字节Java继承|方法重写、super和final关键字

    大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...

  3. java继承,final,super,Object类,toString,equals,

    Java中的内部类:成员内部类静态内部类方法内部类匿名内部类 内部类的主要作用如下: 1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 2. 内部类的方法可 ...

  4. 面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法

    继承 概念: ①   继承背后的思想就是基于已存在的类来构建新类; ②   当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求; ③   当从其它类导出的类叫作子 ...

  5. Java继承时的初始化顺序

    Java程序在启动和运行时,需要首先完成初始化的工作.在涉及到继承.static成员变量等因素时,初始化的顺序就复杂起来.下面以一个例子说明继承时的Java初始化顺序. 例子: class Insec ...

  6. Java基础系列--this、super关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8483623.html 一.概述 Java中this有两种用途,一种是用于指代当前对象,一种 ...

  7. Java基础之this和super关键字用法

    this 在java中,this是一个引用当前类对象的引用变量,主要有以下几种用法: 引用当前类的实例变量· this关键字可以用来引用当前类的实例变量.如果实例变量和某个方法的参数之间存在歧义(实例 ...

  8. JAVA继承时构造函数的问题

    今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...

  9. 详解 继承(下)—— super关键字 与 多态

    接上篇博文--<详解 继承(上)-- 工具的抽象与分层> 废话不多说,进入正题: 本人在上篇"故弄玄虚",用super();解决了问题,这是为什么呢? 答曰:子类中所有 ...

随机推荐

  1. ABBYY将JPEG文件转换成Word文档的方法

    日常工作中处理JPEG格式的图像文件时,有时需要转换成Word文档进行编辑,市场上应用而生了很多转换工具,相信不少人听说过OCR(光学字符识别)软件,可以用来转换图像文件,而在OCR软件中, ABBY ...

  2. entity framework里的继承映射关系TPH、TPT和TPC

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...

  3. linux服务之audit

    http://blog.chinaunix.net/uid-20786165-id-3167391.html http://blog.chinaunix.net/uid-8389195-id-1741 ...

  4. Python画图形界面

    使用QTdesigner 生成.ui文件,输入命令行pyuic4 -o test.py test.ui 在生成的Python文件后面输入下面代码 if __name__=="__main__ ...

  5. Linux 下 apache 日志分析与状态查看[转]

    假设apache日志格式为: 118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 3 ...

  6. jquery显示隐藏toggle

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 类型参数约束 : Controller where T : class,new()

    这是类型参数约束,.NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型 where T : class | T必须是一个类(class)类型,不能是结构( ...

  8. du命令 实现Linux 某个文件夹下的文件按大小排序

    1. df -lh 2. du -s /usr/* | sort -rn这是按字节排序 3. du -sh /usr/* | sort -rn这是按兆(M)来排序 4.选出排在前面的10个du -s ...

  9. jQuery validate在没有校验通过的情况下拒绝提交

    下面通过一个简单的例子说明,这个问题,可能是很多人遇到的,验证不通过的时候,依然提交了表单. HTML <form class="survey" id="surve ...

  10. Hibernate 抓取策略fetch-1 (select join subselect)

    原文 :http://4045060.blog.51cto.com/4035060/1088025 部分参考:http://www.cnblogs.com/rongxh7/archive/2010/0 ...