纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

传智教育集团   2021-06-06 我要评论
想了解详解怎么用Java的super关键字的相关内容吗传智教育集团在本文为您仔细讲解Java的super关键字的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java的super关键字,java关键字下面大家一起来学习吧

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所示

1621324565451_11.jpg

图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所示

super关键字

图2 运行结果

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

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

super关键字

图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所示

super关键字

图4 运行结果

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


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式