JAVA继承时this和super关键字

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

  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关键字的更多相关文章

  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. DbContextConfiguration 属性

    属性 AutoDetectChangesEnabled 获取或设置一个值,该值指示是否通过 DbContext 和相关类的方法自动调用 DetectChanges 方法. 默认值为 true. Ens ...

  2. html之内联标签a

    a标签:定义超链接,用于从一个页面链接到另一个页面,最重要的属性href,如果没有href属性,则不可以使用如下属性:download,hreflang,media,rel,target,type. ...

  3. ExpandableListView方法详解

    正文 一.结构public interface ExpandableListAdapter 间接子类:BaseExpandableListAdapter,CursorTreeAdapter,Resou ...

  4. 高性能MySQL --- 读书笔记(2) - 2016/8/2

    第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件. ...

  5. 剑指offer系列60---第一个只出现一次的字符

    [题目]在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置. * 若为空串,返回-1.位置索引从0开始 * [思路]1 首先遍历字符串数组,添 ...

  6. Redis集群方案介绍

    由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...

  7. Puppet master/agent installation on RHEL7

    ==================================================================================================== ...

  8. gcc和ld 中的参数 --whole-archive 和 --no-whole-archive

    首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串. --whole-ar ...

  9. .NET常用方法——邮件发送

    邮件发送类文件,可直接使用: 调用方法(实例化.静态调用): 实例化: string exception = ""; SendEmail.SendEmail SE = new Se ...

  10. 一个 IT 青年北漂四年的感悟

    转载自:http://www.codeceo.com/article/it-man-beijing-4-years.html 工作这几年,每年都会有朋友离开北京,每次朋友跟我告别的时候总是让我有很多感 ...