Java的super关键字与instanceof运算符使用方法

Java super关键字
super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类。

super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法。super 也可以用在子类的子类中,Java 能自动向上层类追溯。

父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。

super 关键字的功能:
调用父类中声明为 private 的变量。
点取已经覆盖了的方法。
作为方法名表示父类构造方法。
调用隐藏变量和被覆盖的方法

public class Demo{
  public static void main(String[] args) {
    Dog obj = new Dog();
    obj.move();
  }
}
class Animal{
  private String desc = "Animals are human's good friends";
  // 必须要声明一个 getter 方法
  public String getDesc() { return desc; }
  public void move(){
    System.out.println("Animals can move");
  }
}
class Dog extends Animal{
  public void move(){
    super.move(); // 调用父类的方法
    System.out.println("Dogs can walk and run");
    // 通过 getter 方法调用父类隐藏变量
    System.out.println("Please remember: " + super.getDesc());
  }
}

运行结果:

Animals can move
Dogs can walk and run
Please remember: Animals are human's good friends

move() 方法也可以定义在某些祖先类中,比如父类的父类,Java 具有追溯性,会一直向上找,直到找到该方法为止。

通过 super 调用父类的隐藏变量,必须要在父类中声明 getter 方法,因为声明为 private 的数据成员对子类是不可见的。
调用父类的构造方法

在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用 super 来显示调用父类的构造方法。

public class Demo{
  public static void main(String[] args) {
    Dog obj = new Dog("花花", 3);
    obj.say();
  }
}
class Animal{
  String name;
  public Animal(String name){
    this.name = name;
  }
}
class Dog extends Animal{
  int age;
  public Dog(String name, int age){
    super(name);
    this.age = age;
  }
  public void say(){
    System.out.println("我是一只可爱的小狗,我的名字叫" + name + ",我" + age + "岁了");
  }
}

运行结果:
我是一只可爱的小狗,我的名字叫花花,我3岁了

注意:无论是 super() 还是 this(),都必须放在构造方法的第一行。

值得注意的是:
在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
不能在构造方法以外的任何方法内调用构造方法。
在一个构造方法内只能调用一个构造方法。

如果编写一个构造方法,既没有调用 super() 也没有调用 this(),编译器会自动插入一个调用到父类构造方法中,而且不带参数。

最后注意 super 与 this 的区别:super 不是一个对象的引用,不能将 super 赋值给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字。

Java instanceof 运算符
多态性带来了一个问题,就是如何判断一个变量所实际引用的对象的类型 。 C++使用runtime-type information(RTTI),Java 使用 instanceof 操作符。

instanceof 运算符用来判断一个变量所引用的对象的实际类型,注意是它引用的对象的类型,不是变量的类型。请看下面的代码:

public final class Demo{
  public static void main(String[] args) {
    // 引用 People 类的实例
    People obj = new People();
    if(obj instanceof Object){
      System.out.println("我是一个对象");
    }
    if(obj instanceof People){
      System.out.println("我是人类");
    }
    if(obj instanceof Teacher){
      System.out.println("我是一名教师");
    }
    if(obj instanceof President){
      System.out.println("我是校长");
    }
    System.out.println("-----------"); // 分界线

    // 引用 Teacher 类的实例
    obj = new Teacher();
    if(obj instanceof Object){
      System.out.println("我是一个对象");
    }
    if(obj instanceof People){
      System.out.println("我是人类");
    }
    if(obj instanceof Teacher){
      System.out.println("我是一名教师");
    }
    if(obj instanceof President){
      System.out.println("我是校长");
    }
  }
}
class People{ }
class Teacher extends People{ }
class President extends Teacher{ }

运行结果:

我是一个对象
我是人类
-----------
我是一个对象
我是人类
我是一名教师

可以看出,如果变量引用的是当前类或它的子类的实例,instanceof 返回 true,否则返回 false。

(0)

相关推荐

  • 解析java中super的用法分析

    昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识.还是把它写下来,为大家更好的认识提供一点思路.1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量:2)在一个构造函数中调用另外一个构造函数的时候应该用的是同一块内存空间,在默认的构造函数中先初始化变量,调用另一个的时候覆写已经初始化的变量的值:3)整个调用的过程和递归调用函数有点类似,不断充气球,直

  • 举例讲解Java编程中this关键字与super关键字的用法

    this 总要有个事物来代表类的当前对象,就像C++中的this指针一样,Java中的this关键字就是代表当前对象的引用. 它有三个主要的作用: 1.在构造方法中调用其他构造方法.       比如有一个Student类,有三个构造函数,某一个构造函数中调用另外构造函数,就要用到this(),而直接使用Student()是不可以的. 2.返回当前对象的引用. 3.区分成员变量名和参数名. 看下面的例子: public class Student { private String name; p

  • 详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. getClass()是java中Object类的一个方法,其原型为: public final Class<?> getClass() 返回值为 当前运行时类的Class对象. 所以写了一段代码来说明: getClass()不受this和super影响,而是有当前的运行类决定的. 代码如下: 父类

  • Android中比较常见的Java super关键字

    super在android中比较常见,没有java基础也并不理解,所以空出时间学习了一下. 在Java类中使用super来引用基类的成分,比较简单,示例如下: class FatherClass{ public int value; public void f(){ value=100; System.out.println ("FatherClass.value:"+value); } } class ChildClass extends FatherClass{ public in

  • 详解Java编程中super关键字的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的. 好了,现在开始讨论this&super这两个关键字的意义和用法.在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当

  • java之super关键字用法实例解析

    本文实例讲述了java中super关键字的用法.分享给大家供大家参考.具体方法分析如下: super关键字:在java中使用super来引用基类的成分. 程序代码如下: class FatherClass{ public int value; public void f(){ value = 100; System.out.println("FatherClass.value:"+value); } } class ChildClass extends FatherClass{ pri

  • java this super使用方法详解

    super是Java语言的保留字,用来指向类的超类. 假设在Teacher类中定义了一个类变量boolean gender; 在子类的方法中gender就应该是指子类的gender变量,如果要引用超类的gender变量的话就必须使用 super.genderthis对象在类的构造方法中,要给对象的域进行初始化,这时如果参数和类变量同名,则类变量的名字将会被参数名屏蔽, 必须知道当前的对象名称,才能用对象名引用对象的域 复制代码 代码如下: public DotLoc(double XX,doub

  • Java的super关键字与instanceof运算符使用方法

    Java super关键字 super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类. super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法.super 也可以用在子类的子类中,Java 能自动向上层类追溯. 父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯. super 关键字的功能: 调用父类中声明为 private 的变量. 点取已经覆盖了的方法. 作为方法名表示父类构造方法. 调用隐藏变

  • 详解怎么用Java的super关键字

    Java的super关键字 当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法.为了解决这个问题,在Java中专门提供了一个super关键字来访问父类的成员,例如访问父类的成员变量.成员方法和构造方法.下面分两种情况来学习一下super关键字的具体用法. (1)使用super关键字调用父类的成员变量和成员方法,具体格式如下: super.成员变量 super.成员方法([参数1,参数2...]) 接下来通过一个案例来学习如何使用super关键字调用父类的成员变量和成员方法,如文件1所

  • Java中super关键字的用法和细节

    目录 前言 1. super关键字的用法 2. super关键字的使用细节 3. super和this关键字的比较 总结 前言     因为西安疫情的原因在宿舍摆了一个月,最近在复习前面学过的知识的时候发现,自己在初学面向对象时对Super关键字的理解不够深刻,所以现在重新学习一下super关键字的用法和细节. 1. super关键字的用法     在Java中,super关键字共有三种用法,分别是: 通过 super.属性名 来访问父类中的成员变量 通过super.方法名(参数列表) 来访问父

  • Java中super关键字介绍以及super()的使用

    目录 1.super的使用: 2.先复习一下this关键字的使用. 3.super关键字: 总结: 1.super的使用: (1)super是一个关键字. (2)super和this很类似,我们对比着学习. 2.先复习一下this关键字的使用. (1)this能出现在实例方法和构造方法中: (2)this的语法是“this.”和“this()”: (3)this不能出现在静态方法中: (4)this大部分情况下是可以省略的: (5)this.什么时候不能省略呢? 在区分局部变量和实例变量时不能省

  • Java中super关键字详解

    目录 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 总结 super有什么用? (1)当子类中构造方法第一行没有super时,会默认第一行有一个super(),它的作用是调用父类的无参构造. 例: class A{ public A(){ System.out.println("父类构造方法执行!"); } } public class superTest extends A{ public superTest

  • Java基础之super关键字浅析

    目录 一.定义 二.应用 2.1    应用范围 2.2    用法 2.2.1    在子类中调用父类的属性或方法 2.2.2    在子类中指代父类构造器 附:super实际使用示例 总结 本文重点介绍super关键字,在Java中的作用以及用法. 一.定义 它是一个指代变量,用于在子类中指代父类对象. 二.应用 2.1    应用范围 只能用于子类的构造函数和实例方法中,不能用于子类的类(静态)方法中.原因是super指代的是一个父类的对象,它需要在运行时被创建,而静态方法是类方法,它是类

  • Java中this和super关键字的使用详解

    目录 父类空间优先于子类对象产生 super和this的含义 super和this的用法 继承的特点 父类空间优先于子类对象产生 在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身.目的在于子类对象中包含了其对应的父类空间,便可以包含其父类的成员,如果父类成员非private修饰,则子类可以随意使用父类成员.代码体现在子类的构造方法调用时,一定先调用父类的构造方法.理解图解如下: super和this的含义 super :代表父类的存储空间标识(可以理解为父亲的引用). this :代

  • Java关键字之instanceof详解

    目录 1.obj 必须为引用类型,不能是基本类型 2.obj 为 null 3.obj 为 class 类的实例对象 4.obj 为 class 接口的实现类 5.obj 为 class 类的直接或间接子类 6.问题 7.深究原理 8.instanceof 的实现策略 instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为: boolean result = obj instanceof Class 其中 obj 为一个对象,Class 表示一个类

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

    构造方法中的super关键字 在Java子类的构造方法中可以通过super关键字来调用父类的构造方法.其用法为: 1) super(); 访问父类中的无参构造函数 2) super (paras-); 访问父类中的成员函数yyy super()来调用父类无参的构造方法,但即使不使用super(),默认也会调用父类无参的构造方法.父类无参的构造方法可以是自定义的无参构造方法,也可以是编译器自动生成的默认构造方法.但如果父类中定义了有参的构造方法,但没有定义无参的构造方法,这时编译器不会生成默认构造

随机推荐