了解this()和(super)在java构造函数链接中的用法

Java中的构造函数链接只是一个构造函数通过继承调用另一个构造函数的行为。当构造子类时会隐式地发生这种情况:它的第一个任务是调用其父类的构造函数方法。但是程序员也可以使用关键字this()或super()显式调用另一个构造函数。this()关键字调用同一类中的另一个重载构造函数;super()关键字调用超类中的非默认构造函数。...

Java中的构造函数链接只是一个构造函数通过继承调用另一个构造函数的行为。当构造子类时会隐式地发生这种情况:它的第一个任务是调用其父类的构造函数方法。但是程序员也可以使用关键字this()或super()显式调用另一个构造函数。this()关键字调用同一类中的另一个重载构造函数;super()关键字调用超类中的非默认构造函数。

javascript code

隐式构造函数链接

构造函数链接是通过使用继承来实现的。子类构造函数方法的第一个任务是调用其超类的构造函数方法。这确保了子类对象的创建从继承链中它上面的类的初始化开始。

继承链中可以有任意数量的类。每个构造函数方法都会调用链,直到到达并初始化顶部的类为止。然后,当链向下卷绕到原始子类时,初始化下面的每个后续类。这个过程称为构造函数链接。

请注意:

  • 这个对超类的隐式调用与子类包含super()关键字相同,即super()在这里是隐式的。
  • 如果类中不包含无参数构造函数,Java会在幕后创建一个构造函数并调用它。这意味着,如果您的唯一构造函数接受一个参数,则必须显式使用This()或super()关键字来调用它(见下文)。

考虑哺乳动物的这种超类动物:

class Animal {// constructorAnimal(){ System.out.println("We're in class Animal's constructor.");}} class Mammal extends Animal {//constructorMammal(){ System.out.println("We're in class Mammal 's constructor.");}}

现在,让我们实例化类哺乳动物:

public class ChainingConstructors { /*** @param args*/public static void main(String[] args) {Mammal m = new Mammal();}}

当上述程序运行时,Java隐式地触发对超类Animal构造函数的调用,然后调用类的构造函数。因此,输出将为:

We're in class Animal's constructorWe're in class Mammal's constructor

使用this()或super()的显式构造函数链接

显式使用this()或super()关键字可以调用非默认构造函数。

  • 要从同一类中调用非args默认构造函数或重载构造函数,请使用this()关键字。
  • 要从子类调用非默认超类构造函数,请使用super()关键字。例如,如果超类有多个构造函数,子类可能总是希望调用特定的构造函数,而不是默认的构造函数。

请注意,对另一个构造函数的调用必须是构造函数中的第一条语句,否则Java将抛出编译错误。

考虑下面的代码,其中一个新的子类,食肉类,继承自哺乳动物类继承的动物类,并且每个类现在都有一个构造函数来接受一个参数。

这是超类动物:

public class Animalprivate String name;public Animal(String name) // constructor with an argument{this.name = name;System.out.println("I'm executed first.");}}Note that the constructor now takes a name of type String as a parameter and that the body of the class calls this() on the constructor. Without the explicit use of this.name

Here's the subclass Mammal:

public class Mammal extends Animal {public Mammal(String name){super(name);System.out.println("I'm executed second");}}

Its constructor also takes an argument, and it uses super(name) to invoke a specific constructor in its superclass.

Here's another subclass Carnivore. This inherits from Mammal: 

public class Carnivore extends Mammal{public Carnivore(String name){super(name);System.out.println("I'm executed last");}}

When run, these three code blocks would print:

I'm executed first.I'm executed second.I'm executed last.

To recap: When an instance of the Carnivore class is created, the first action of its constructor method is to call the Mammal constructor method. Likewise, the first action of the Mammal constructor method is to call the Animal constructor method. A chain of constructor method calls ensure that the instance of the Carnivore object has properly initialized all the classes in its inheritance chain.

  • 发表于 2021-09-27 07:29
  • 阅读 ( 328 )
  • 分类:编程

你可能感兴趣的文章

这(this)和超级java(super in java)的区别

...变量。类变量由所有对象共享。id和名称将传递给Employee构造函数。如果程序员写id=id;它不会初始化实例变量,因为构造函数已经有id和名称。实例变量没有值。因此,打印它们将显示空值。当使用它时,它引用当前对象。因此...

  • 发布于 2020-10-19 18:17
  • 阅读 ( 378 )

什么是es6以及javascript程序员需要知道什么

...如上面描述的常量)所声明的变量遵循块范围规则(为了了解更多,请参见如何在JavaScript中声明变量)。 ...

  • 发布于 2021-03-12 16:38
  • 阅读 ( 236 )

入门时应学习的10个核心java概念

...要介绍,您现在应该对Java世界中使用的术语有了很好的了解,并为进一步的Java培训做好了准备。 ...

  • 发布于 2021-03-13 05:33
  • 阅读 ( 236 )

面向对象编程中抽象的初学者指南

...需要遵循同样的规则。您可以从抽象类的TypeScript文档中了解更多信息。 ...

  • 发布于 2021-03-30 04:01
  • 阅读 ( 251 )

如何用继承来组织面向对象的代码

...的面向对象设计,比如多态性。您可以从TypeScript文档中了解有关继承的更多信息。 ...

  • 发布于 2021-03-30 04:50
  • 阅读 ( 226 )

建造师(constructor)和析构函数(destructor)的区别

...据或变量称为实例变量。 什么是建造师(a c***tructor)? 构造函数是类的特殊成员函数,在创建对象实例时调用它。有时很难在每次创建实例时初始化类中的所有变量。由于初始化需求在面向对象编程中很常见,因此它允许对象...

  • 发布于 2021-06-25 08:36
  • 阅读 ( 259 )

建造师(constructor)和方法(method)的区别

...据的代码。它更像是一个作用于数据并返回值的子程序。构造函数与方法非常相似,只是在创建对象实例时调用它。本文解释了两者的区别。 什么是java中的一种方法(a method in java)? 方法只不过是一组代码,这些代码按名称命...

  • 发布于 2021-06-25 08:37
  • 阅读 ( 427 )

建造师(constructor)和方法(method)的区别

构造函数和方法之间的主要区别在于,构造函数是类中的一个特殊方法,用于初始化该类的对象,而方法是执行与类关联的一组指令的过程或函数。 大多数高级编程语言都支持面向对象编程(OOP),这是一种允许程序员在计算...

  • 发布于 2021-07-01 05:24
  • 阅读 ( 242 )

违约(default)和参数化构造函数(parameterized constructor)的区别

默认构造函数是一种在程序员没有在程序中定义任何构造函数时自动调用的构造函数。相反,参数化构造函数是程序员通过传递参数给类中的实例变量初始值而定义的一种构造函数。这就是默认构造函数和参数化构造函数的主要...

  • 发布于 2021-07-01 05:25
  • 阅读 ( 671 )

文件读取器(filereader)和java中的bufferedreader(bufferedreader in java)的区别

...这有助于关闭FileReader对象。 此外,有两种方法可以编写构造函数。 FileReader(字符串文件)–程序员将文件作为字符串传递。它以读取模式打开文件,如果文件不可用,则抛出FileNotFoundException。 FileReader(文件)–程序员传递文...

  • 发布于 2021-07-01 12:28
  • 阅读 ( 256 )
菇凉败给闺蜜
菇凉败给闺蜜

0 篇文章

相关推荐