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

 更新时间:2015年09月26日 18:15:20   投稿:goldensun  
这篇文章主要介绍了Java的super关键字与instanceof运算符使用方法,是Java入门学习中的基础知识,需要的朋友可以参考下

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。

相关文章

  • java代码实现C盘文件统计工具

    java代码实现C盘文件统计工具

    今天周末,给大家分享基于java代码实现C盘文件统计工具,在这小编使用的版本是Maven-3.9.9,jdk1.8,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • Java 实现订单未支付超时自动取消功能(京东商城为例)

    Java 实现订单未支付超时自动取消功能(京东商城为例)

    本文以京东网上商城为例,给大家介绍商品在下单后没有支付的情况下,超时自动取消功能,超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能,感兴趣的朋友一起看看吧
    2022-01-01
  • Java多态成员访问的特点是什么?

    Java多态成员访问的特点是什么?

    在上一篇文章中介绍了方法重载和方法重写的区别,但是在多态情况下发现程序的执行结果和我们预期的不太一样,这篇将继续介绍多态场景下,Java成员访问的特点,需要的朋友可以参考下
    2021-06-06
  • 解析Java编程中设计模式的开闭原则的运用

    解析Java编程中设计模式的开闭原则的运用

    这篇文章主要介绍了解析Java编程中设计模式的开闭原则的运用,开闭原则多应用于Java程序的扩展开发方面,需要的朋友可以参考下
    2016-02-02
  • SpringBoot如何实现一个实时更新的进度条的示例代码

    SpringBoot如何实现一个实时更新的进度条的示例代码

    本文详细的介绍了SpringBoot如何实现一个实时更新的进度条,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java中几种常用加密算法盘点

    Java中几种常用加密算法盘点

    随着互联网的发展,信息安全问题日益受到重视,加密算法在保证信息安全传输方面发挥着重要作用,本文将简要盘点几种常用的Java加密算法,介绍它们的基本原理、特点及应用情况,以帮助读者全面了解当前加密算法的发展状况,需要的朋友可以参考下
    2023-11-11
  • java.lang.String和java.util.NClob互相转换方式

    java.lang.String和java.util.NClob互相转换方式

    这篇文章主要介绍了java.lang.String和java.util.NClob互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java实现支付宝退款功能

    java实现支付宝退款功能

    这篇文章主要为大家详细 介绍了java实现支付宝退款功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • protobuf与json转换小结

    protobuf与json转换小结

    protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换
    2017-07-07
  • SpringBoot之瘦身部署问题

    SpringBoot之瘦身部署问题

    这篇文章主要介绍了SpringBoot之瘦身部署问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论