专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

extends怎么用,Java中extends用法详解

来源:小易整编  作者:小易  发布时间:2023-03-17 03:20
摘要:extends怎么用,Java中extends用法详解一、简介从面向对象编程设计特征中已知:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。在Java之中,如果要实现继承的关系,可以使用如下的语法: c...
extends怎么用,Java中extends用法详解
一、 简介

从面向对象编程设计特征中已知:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

在Java之中,如果要实现继承的关系,可以使用如下的语法:

 class 子类 extends 父类 {}
二、 default类的继承

子类又被称为派生类;父类又被称为超类(Super Class). 来个示例:

 public class Inherit {
     public static void main(String[] args) {
         // 实例化子类 Pupil
         Pupil pupil = new Pupil();
         // 赋值
         pupil.setAge(18);
         pupil.setName("李四");
         // 打印输出
         pupil.show();
     }
 }
  class Human {  // default类
     private String name;
     private int age;
      public void setName(String name) {
         this.name = name;
     }
      public void setAge(int age) {
         this.age = age;
     }
     public void show() {
         System.out.println("name="+name+", age="+age);
     }
 }
  class Pupil extends Human {
     /* 继承Human;不作任何操作
      * 类似Python中的:
      * class A(B):
      *   pass
      */
 }

通过示例可以看出,子类不进行任何操作,而在主类中所使用的全部操作都是由Person类定义的,这证明:子类即使不扩充父类,也能维持父类的操作。这和Python的继承如出一辙!

同样想要扩充父类功能,也很简单:

 public class Inherit {
     public static void main(String[] args) {
         // 实例化子类 Pupil
         Pupil pupil = new Pupil();
         // 赋值
         pupil.setAge(18);
         pupil.setName("李四");
         pupil.setSex("男");
         // 打印输出
         pupil.show();
     }
 }
  class Human {
     private String name;
     private int age;
      public void setName(String name) {
         this.name = name;
     }
      public void setAge(int age) {
         this.age = age;
     }
     public void show() {
         System.out.println("name="+name+", age="+age);
     }
 }
  class Pupil extends Human {
     private String sex;
      public void setSex(String _sex) {
         this.sex = _sex;
         System.out.println("sex="+ sex);
     }
  }

不同于Python的继承,Java中一个子类只能够继承一个父类,存在单继承局限【即:Java之中只允许多层继承,不允许多重继承】。

 class A {}
 class B {}
 class C extends A,B {}          // 一个子类继承了两个父类

这种做法也称多重继承,在java语法中是不支持的;但可以换个思路:

 class A {}
 class B extends A {}
 class C extends B {}

相当于B类继承了A类的全部方法,而C类又继承了A和B类的方法,这种操作称为多层继承。

此外,java在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(no  private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。

 public class Inherit {
     public static void main(String[] args) {
         // 实例化子类 Pupil
         Pupil pupil = new Pupil();
         pupil.show();
     }
 }
  class Human {
     private String name;
      public void setName(String name) {
         this.name = name;
     }
      public String getName() {
         return name;
     }
 }
  class Pupil extends Human {
     public void show() {
         // System.out.println("name="+name);  // 直接访问报错: private String name
         setName("张三");  // 通过setter方法赋值"张三"
         System.out.println(getName());  // 通过getter方法获取信息
     }
 }

此时对于A类之中的msg这个私有属性发现无法直接进行访问,但是却发现可以通过setter、getter方法间接的进行操作。

最后在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化。

即:默认情况下,子类会找到父类之中的无参构造方法。

 public class Inherit {
     public static void main(String[] args) {
         // 实例化子类 Pupil
         Pupil pupil = new Pupil();
     }
 }
  class Human {
     private String name;
      Human() {
         System.out.println("=====老子的无参数构造函数=====");
     }
     public void setName(String name) {
         this.name = name;
     }
 }
  class Pupil extends Human {
     Pupil() {
         System.out.println("=====小子的无参数构造函数=====");
     }
 }
 // 输出:
 // =====老子的无构造函数=====
 // =====小子的无构造函数=====

这个时候虽然实例化的是子类对象,但是发现它会默认先执行父类构造,调用父类的无参数构造函数执行,而后再实例化子类对象,调用子类的无参数构造函数。那么,这个时候,对于子类的构造函数而言,就相当于隐含了一个super()的形式:

 class Pupil extends Human {
     Pupil() {
         super();  // 调用父类构造——一般情况下都隐藏了
         System.out.println("=====小子的无构造函数=====");
     }
 }

现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法:

 public class Inherit {
     public static void main(String[] args) {
         // 实例化子类 Pupil
         Pupil pupil = new Pupil();
         pupil.show();
     }
 }
  class Human {
     private String name;
      Human(String name) {
         this.name = name;
     }
     public void show() {
         System.out.println(name);
     }
 }
  class Pupil extends Human {
     Pupil() {
         super("张三");  // 调用父类构造
     }
 }

也就是说:在任何的情况下,子类都逃不出父类构造的调用,且使用super调用父类构造时,一定要放在构造方法的首行上。

三、 public类的继承
 public class PublicInherit {
     String name = "public";
     static int age = 18;
 }
    class subPublic extends PublicInherit {
     subPublic(){
         System.out.println(name);
         System.out.println(age);
     }
 }
  class Run {
     public static void main(String[] args) {
         subPublic sub = new subPublic();
     }
 }

运行后发现和default一致,不再赘述

四、 final类的继承

extends怎么用,Java中extends用法详解

可以看到,final 类不能被继承,也就没有类能够继承 final 类的任何特性

五、 abstract类的继承
 abstract class Person {        //抽象类,注意不能同时被 abstract 和 final 修饰
     String name = "法外狂徒";
  }
  class Human extends Person{
     Human(){
         System.out.println(name);
     }
 }
   class AbstractInherit{
     public static void main(String[] args) {
         Human hum = new Human();
     }
 }

运行后发现和default一致,能够被继承

总结
  • 在类的声明中,通过关键字extends来创建一个类的子类

  • extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法

  • extends不能继承final类,且只允许多层继承,不允许多重继承

  • 在继承时,private属性或方法不会涉及到重载和覆写问题

  • 在进行覆写时,若父类的方法使用了default权限定义,那么子类定义(覆写)该方法时只能使用public或default定义;若父类的方法使用了public权限定义,那么子类定义(覆写)该方法时只能使用public定义


本文地址:百科问答频道 https://www.neebe.cn/wenda/930656.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • 用java开发的游戏有哪些 java架构开发的游戏推荐2023

    用java开发的游戏有哪些 java架构开发的游戏推荐2023

    java是一种非常实用的计算机语言,正因如此也把它使用在了游戏设计中,那么用java开发的游戏有哪些呢?本期小编就将带各位小伙伴了解一下相关的内容,这项有用的技术被应用到各种不同种类的游戏制作和设计中,增加了游戏的体验感,这些游戏都具有自己...

  • 如何安装java,java安装教程

    如何安装java,java安装教程

    如何安装java,java安装教程一·下载JAVA安装包并安装1.首先去官网下载JAVA安装包,JAVA安装包下载地址:https://www.oracle点com/technetwork/java/javase/downloads/ind...

  • classpath环境变量作用,Java环境变量classpath的作用

    classpath环境变量作用,Java环境变量classpath的作用

    classpath环境变量作用,Java环境变量classpath的作用环境变量环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操...

  • 如何数组合并,JavaScript合并数组的三种方法

    如何数组合并,JavaScript合并数组的三种方法

    如何数组合并,JavaScript合并数组的三种方法数组作为一种数据结构,表示索引项的有序集合。经常会使用到数组,尤其是将多个数组进行合并,比如将数组[1,2,3]和数组[4,5,6]合并,最终得到数组[1,2,3,4,5,6]。数组的合并...

  • 怎么解析xml文件,java解析xml文件的几种方式

    怎么解析xml文件,java解析xml文件的几种方式

    怎么解析xml文件,java解析xml文件的几种方式一、为什么使用xml文件便于不同应用程序之间通信。便于不同平台之间通信。便于不同平台之间数据共享。二、读取xml的方式xml测试文件内容如下:

  • 回到顶部如何实现,JavaScript实现回到顶部功能的五种方法

    回到顶部如何实现,JavaScript实现回到顶部功能的五种方法

    回到顶部如何实现,JavaScript实现回到顶部功能的五种方法回到顶部的功能现在基本上是网页的标配了,当你已经浏览到页面底部时,一键返回顶部的功能确实非常方便。随着用户习惯的养成,这个功能都是页面必备的。那么作为一个前端开发者,我们如何实...

  • java虚拟机是什么,深入理解java虚拟机

    java虚拟机是什么,深入理解java虚拟机

    java虚拟机是什么,深入理解java虚拟机文章目录一、Java虚拟机是什么二、为什么需要了解Java虚拟机三、JavaJDK的迭代历史四、Java虚拟机发展史与种类五、Java虚拟机规范六、Java虚拟机语言无关性七、Java虚拟机的组成...

  • java入门基础知识,java入门教程【0基础自学】

    java入门基础知识,java入门教程【0基础自学】

    java入门基础知识,java入门教程源代码组织方式Java程序由package+class组成,package对应目录的相对路径,class对应文件,如E:\Workspaces\MyEclipse10\JavaStudy\src\com...

  • 周排行
  • 月排行
  • 年排行

精彩推荐