精华内容
下载资源
问答
  • Constructor

    千次阅读 2019-03-20 09:15:11
    java.lang.reflect.Constructor 一、Constructor类是什么  Constructor是一个类,位于java.lang.reflect包下。  在Java反射中 Constructor类描述的是 类的构造方法信息,通俗来讲 有一个类如下: 1 package ...

    java.lang.reflect.Constructor

    一、Constructor类是什么
      Constructor是一个类,位于java.lang.reflect包下。
      在Java反射中 Constructor类描述的是 类的构造方法信息,通俗来讲 有一个类如下:

     

     1 package com.testReflect;
     2 public class ConstructorDemo {
     3     private int num;
     4     private String str;
     5     
     6     public ConstructorDemo(){
     7         num = 2;
     8         str = "xixi";
     9     }
    10     
    11     public ConstructorDemo(int num,String str){
    12         this.num = num;
    13         this.str = str;
    14     }
    15 
    16     @Override
    17     public String toString() {
    18         return "ConstructorDemo [num=" + num + ", str=" + str + "]";
    19     }
    20 }

     

      在Java反射中ConstructorDemo类中的构造方法ConstructorDemo()、ConstructorDemo(int num,String str)都是Constructor类的实例,这个Constructor类的实例描述了构造方法的全部信息。(包括:方法修饰符、方法名称、参数列表 等等)

    二、如何获取Constructor类对象
      一共有4种方法,全部都在Class类中:
        - getConstructors():获取类中的公共方法
        - getConstructor(Class[] params): 获取类的特定构造方法,params参数指定构造方法的参数类型
        - getDeclaredConstructors(): 获取类中所有的构造方法(public、protected、default、private)
        - getDeclaredConstructor(Class[] params): 获取类的特定构造方法,params参数指定构造方法的参数类型

    三、Constructor类中常用的方法
      对于构造方法,我们就是用来创建类的实例的,但是在Java反射中需要注意的是:默认构造函数和带参数的构造方法创建实例的区别。

     

     1 package com.testReflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Modifier;
     5 
     6 public class ConstructorTest {
     7     public static void main(String[] args) throws Exception {
     8         //使用反射第一步:获取操作类ConstructorDemo所对应的Class对象
     9         Class<?> cls = Class.forName("com.testReflect.ConstructorDemo");
    10         
    11         //获取默认的构造函数
    12         Constructor constructor1 = cls.getConstructor(new Class[]{});
    13         //获取构造函数信息
    14         System.out.println("修饰符: "+Modifier.toString(constructor1.getModifiers()));
    15         System.out.println("构造函数名: "+constructor1.getName());
    16         System.out.println("参数列表: "+constructor1.getParameterTypes());
    17         //通过默认的构造函数创建ConstructorDemo类的实例
    18         Object obj = constructor1.newInstance();
    19         System.out.println("调用默认构造函数生成实例:"+obj.toString());
    20         
    21         System.out.println("===============================================");
    22         
    23         //获取带参数的构造函数
    24         Constructor constructor2 = cls.getConstructor(new Class[]{int.class,String.class});
    25         System.out.println("修饰符: "+Modifier.toString(constructor2.getModifiers()));
    26         System.out.println("构造函数名: "+constructor2.getName());
    27         System.out.println("参数列表: "+constructor2.getParameterTypes());
    28         //获取构造函数信息
    29         //通过带参数的构造函数创建ConstructorDemo类的实例
    30         Object obj2 = constructor2.newInstance(new Object[]{33,"haha"});
    31         System.out.println("调用带参数构造函数生成实例:"+obj2.toString());
    32     }
    33 }

     

    new Class[]{}就是相当于把他们筹在一起其实可以分开写。 

    展开全文
  •   作为一名前端工程师,必须搞懂JS中的prototype、__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞懂它们。这里说明一点,__...

    提示:不要排斥,静下心来,认真读完,你就搞懂了!(可以先看一下最后的总结部分再回过头来完整看完)

    1. 前言

      作为一名前端工程师,必须搞懂JS中的prototype__proto__constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞懂它们。这里说明一点,__proto__属性的两边是各由两个下划线构成(这里为了方便大家看清,在两下划线之间加入了一个空格:_ _proto_ _,读作“dunder proto”,“double underscore proto”的缩写),实际上,该属性在ES标准定义中的名字应该是[[Prototype]],具体实现是由浏览器代理自己实现,谷歌浏览器的实现就是将[[Prototype]]命名为__proto__,大家清楚这个标准定义与具体实现的区别即可(名字有所差异,功能是一样的),可以通过该方式检测引擎是否支持这个属性:Object.getPrototypeOf({__proto__: null}) === null。本文基于谷歌浏览器(版本 72.0.3626.121)的实验结果所得。
       现在正式开始! 让我们从如下一个简单的例子展开讨论,并配以相关的图帮助理解:

    function Foo() {...};
    let f1 = new Foo();
    

    以上代码表示创建一个构造函数Foo(),并用new关键字实例化该构造函数得到一个实例化对象f1。这里稍微补充一下new操作符将函数作为构造器进行调用时的过程:函数被调用,然后新创建一个对象,并且成了函数的上下文(也就是此时函数内部的this是指向该新创建的对象,这意味着我们可以在构造器函数内部通过this参数初始化值),最后返回该新对象的引用,详细请看:详解JavaScript中的new操作符。虽然是简简单单的两行代码,然而它们背后的关系却是错综复杂的,如下图所示:
    整体的联系看到这图别怕,让我们一步步剖析,彻底搞懂它们!
      图的说明:右下角为图例,红色箭头表示__proto__属性指向、绿色箭头表示prototype属性的指向、棕色实线箭头表示本身具有的constructor属性的指向,棕色虚线箭头表示继承而来的constructor属性的指向;蓝色方块表示对象,浅绿色方块表示函数(这里为了更好看清,Foo()仅代表是函数,并不是指执行函数Foo后得到的结果,图中的其他函数同理)。图的中间部分即为它们之间的联系,图的最左边即为例子代码。

    2. _ _ proto _ _ 属性

      首先,我们需要牢记两点:①__proto__constructor属性是对象所独有的;② prototype属性是函数所独有的。但是由于JS中函数也是一种对象,所以函数也拥有__proto__constructor属性,这点是致使我们产生困惑的很大原因之一。上图有点复杂,我们把它按照属性分别拆开,然后进行分析:
    __proto__
      第一,这里我们仅留下 __proto__ 属性,它是对象所独有的,可以看到__proto__属性都是由一个对象指向一个对象,即指向它们的原型对象(也可以理解为父对象),那么这个属性的作用是什么呢?它的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(可以理解为父对象)里找,如果父对象也不存在这个属性,则继续往父对象的__proto__属性所指向的那个对象(可以理解为爷爷对象)里找,如果还没找到,则继续往上找…直到原型链顶端null(可以理解为原始人。。。),再往上找就相当于在null上取值,会报错(可以理解为,再往上就已经不是“人”的范畴了,找不到了,到此结束,null为原型链的终点),由以上这种通过__proto__属性来连接对象直到null的一条链即为我们所谓的原型链
      其实我们平时调用的字符串方法、数组方法、对象方法、函数方法等都是靠__proto__继承而来的。

    3. prototype属性

      第二,接下来我们看 prototype 属性:
    prototype属性  prototype属性,别忘了一点,就是我们前面提到要牢记的两点中的第二点,它是函数所独有的,它是从一个函数指向一个对象。它的含义是函数的原型对象,也就是这个函数(其实所有函数都可以作为构造函数)所创建的实例的原型对象,由此可知:f1.__proto__ === Foo.prototype,它们两个完全一样。那prototype属性的作用又是什么呢?它的作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法。任何函数在创建的时候,其实会默认同时创建该函数的prototype对象。

    4. constructor属性

      最后,我们来看一下 constructor 属性:
    constructor属性  constructor属性也是对象才拥有的,它是从一个对象指向一个函数,含义就是指向该对象的构造函数,每个对象都有构造函数(本身拥有或继承而来,继承而来的要结合__proto__属性查看会更清楚点,如下图所示),从上图中可以看出Function这个对象比较特殊,它的构造函数就是它自己(因为Function可以看成是一个函数,也可以是一个对象),所有函数和对象最终都是由Function构造函数得来,所以constructor属性的终点就是Function这个函数。
    constructor继承
      感谢网友的指出,这里解释一下上段中“每个对象都有构造函数”这句话。这里的意思是每个对象都可以找到其对应的constructor,因为创建对象的前提是需要有constructor,而这个constructor可能是对象自己本身显式定义的或者通过__proto__在原型链中找到的。而单从constructor这个属性来讲,只有prototype对象才有。每个函数在创建的时候,JS会同时创建一个该函数对应的prototype对象,而函数创建的对象.__proto__ === 该函数.prototype,该函数.prototype.constructor===该函数本身,故通过函数创建的对象即使自己没有constructor属性,它也能通过__proto__找到对应的constructor,所以任何对象最终都可以找到其构造函数(null如果当成对象的话,将null除外)。如下:
    constructor说明

    5. 总结

       总结一下:

    1. 我们需要牢记两点:①__proto__constructor属性是对象所独有的;② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__constructor属性。
    2. __proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链
    3. prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype
    4. constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function

      本文就此结束了,希望对那些对JS中的prototype__proto__constructor属性有困惑的同学有所帮助。

    最后,感谢这两篇博文,本文中的部分内容参考自这两篇博文:

    小彩蛋:实现继承(相对完美、优雅)

    function inherit(Child, Parent) {
         // 继承原型上的属性 
        Child.prototype = Object.create(Parent.prototype)
         // 修复 constructor
        Child.prototype.constructor = Child
        // 存储超类
        Child.super = Parent
        // 静态属性继承
        if (Object.setPrototypeOf) {
            // setPrototypeOf es6
            Object.setPrototypeOf(Child, Parent)
        } else if (Child.__proto__) {
            // __proto__ es6 引入,但是部分浏览器早已支持
            Child.__proto__ = Parent
        } else {
            // 兼容 IE10 等陈旧浏览器
            // 将 Parent 上的静态属性和方法拷贝一份到 Child 上,不会覆盖 Child 上的方法
            for (var k in Parent) {
                if (Parent.hasOwnProperty(k) && !(k in Child)) {
                    Child[k] = Parent[k]
                }
            }
        }
    }
    

    若对你有帮助,可以支持一下作者创作更多好文章哦,一分钱也是爱~
    赞赏码

    展开全文
  • constructor-源码

    2021-04-01 07:13:20
    constructor
  • constructor of solidty

    2021-01-07 17:54:39
    constructor of solidty 刚接触不久,小白一个,所言皆个人想法,若有错误,还请指正 constructor不是广义的函数定义,不能用constructor代替function构建函数 在敲代码时有人说 现在的solidity不在用function, 而...
  • 对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)
  • es6 constructor 方法

    千次阅读 2018-01-31 18:11:03
    constructor 方法 constructor()方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor()方法,如果没有显式定义,一个空的constructor()方法会被默认添加。 class Point {}...

    constructor 方法

    constructor()方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor()方法,如果没有显式定义,一个空的constructor()方法会被默认添加。

     
    1. class Point {
    2. }
    3. // 等同于
    4. class Point {
    5. constructor() {}
    6. }

    上面代码中,定义了一个空的类Point,JavaScript 引擎会自动为它添加一个空的constructor()方法。

    constructor()方法默认返回实例对象(即this),完全可以指定返回另外一个对象。

     
    1. class Foo {
    2. constructor() {
    3. return Object.create(null);
    4. }
    5. }
    6. new Foo() instanceof Foo
    7. // false

    上面代码中,ES6 constructor()方法返回一个全新的对象,结果导致实例对象不是Foo类的实例。

    类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。

     
    1. class Foo {
    2. constructor() {
    3. return Object.create(null);
    4. }
    5. }
    6. Foo()
    7. // TypeError: Class constructor Foo cannot be invoked without 'new'
    展开全文
  • react中 Useless constructor no-useless-constructor报错 原因是构造函数里缺少state,下图是我的,报错,解决方法只要在constructor里面加上this.state={ },加上state对象就可以 ...

    react中 Useless constructor  no-useless-constructor报错

    原因是构造函数里缺少state,下图是我的,报错,解决方法只要在constructor里面加上this.state={ },加上state对象就可以

    展开全文
  • Constructor详解

    千次阅读 2016-10-26 00:40:53
    Constructor 提供获取构造方法信息,并可生成实例。
  • constructor 属性返回对创建此对象的数组函数的引用。 语法 object.constructor constructor,构造函数,对这个名字,我们都不陌生,constructor始终指向创建当前对象的构造函数。 这里有一点需要注意的是,每个函数...
  • Constructor

    2018-11-11 15:55:17
    这节课我们来讲Constructor类,这个类表示构造器,直接看代码   package reflection; import helloworld.MyArrayList; import java.lang.reflect.Constructor; import java.lang.reflect.Invocation...
  • Default Constructor

    千次阅读 2017-05-08 10:25:39
    一,何时生成一个default constructor? 当编译器需要时就会生成一个default constructor,这个default constructor只执行编译器所需的行为。例如:下面是一个Student类,编译器生成的default constructor不会将两...
  • conversion constructor

    2017-04-25 11:49:35
    Ref http://quiz.geeksforgeeks.org/c-plus-plus/constructors/ ... If a class has a constructor which can be called with a single argument, then this constructor becomes conversion constructor because
  • js constructor

    2017-07-18 11:21:44
    揭开 constructor 在 JavaScript 语言中,constructor 属性是专门为 function 而设计的,它存在于每一个 function 的prototype 属性中。这个 constructor 保存了指向 function 的一个引用。  在定义一个...
  • Constructor.rar

    2010-06-01 16:16:04
    Constructor.rar Constructor.rar
  • 实例 c# constructor

    2013-10-13 23:29:54
    实例 c# constructor
  • new后的constructor属性使用说明,需要的朋友可以参考下。
  • constructora_apolo-源码

    2021-03-18 11:10:30
    constructora_apolo
  • Java Constructor

    2020-03-04 17:01:47
    本文介绍了 Java 中 Constructor 类的相关内容。。。
  • copy constructor

    2015-08-30 09:23:37
    copy constructor也分为trivial和nontrivial两种 如果class展现出bitwise copy semantics(按位拷贝语义),则不会构造出 copy constructor。 反之,会构造出一个copy constructor。 不要bitwise copy semantics ...
  • constructor,构造函数,对这个名字,我们都不陌生,constructor始终指向创建当前对象的构造函数。 这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototype的constructor指向这个函数,这个时候我们...
  • 本文介绍了JavaScript里面的constructor属性。这个属性是理解JavaScript类和继承的重要基础。
  • 大家讨论下constructor的作用哈,需要的朋友可以参考下。从51js摘编而来。
  • 我们知道,默认情况下,对一个函数前面使用new,可以构造出一个对象。每一个对象都有一个constructor属性,这个constructor属性指向构造出该对象的函数。
  • 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。通过本文给大家分享JavaScript中的构造器Constructor模式,对构造器constructor相关知识感兴趣的朋友一起学习吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 629,574
精华内容 251,829
关键字:

constructor