Java关键字this与super详解用法

目录
  • 一、this 关键字的使用
    • 1. 概述
    • 2. 作用
    • 3. 使用
      • 3.1 修饰属性和方法
      • 3.2 调用构造器
      • 3.3 返回当前对象
  • 二、super关键字的使用
    • 1. 概述
    • 2. 使用
    • 3. 使用
      • 3.1 调用属性和方法
      • 3.2 调用构造器
  • 三、this和super的区别
  • 四、子类对象实例化的全过程

一、this 关键字的使用

1. 概述

this是什么?

在Java中,this关键字比较难理解,它的作用和其词义很接近,表示“当前”的意思。

2. 作用

  • this关键字可以用来修饰、调用:属性、方法、构造器。
  • this关键字只能在方法内部使用。
  • 它在方法内部使用,即这个方法所属对象的引用;
  • 它在构造器内部使用,表示该构造器正在初始化的对象。

3. 使用

什么时候使用this关键字呢?

当在方法内需要用到调用该方法的对象时,就用this。具体的:我们可以用this来区分属性和局部变量。比如:this.name = name;

3.1 修饰属性和方法

  • this理解为:当前对象或当前正在创建的对象
  • 在类的方法中,我们可以使用this.属性this.方法的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略this.。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用this.变量的方式,表明此变量是属性,而非形参。
  • 使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。

代码演示:

class Person{ // 定义Person类
    private String name ;
    private int age ;
    public Person(String name,int age){
      this.name = name ;
      this.age = age ; }
    public void getInfo(){
      System.out.println("姓名:" + name) ;
      this.speak();
    }
    public void speak(){
      System.out.println(“年龄:” + this.age);
    }
}

3.2 调用构造器

  • 在类的构造器中,我们可以使用this.属性this.方法的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略this.。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用this.变量的方式,表明此变量是属性,而非形参。
  • 我们在类的构造器中,可以显式的使用this(形参列表)的方式,调用本类中指定的其它构造器。
  • 构造器中不能通过this(形参列表)方式调用自身的构造器。
  • 如果一个类中有n个构造器,则最多有 n - 1个构造器中使用了this(形参列表)
  • 规定:this(形参列表)必须声明在当前构造器的首行。
  • 构造器内部,最多只能声明一个this(形参列表),用来调用其它的构造器。
  • 除构造器之外,编译器禁止在其它任何方法中调用构造器。

代码演示:

class Person{ // 定义Person类
   private String name ;
   private int age ;
   public Person(){ // 无参构造器
     System.out.println("新对象实例化") ;
   }
   public Person(String name){
     this(); // 调用本类中的无参构造器
     this.name = name ;
   }
   public Person(String name,int age){
     this(name) ; // 调用有一个参数的构造器
     this.age = age;
   }
   public String getInfo(){
     return "姓名:" + name + ",年龄:" + age ;
   }
}

3.3 返回当前对象

代码演示:

public class Leaf {
    int i = 0;
    Leaf increment(){
        i++;
        return this;
    }
    void print(){
        System.out.println("i = "+i);
    }
    public static void main(String args[]){
        Leaf x = new Leaf();
        x.increment().increment().increment().print();//i = 3
    }
}

二、super关键字的使用

1. 概述

(1)super理解为:父类的

(2)在Java类中使用super来调用父类中的指定操作:

  • super可用于访问父类中定义的属性。
  • super可用于调用父类中定义的成员方法。
  • super可用于在子类构造器中调用父类的构造器。
  • 尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员,super的追溯不仅限于直接父类。
  • superthis的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识。

2. 使用

可以在子类中显示地调用父类的结构。

3. 使用

3.1 调用属性和方法

  • 我们可以在子类的方法或构造器中。通过使用"super.属性“或”super.方法“的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略”super."。
  • 当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
  • 当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。

3.2 调用构造器

(1)子类中所有的构造器默认都会访问父类中空参数的构造器。

(2)当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,否则编译出错。同时,只能”二选一”,不能同时出现,且必须放在构造器的首行。

(3)在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)",调用父类中的构造器。

代码演示:

public class Person {
    private String name;
    private int age;
    private Date birthDate;
    public Person(String name, int age, Date d) {
       this.name = name;
       this.age = age;
       this.birthDate = d; }
    public Person(String name, int age) {
       this(name, age, null);
    }
    public Person(String name, Date d) {
       this(name, 30, d);
    }
    public Person(String name) {
       this(name, 30);
    }
}

public class Student extends Person {
    private String school;
    public Student(String name, int age, String s) {
      super(name, age);
      school = s;
    }
    public Student(String name, String s) {
      super(name);
      school = s;
    }
// 编译出错: no super(),系统将调用父类无参数的构造器。
    public Student(String s) {
      school = s;
    }
}

三、this和super的区别

No. 区别点 this super
1 访问属性 访问本类中的属性,如果本类没有此属性则从父类中继续查找 直接访问父类中的属性
2 调用方法 访问本类中的方法,如果本类没有此方法则从父类中继续查找 直接访问父类中的方法
3 调用构造器 调用本类构造器,必须放在构造器的首行 调用父类构造器,必须放在子类构造器的首行

四、子类对象实例化的全过程

(1)从结果上来看:(继承性)

  • 子类继承父类以后,就获取了父类中声明的属性或方法。
  • 创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。

(2)从过程上来看:

当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,…直到调用了java.lang.Object类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用。

(3)明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象。

到此这篇关于Java关键字this与super详解的文章就介绍到这了,更多相关Java this内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java super和this的对比及使用

    Java super和this的对比及使用 super和this的异同 1)super(参数列表):调用父类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数列表):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 2)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名   super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用t

  • Java中超详细this与super的概念和用法

    前言:理论和代码必须结合起来才能真正的掌握 一.this 概念:this代表着当前对象的引用,也是当前函数所属对象的引用.直白的说,哪个对象调用了当前函数,this就代表哪个对象. 常见的用法(理论不理解就先参考下面案例) 最常见的情况是是对象的一个属性或被构造器的参数屏蔽时,如果需要调用屏蔽的属性,this就代表哪个对象 this只能在方法内使用,表示正在调用方法的那个对象,但是,如果在方法内调用同一个类的另一个方法,就不必使用this,直接调用即可,this关键字是能省则省 this和sta

  • 详解Java使用super和this来重载构造方法

    详解Java使用super和this来重载构造方法 实例代码: //父类 class anotherPerson{ String name = ""; String age = ""; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void setName(String name){ this.name = name;

  • 关于java关键字this和super的区别和理解

    this: this理解为:当前对象 或 当前正在创建的对象 可以调用的结构:属性.方法:构造器 this调用属性.方法: 先了解一下形参: 形参的意义就是给属性赋值,我们是要给同名的属性赋值,这时候我们就把形参名和属性的名字写成一样,这样我们就知道我们传入的形参就是要给我们同名的属性去赋值的. 在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法.但是, 通常情况下,我们都择省略"this.".特殊情况

  • Java中super和this的用法详解

    super 用法 super关键字用来访问父类内容,具体用法可分为三种: 1.子类的成员方法访问父类的成员变量 public class Animal { public int age = 10; } class Dog extends Animal { public int age = 5; public void showAge() { System.out.println(super.age); } } 2.子类的成员方法访问父类的成员方法 public class Animal { pu

  • Java 中的 this 和 super 区别

    目录 1.简介 2.引子 2.1 父类中声明无参构造函数 2.2 子类显示的通过super调用父类的有参构造函数 3.this 4.super 5.总结 5.1 对比差异 5.2 相同点 5.3 总结图 1.简介 this与super是类实例化时通往Object类通道的打通者:this和super在程序中由于其经常被隐式的使用而被我们忽略,但是理解其作用和使用规范肯定是必须的.接下来将详述this与super的作用和区别. 2.引子 先来看两段代码,无报错代码示例: package com.li

  • Java关键字this与super详解用法

    目录 一.this 关键字的使用 1. 概述 2. 作用 3. 使用 3.1 修饰属性和方法 3.2 调用构造器 3.3 返回当前对象 二.super关键字的使用 1. 概述 2. 使用 3. 使用 3.1 调用属性和方法 3.2 调用构造器 三.this和super的区别 四.子类对象实例化的全过程 一.this 关键字的使用 1. 概述 this是什么? 在Java中,this关键字比较难理解,它的作用和其词义很接近,表示“当前”的意思. 2. 作用 this关键字可以用来修饰.调用:属性.

  • java关键字static的使用详解

    关键字 static 1. 概述 static 是一种修饰符 static 是Java中表静态的关键字 它可以修饰成员变量.成员方法.代码块 被static修饰的成员变量或成员方法,将不再依赖于对象的创建而去使用,而是依赖类的存在,成为类成员或类方法,是共享的(下面将会详细的解释). 2. static修饰成员变量 2.1 常见的修饰符 public 修饰符 private 修饰符 没有修饰符 static 修饰符(静态修饰符) class Test { // public 修饰符 public

  • java关键字final使用方法详解

    它所表示的是"这部分是无法修改的".不想被改变的原因有两个:效率.设计.使用到final的有三种情况:数据.方法.类. 一. final数据 有时候数据的恒定不变是很有用的,它能够减轻系统运行时的负担.对于这些恒定不变的数据我可以叫做"常量"."常量"主要应用与以下两个地方:1.编译期常量,永远不可改变.2.运行期初始化时,我们希望它不会被改变.对于编译期常量,它在类加载的过程就已经完成了初始化,所以当类加载完成后是不可更改的,编译期可以将它代入

  • java 关键字super详解及用法

    java 关键字super详解 一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用. 1.1.super关键字测试 package cn.galc.test; /** * 父类 * @author gacl * */ class Fathe

  • Java构造方法 super 及自定义异常throw合集详解用法

    1.构造方法: public 类名(){} 区别一下 // public void 方法名(){} 分为有参,无参子类构造方法 public class Zi extends fu{ public int message=35; public Zi(){ System.out.println("我是谁"); }} 创建对象时:就会输出:子类构造方法中内容: 2.super和this使用: public void show(int message) { System.out.printl

  • Java this 关键字的使用方法详解

    Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过this(paras-)来调用其他的构造方法. 使用this来调用其他构造方法有如下几个约束. 1) 只能在构造方法中通过this来调用其他构造方法,普通方法中不能使用. 2) 不能通过this递归调用构造方法,即不能在一个构造方法中通过this直接或间接调

  • java多线程关键字final和static详解

    这篇文章主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 final关键字 1.final关键字在单线程中的特点: 1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次. 2)final修饰的类成员变量,可以在三个地方进行赋值:显示初始化.构造代码块和构造方法,并且仅能赋值一次. 3)final修饰的局部变量,必须在使用之前进行显示初始化(并不一定要在定义是

  • Java类的继承实例详解(动力节点Java学院整理)

    一.你了解类吗? 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在public,则类文件的名称可以为任意的名称(当然以数字开头的名称是不允许的). 在类内部,对于成员变量,如果在定义的时候没有进行显示的赋值初始化,则Java会保证类的每个成员变量都得到恰当的初始化: 1)对于  char.short.byte.int.long.float.double等基本数据类型的

  • Java编程复用类代码详解

    本文研究的主要是Java编程中的复用类,那么到底复用类是什么东西,又有什么用法,下面具体介绍. 看了老罗罗升阳的专访,情不自禁地佩服,很年轻,我之前以为和罗永浩一个级别的年龄,也是见过的不是初高中编程的一位大牛之一,专访之后,发现老罗也是一步一个脚印的人.别说什么难做,做不了,你根本就没去尝试,也没有去坚持. If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but whateve

  • java 深拷贝与浅拷贝机制详解

     java 深拷贝与浅拷贝机制详解 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一)Object中clone方法 如果我们new出一个新对象,用一个声明去引用它,之后又用另一个声明去引用前一个声明,那么最后的结果是:这两个声明的变量将指向同一个对象,一处被改全部被改.如果我们想创建一个对象的copy,这个copy和对象的各种属性完全相同,而且修

随机推荐