专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

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定义


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


IT百科
小编:小易整编
相关文章相关阅读
  • 什么是构造函数?详解JavaScript中的构造函数

    什么是构造函数?详解JavaScript中的构造函数

    作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下javascript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!一个普通的函数被用...

  • Java 中的各种锁有哪些?

    Java 中的各种锁有哪些?

      Java中15种锁的介绍  在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:  公平锁/非公平锁  可重入锁/不可重入锁  独享锁/共享锁  互斥锁/读写锁  乐观锁...

  • Java中的Scanner操作详解

    Java中的Scanner操作详解

    scanner是java中的一个常用类,用来读取控制台或文件中的输入数据。它提供了一种简单的方式来解析基本类型和字符串,并支持对正则表达式进行匹配。Scanner类位于java.util包中,因此在编写程序时需要import...

  • java8新特性有哪些

    java8新特性有哪些

    java8新特性有:1、lambda表达式;2、方法引用;3、默认方法;4、新编译工具;5、streamapi;6、datetimeapi;7、option;8、nashornjavascript引擎。Java8新增了非常多的特性...

  • java中tostring方法的作用是什么

    java中tostring方法的作用是什么

    java中tostring方法的作用是会返回一个【以文本方式表示】此对象的字符串,结果是一个简明但易于读懂的信息表达式。java中tostring方法的作用是toString方法会返回一个“以文本方式表示”此对象的字符串。结果是一个简明但易...

  • Javascript如何使网页跳转

    Javascript如何使网页跳转

    方法:1、使用_window.location.href方式;2、使用window.history.back方式;3、使用window.navigate方式;4、使用self.location方式;5、使用top.location方式。本教...

  • java异步是什么意思

    java异步是什么意思

    本篇文章将对java异步进行介绍,希望对大家有所帮助。异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。也就是说无论异步方法执行代码需要多长时间,跟主线程没有任何影响,主线程可以继续向下执行。...

  • 比较流行的Java工作流框架:5个最佳选项

    比较流行的Java工作流框架:5个最佳选项

    选择合适的Java工作流框架:比较常用的5个选择简介:在现代软件开发中,工作流程的管理是一个至关重要的方面。Java工作流框架是一种专门用于定义和执行工作流程的软件工具。它们可以帮助开发人员简化工作流程的开发和管理,提高效率和可靠性。本文将...

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

精彩推荐