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

作者:goldensun 时间:2022-02-18 10:02:22 

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
0
投稿

猜你喜欢

  • Java中ReentrantLock4种常见的坑

    2021-09-26 10:51:46
  • 如何创建SpringBoot项目

    2022-03-26 16:06:37
  • java使用influxDB数据库的详细代码

    2023-03-04 05:22:27
  • Spring Boot静态资源路径的配置与修改详解

    2022-09-15 19:27:08
  • 使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    2023-11-12 19:25:55
  • 详解java中BigDecimal精度问题

    2021-08-17 10:24:59
  • SpringDataJpa如何使用union多表分页条件查询

    2023-05-16 04:28:49
  • C语言中求字符串长度的函数的几种实现方法

    2023-07-04 23:29:05
  • 详解IDEA多module项目maven依赖的一些说明

    2023-07-21 06:09:05
  • Java maven三种仓库,本地仓库,私服,中央仓库的配置

    2023-04-13 12:05:17
  • Java Benchmark 基准测试的实例详解

    2023-10-08 11:01:02
  • Java并发之嵌套管程锁死详解

    2023-01-13 10:55:01
  • Mybatis使用JSONObject接收数据库查询的方法

    2023-01-17 05:10:43
  • SpringBoot的@Value给静态变量注入application.properties属性值

    2023-09-20 11:54:07
  • Mybatis中的常用OGNL表达式

    2023-09-29 10:48:33
  • spring cloud整合ribbon问题及解决方案

    2023-07-25 04:24:49
  • 新手小心:c语言中强符号与弱符号的使用

    2023-06-24 15:16:23
  • javax.persistence中@Column定义字段类型方式

    2021-12-03 21:21:44
  • IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解

    2021-10-12 08:18:31
  • Java 非阻塞I/O使用方法

    2022-01-01 22:54:57
  • asp之家 软件编程 m.aspxhome.com