Java中的两个关键字——super、this

神话丿小王子的博客主页

一、super

super 是java中方的一个关键字,用它可以引用父类中的成员:

super可用于访问父类中定义的属性

super可用于调用父类中定义的成员方法

super可用于在子类构造器中调用父类的构造器

使用super关键字注意事项:

1、当子类和父类都有同名的属性时,在子类中如果要使用父类的属性 super . 属性

2、 super只能应用在成员方法和构造方法中,不能用在静态方法中(和this是一样的)

3、如果在构造方法中使用必须放在第一行

4、在构造方法中this()和super()不能同时出现

super没有什么需要解释的地方,我们用代码来看看super具体的一些强大功能吧


示例一、使用super调用基类的属性:

public class Father {
  int num=20;
}
public class Child extends Father{
  int num;
  public void print(){
    num=10;
    super.num=30;
    System.out.println("num="+num);
    System.out.println("super.name="+super.num);
  }
}
public class Test {
  public static void main(String[] args) {
  Child xm=new Child();
  xm.print();
  }
}

运行结果:


示例二、使用super调用基类中的构造方法:

public class Father {
  int num;
  public Father() {
    System.out.println("父类中的无参构造方法---");
  }
  public Father(int num){
    System.out.println("父类中的有参的构造方法----"+num);
  }
}
public class Child extends Father{
  int num;
  public Child() {
    super(30);
    System.out.println("子类无参构造方法---");
  }
  public Child(int num) {
    this.num = num;
    System.out.println("子类中的有参的构造方法---"+num);
  }
}

解释一下上面的这段代码:在Child类中的第一个构造函数里面,super(30);它会去调用父类中嗲有一个int型参数的构造方法。在Child类中的第二构造函数里面,虽然没有super关键字出现,但是系统会默认给它一个super();去调用父类中默认的也就是无参的构造方法。


常见错误:(把示例二代码删除父类中的无参构造方法)

public class Father {
  int num;
public Father(int num){
  System.out.println("父类中的有参的构造方法----"+num);
  }
}
public class Child extends Father{
  int num;
public Child() {
  super(30);
  System.out.println("子类无参构造方法---");
}
public Child(int num) {
  this.num = num;                 
  System.out.println("子类中的有参的构造方法---"+num);
  }  
}

上面删除线里面的代码的错误:我们知道,在构造方法,无论我们写不写supper(),系统都会给我们一个默认的supper()去调用父类中的无参构造方法。上面的代码中,我们删除了父类中的无参构造方法,而在子类中的有参构造方法中,系统默认调用父类中的无参构造方法,所以会报错,这里需要注意。



二、this关键字:

1.this关键字-用法一:当类中某个非静态方法的参数名跟类的某个成员变量名相同时,为了避免参数的作用范围覆盖了成员变量的作用范围,必须明确地使用this关键字来指定成员变量


代码示例:

public class ThisDemo {
  int a=123;
  public void show() {
    int a=321;
    System.out.println("a="+a);
    System.out.println("this.a="+this.a);
    this.a=a;
    System.out.println("赋值后的this.a="+this.a);
  }
}

测试类:

public class Test {
  public static void main(String[] args) {
    ThisDemo h=new ThisDemo();
    h.show();
  }
}

运行结果:

解释:由于局部变量优先级高于成员变量,所以第一条输出语句里面的a=321,第二个输出语句中,this指定了这里的a是成员变量中的a,所以输出成员变量a=123;this.a=a,也就是将局部变量的值赋值给成员。


2.this关键字-用法二:如果某个构造方法的第一条语句具有形式this(...),那么这个构造方法将调用本类中的其他构造方法。

代码示例:

public class ThisDemo {
  public ThisDemo() {
    this("shen_hua");
  }
  public ThisDemo(String name) {
    //带一个String类型的参数的构造方法
  }
  public ThisDemo(String name,int age) {
    //带两个参数的构造方法
  }
}

解释:在第一个无参的构造方法里面,this();包含了一个字符串,所以它会调用本类中形参为一个字符串的构造方法。

3.this关键字除了可以引用变量或者成员方法之外,每个类的非静态方法都会隐含一个this隐含名称,它指向调用这个方法的对象。

4.一些内部类和匿名类,如事件处理。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。


三、this和super的对比

              

NO.

比较点

this

supper

1

访问属性

首先在子类中查找,如果没有就在父类中查找

直接查找父类

2

访问方法

先再子类中找,如果没有就去父类中查找

直接访问父类中到方法

3

调用构造

调用本类中的其他构造方法

调用父类的跟构造方法

4

特殊

指自身对象

没有

5

作为参数

可以作为参数

没有

Java中的两个关键字——super、this的更多相关文章

  1. 如何理解 Java 中的 <T extends Comparable<? super T>>

    Java 中类似 <T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到. ...

  2. Java中的50个关键字

    form:http://blog.csdn.net/luoweifu/article/details/6776240 Java中的50个关键字 关键字也称为保留字,是指java语言中规定了特定含义的标 ...

  3. Java中this、static关键字的内存图解

    Java中的关键字有很多,abstract  default  goto*  null  switch  boolean  do  if  package  nchronzed  break  dou ...

  4. JAVA中比较两个文件夹不同的方法

    JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同.具体例子如下: public class TestFo ...

  5. Java 中如何计算两个字符串时间之间的时间差?(单位为分钟)

    Java 中如何计算两个字符串时间之间的时间差?(单位为分钟) import java.text.DateFormat; import java.text.ParseException; import ...

  6. Java中的两种异常类型及其区别?

    Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...

  7. Java中static、this、super、final的用法

    一.          static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...

  8. java中static、this、super、final用途、用法及实例

    一.static 请先看下面这段程序: public class Hello { public static void main(String[] args){ //(1) System.out.pr ...

  9. 简析--Java中常见的一些关键字的解析

    在Java开发中我们经常会用到一些关键字,关键字的定义很有意思"Java事先定义好的,具有特殊含义的单词",那么我们怎么来用好关键字呢?下面我们对一些常见的关键字进行分析和比较; ...

随机推荐

  1. JS魔法堂:元素克隆、剪切技术研究

    一.前言 当需要新元素时我们可以通过 document.createElement 接口来创建一个全新的元素,也可以通过克隆已有元素的方式来获取一个新元素.而在部分浏览器中,通过复制来获取新元素的效率 ...

  2. Visual Studio开发Cordova应用示例

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5455728.html 本文的GIF动画均使用ScreenToGif进行录制. Cordova是什么? ...

  3. SQL Server时间粒度系列----第4节季、年时间粒度详解

    本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表   SQL Serve季时间粒度       季时间粒度也即是季度时间粒度.一年每3 ...

  4. 编写Chrome扩展程序

    Chrome的扩展程序很多,也很容易入门,可以来简单实现一下 看看,慢慢就能实现出一个扩展程序来 每个扩展程序应用一般会包含: 一个manifest清单文件 html文件 js文件 其他文件等 可以看 ...

  5. 两种CSS3圆环进度条详解

    晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第 ...

  6. Oracle创建用户、表空间并设置权限

    代码: //dba账户登录 sqlplus 请输入用户名:dpp_data as sysdba 请输入口令:dpp_data //创建账号 create user techrpt_data ident ...

  7. Nancy 学习-自宿主 继续跨平台

    Nancy简介 Nancy是一个轻量级的独立的框架,下面是官网的一些介绍: Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台,框架的目标是保持尽可能 ...

  8. Wojilu学习笔记 (02)

    使用RequireJS (1)整个页面,应该只有一个 <script src="" > 标签,并且放在页面底部,用来引入 RequireJS 和 main.js 文件 ...

  9. 如何向非技术人(程序猿)解释SQL注入?

    前两天看博客园新闻,有一篇文章名为<我该如何向非技术人解释SQL注入?>(http://kb.cnblogs.com/page/515151/).是一个外国人写的,伯乐在线翻译的.我当时看 ...

  10. 从头开始 启动开源电商项目jShop

    1. 引言 干了三年C#, 有了转Java 的念想,所以尝试学习一下java web,java语法本身和C#没有太多的差别,所以打算看看开源的java项目,开源的Java项目还是非常非常多的,曾经看了 ...