详解怎么用Java的super关键字

Java的super关键字

当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法。为了解决这个问题,在Java中专门提供了一个super关键字来访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。下面分两种情况来学习一下super关键字的具体用法。

(1)使用super关键字调用父类的成员变量和成员方法,具体格式如下:

super.成员变量
super.成员方法([参数1,参数2...])

接下来通过一个案例来学习如何使用super关键字调用父类的成员变量和成员方法,如文件1所示。
文件1 Example03.java

// 定义Animal类
     class Animal {
         String name = "动物";
          // 定义动物叫的方法
         void shout() {
             System.out.println("动物发出叫声");
         }
     }
     // 定义Dog类继承动物类
     class Dog extends Animal {
         String name = "犬类";
          // 重写父类的shout()方法
          void shout() {
             super.shout();    // 访问父类的成员方法
         }
          // 定义打印name的方法
         void printName() {
             System.out.println("name=" + super.name);// 访问父类的成员变量
         }
     }
     // 定义测试类
     public class Example03{
         public static void main(String[] args) {
             Dog dog = new Dog();  // 创建一个dog对象
             dog.shout();           // 调用dog对象重写的shout()方法
             dog.printName();      // 调用dog对象的的printName()方法
         }
     }

运行结果如图1所示。

图1 运行结果

文件1中,定义了一个Dog类继承Animal类,重写了Animal类的shout()方法并重新定义了子类的name属性。在子类Dog的shout()方法中使用“super.shout()”调用了父类被重写的方法,在printName()方法中使用“super.name”访问父类的成员变量。从运行结果可以看出,子类通过super关键字成功地访问了父类成员变量和成员方法。

(2)使用super关键字调用父类的构造方法,具体格式如下:

super([参数1,参数2...])

接下来就通过一个案例来学习,如何使用super关键字来调用父类的构造方法,如文件2所示。

文件2 Example04.java

// 定义Animal类
 class Animal {
     // 定义Animal类有参的构造方法
     public Animal(String name) {
         System.out.println("我是一只" + name);
     }
 }
 // 定义Dog类继承Animal类
 class Dog extends Animal {
     public Dog() {
         super("沙皮狗");          // 调用父类有参的构造方法
     }
 }
 // 定义测试类
 public class Example04 {
     public static void main(String[] args) {
         Dog dog = new Dog();   // 创建Dog类的实例对象
     }
 }

运行结果如图2所示。

图2 运行结果

根据前面所学的知识,文件1中在创建Dog类对象时一定会调用Dog类的构造方法,从运行结果可以看出,Dog类的构造方法被调用时,执行了内部的super(“沙皮狗”)方法,从而调用了父类的有参构造方法。需要注意的是,通过super调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次,否则程序在编译期间就会报错。

将文件1第11行代码进行注释,程序就会出现编译错误,如图3所示。

图3 运行结果

从图3可以看出,程序编译出现错误,显示“Implicit super constructor Animal() is undefined. Must explicitly invoke another constructor(未定义隐式无参构造方法,必须显示的调用另一个构造方法)”的错误。出错的原因是,在子类的构造方法中一定会调用父类的某个构造方法。这时可以在子类的构造方法中通过super关键字指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时,会默认调用父类无参的构造方法,而在文件2中,父类Animal中只定义了有参构造方法,未定义无参构造方法,所以在子类默认调用父类无参构造方法时就会出错。

为了解决上述程序的编译错误,可以在子类中显示地调用父类中已有的构造方法,或者在父类中定义无参的构造方法。现将文件2中的Animal类进行修改,在父类中添加无参构造方法来解决上述编译错误,如文件3所示。

文件3 Example05.java

 // 定义Animal类
    class Animal {
          // 定义Animal无参的构造方法
         public Animal() {
             System.out.println("我是一只动物");
         }
          // 定义Animal有参的构造方法
         public Animal(String name) {
             System.out.println("我是一只" + name);
         }
     }
     // 定义Dog类,继承自Animal类
     class Dog extends Animal {
          // 定义Dog类无参的构造方法
         public Dog() {
         }
     }
     // 定义测试类
     public class Example05 {
         public static void main(String[] args) {
             Dog dog = new Dog(); // 创建Dog类的实例对象
         }
     }

运行结果如图4所示。

图4 运行结果

从图4可以看出,子类在实例化时默认调用了父类无参的构造方法。通过这个案例还可以得出一个结论:在定义一个类时,如果没有特殊需求,当定义了有参构造方法后,尽量在类中再显示地定义一个无参构造方法,这样可以避免该类被继承时出现错误。

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

(0)

相关推荐

  • Java中的super关键字_动力节点Java学院整理

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用. super关键字测试 package com.bjpowernode.test; /** * 父类 * * */ class FatherClass { public int value

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

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

  • 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关键字实例详解

     java方法重写和super关键字  在继承中,其实就是子类定义了和父类同名的方法 就是方法,属性都是相通的 重写限制:  被子类重写的方法不能拥有比父类方法更加严格的权限 super:强行调用父类方法的执行 重载和重写的区别?  重 载是发生在一个类中   对权限没有要求   而且重载的方法参数可以不同 重写发生在继承汇总      被子类重写的方法不能拥有比父类方法更加严格的权限,重写的方法中参数名字完全相同  实例代码: class A{ public void tell(){ Syst

  • 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关键字的用法

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

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

    构造方法中的super关键字 在Java子类的构造方法中可以通过super关键字来调用父类的构造方法.其用法为: 1) super(); 访问父类中的无参构造函数 2) super (paras-); 访问父类中的成员函数yyy super()来调用父类无参的构造方法,但即使不使用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关键字

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

  • Java关键字详解之final static this super的用法

    目录 1. final 关键字: 2. static 关键字: 3. this 关键字: 4. super 关键字: final,static,this,super 关键字总结 正文开始@Assassin 1. final 关键字: final 关键字,意思是最终的.不可改变的,初始化之后就不能再次修改 ,用来修饰类.方法和变量,具有以下特点: final 修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为 final 方法: final 修饰的方法不能被重写: final 修饰

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

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

  • Java构造方法实例详解(动力节点java学院整理)

    构造函数是一种特殊的函数.其主要功能是用来在创建对象时初始化对象, 即为v对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.构造函数与类名相同,可重载多个不同的构造函数.在JAVA语言中,构造函数与C++语言中的构造函数相同,JAVA语言中普遍称之为构造方法. 使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回值 5.构造器总是伴随

  • 详解springSecurity之java配置篇

    一 前言 本篇是springSecurity知识的入门第二篇,主要内容是如何使用java配置的方式进行配置springSeciruty,然后通过一个简单的示例自定义登陆页面,覆盖原有springSecurity默认的登陆页面:学习这篇的基础是 知识追寻者之前发布 过 的<springSecurity入门篇> 二 java配置 2.1配置账号密码 如下所示, 使用 @EnableWebSecurity 在配置类上开启security配置功能: 在配置类中定义bean 名为 UserDetails

  • 详解如何将JAVA程序制作成可以直接执行的exe文件

    突然心血来潮,想自己做个小程序玩玩,但是怎么把他做成一个exe文件,让大家能够更好的理解和使用呢,百度了一下,说是需要exe4j来生成,但是看了很多关于exe4j将java程序生成exe文件的教程,觉着都不是自己想要的结果,还是自己综合一下,写篇文章记录一下. 下载和安装的步骤我就略过了,直接说重点. 一 : 将写好的java程序打成jar包,如下图: 1: . 2: 3: 4: 5:此处填写MANIFEST.MF文件路径,MANIFEST.MF手动创建后放在下项目路径下即可 MANIFEST.

  • 详解如何把Java中if-else代码重构成高质量代码

    为什么我们写的代码都是if-else? 程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个if-else, 可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断:这里要判断下对象是否为null:不同类型执行不同的流程. 落地到具体实现只能不停地加if-else来处理,渐渐地,代码变得越来越庞大,函数越来越长,文件行数也迅速突破上千行,维护难度也越来越大,到后期基本达到一种难以维护的状态. 虽然我们都很不情愿写出满屏if-else的代码,可逻

  • 详解如何使用java实现Open Addressing

    你好! 我们这里总共向您提供三种open addression的方法,分别为linear probing.quadratic probing和double hashing. Linear Probing Linear probing是计算机程序解决散列表冲突时所采取的一种策略.散列表这种数据结构用于保存键值对,并且能通过给出的键来查找表中对应的值.Linear probing这种策略是在1954年由Gene Amdahl, Elaine M. McGraw,和 Arthur Samuel 所发明

  • 详解如何在Java中调用Python程序

    Java中调用Python程序 1.新建一个Maven工程,导入如下依赖 <dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.0</version> </dependency> 2.在java中直接执行python代码片段 import org.python.util

随机推荐