构造函数

创建对象时,new和Class.newInstance() 以及Constructor.newInstance()区别,以及getDeclaredMethods和getMethods的区别

孤街醉人 提交于 2020-03-01 12:00:28
一、newInstance和new 用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制。在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。newInstance()在工厂模式里面用到。 Class.newInstance()的使用: Class.forName("A").newInstance(); 或者 A.class.newInstance(); 区别: (1)调用构造方法不同 new关键字能调用任何构造方法。 newInstance()只能调用无参构造方法。 (2)效率不一样 new关键字是强类型的,效率相对较高。 newInstance()是弱类型的,效率相对较低。 二、Class.newInstance()和Constructor.newInstance() 相同点:Class.newInstance()和Constructor.newInstance()都是通过反射来获取类的对象的。 不同点: (1)调用构造函数不同 Class.newInstance() 只能够调用 无参 的构造函数,即默认的构造函数; Constructor.newInstance() 可以根据传入的参数,调用 任意 构造构造函数。 (2)调用构造函数是否私有不同

动手动脑篇之类与对象

六月ゝ 毕业季﹏ 提交于 2020-03-01 08:26:36
动手动脑篇之类与对象 (一)进行实验 请输入并运行以下代码,得到什么结果 ? (二)动手动脑 以下代码为何无法通过编译?哪儿出错了? 答:Foo obj1=new Foo()在此处调用的时候没有参数 (三)自找麻烦 如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算? 答:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。 执行类的构造函数。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。 (四)进行实验 使用上页幻灯片中定义的类,以下代码输出结果是什么? 答:结果是100 300 依据代码的输出结果,总结 Java 字段初始化的规律。 答:执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。 执行类的构造函数 ,当有多个构造函数时,要通过参数区分。 类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。 (五)动手动脑 当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。 class GrandFather { static { System.out.println("GrandFather的静态初始化块 "); } } class Father

动手动脑三

喜夏-厌秋 提交于 2020-03-01 07:40:54
一、以下代码为何无法编译 public class Test{ public static void main(String[] args){ Foo obj1=new Foo(); } } class Foo{ int value; public Foo(int initVaule){ vaule=initVaule; } } 原因:下面自己写的构造方法带有1个参数,但是在新建对象的时候却没有参数,所以无法进行初始化。 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。同一个类可以有多个构造函数,多个构造函数之间通过参数来区分,这是方法重载的一个实例。构造函数之间可以相互调用 二、 ava进行初始化的地方有两个:初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块。静态初始化块是类中由static修饰的初始化块,实例初始化块为类中没有任何关键字修饰的初始化语句。 如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。 三、 静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。 来源: https://www.cnblogs.com/love-nan/p/9826115.html

C++子类显示调用父类的构造函数

那年仲夏 提交于 2020-03-01 04:10:01
C++子类显示调用父类的构造函数 加入有父类是这样定义的: class CA { public: CA() { cout << "using ca's constractor/n"; } CA(int k) { cout << "using ca's 2nd constractor, k is " << k << endl; m = k; }; virtual ~CA() { cout << "using ca's disconstractor/n"; } void output() { cout << "the m is " << m << endl; } private: int m; }; 注意A类里面有一个私有成员m. 假设有一个子类是这样定义的: class CB : public CA { public: CB(int k) { m = k; } }; 显然是错误的,B类不能够直接访问A类的成员m 这样定义也是错误的: class CB : public CA { public: CB(int k) { __super::CA((int)k); } }; 这样实际上是在CB(int k)中构造了一个CA类的临时变量实例,函数执行完之后就没有了。如果有: CB b(2); 执行的结果是: using ca's constractor using ca's 2nd

多继承与虚继承

你说的曾经没有我的故事 提交于 2020-03-01 03:08:10
多继承 派生类有多个基类继承而来叫做多继承,其构造时按照基类在派生类中的声明顺序依次进行,由于派生类有多个基类派生而来,所以可能出现命名冲突,出现冲突时使用::指明到底使用的是哪个类的成员。 c由AB派生而来,其内存模型如上图所示。 虚继承(菱形继承) 菱形继承: 类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A–>B–>D 这条路径,另一份来自 A–>C–>D 这条路径。当需要访问A的成员变量时,就会产二义性。 解决方法: 采用虚继承在继承方式前面加上 virtual ,派生类中只保留一份间接类的成员。 虚继承的类也叫做虚基类 虚继承时的构造函数 以上为例D的析构函数,不仅要调用BC的构造函数还有直接调用A的构造函数 虚继承时构造函数的执行顺序与普通继承时不同:在最终派生类的构造函数调用列表中,不管各个构造函数出现的顺序如何,编译器总是 先调用虚基类的构造函数 ,再按照出现的顺序调用其他的构造函数;而对于普通继承,就是按照构造函数出现的顺序依次调用的。 来源: CSDN 作者: 和平精英总指挥 链接: https://blog.csdn.net/weixin_44997886/article/details/104581481

静态代码块、构造代码块、构造函数的区别

百般思念 提交于 2020-03-01 02:59:55
首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。 静态代码块,只执行一次,比如,当你想要创建10个对象时,当创建第一个对象时,执行一次,然后当你继续创建剩余的对象时,这个静态代码块就不会被执行了。 而构造代码块与构造函数的异同点: 相同点:每创建一个对象,构造代码块和构造函数都执行一次,不同点:执行的顺序不同,先执行构造代码块,再执行构造方法。 public class statictest { //构造代码块 { System.out.println("我是构造代码块1"); } //静态构造代码块 static{ System.out.println("我是静态构造代码块1"); } //构造函数 statictest() { System.out.println("我是构造函数"); } //构造代码块 { System.out.println("我是构造代码块2"); } //静态构造代码块 static{ System.out.println("我是静态构造代码块2"); } public static void main(String[] args) { //第一次创建对象 new statictest(); System.out.println("----------------------------------

TypeScript Class(类)

自古美人都是妖i 提交于 2020-03-01 01:21:03
传统的JavaScript注重用函数和基于原型的继承来创建可复用的组件,但这可能让用习惯面对对象方式的程序员感到棘手,因为他们的继承和创建对象都是由类而来的。从JavaScript的下一个版本,ECMAScript 6开始,JavaScript程序员就能够用基于这种基于类的面对对象方式来创建编写自己的程序了。在TypeScript中,不需要再等JavaScript的下一个版本就已经支持开发者使用这一技术了。 类 让我们来看一个简单的基于类的例子: class Greeter { greeting: string; constructor(message: string) {this.greeting = message; } greet() {return "Hello, " + this.greeting; } }var greeter = new Greeter("world"); 如果你之前有使用过C#或者Java,会觉得语法非常相似。我们声明一个新的类"Greeter"。这个类里面有三个成员,一个名为"greeting"的属性,一个constructor和一个"greet"方法。 你会注意到,在类里面当某一个成员使用了"this",意味着他访问的是这个类的成员。 在最后一行中,我们使用"new"来为Greeter类构造一个实例。这将会调用之前定义的构造函数

静态和非静态初始化代码块有什么区别

有些话、适合烂在心里 提交于 2020-02-29 22:19:06
我的问题是关于static关键字的一种特殊用法。 可以使用 static 关键字覆盖不属于任何函数的类中的代码块。 例如,以下代码编译: public class Test { private static final int a; static { a = 5; doSomething(a); } private static int doSomething(int x) { return (x+5); } } 如果删除 static 关键字,则会抱怨,因为变量 a 是 final 。 但是,可以同时删除 final 和 static 关键字并进行编译。 这两种方式都使我感到困惑。 我应该如何拥有不属于任何方法的代码段? 如何调用它? 通常,此用法的目的是什么? 或者更好的是,在哪里可以找到有关此文件的文档? #1楼 当开发人员使用初始化程序块时,Java编译器会将初始化程序复制到当前类的每个构造函数中。 例: 以下代码: class MyClass { private int myField = 3; { myField = myField + 2; //myField is worth 5 for all instance } public MyClass() { myField = myField * 4; //myField is worth 20 for all

Scala类和对象(二)

旧街凉风 提交于 2020-02-29 22:18:21
1. 类和属性 1.1 如何控制构造函数字段的可见性 在Scala中: 如果一个字段被声明为var, Scala会为该字段生成getter和setter方法。 如果字段是val, Scala只生成getter方法。 如果一个字段没有var或者val的修饰符, Scala比较保守,不会生成getter和setter方法。 另外,var和val字段可以被private关键字修饰,这样可以防止生成getter和setter方法。 我们看一下测试代码: object Demo{ def main(args: Array[String]): Unit = { val p = new Person("haah") println(p.name) } class Person(var name:String){ } } 结果: haah 我们再把name设置为val: 还没有到运行阶段,编译器自动捕获了异常。改为var就可以了。 如果设置为非val和非var的字段: 直接找不到name这个对象,当构造函数参数既没有声明为val或var时,字段的可见性很受限制,井且Scala不会为此生成访问修改方法。 给val或者var加上private,这个关键字会阻止getter和setter方法的生成,所以这种宇段只能被类的成员变量使用。 2. 构造函数 如同在java中可以定义多个构造函数

Java--代码执行顺序(静态初始化块,初始化块,构造函数)

只谈情不闲聊 提交于 2020-02-29 22:14:45
先上结论 执行顺序 :先执行静态初始化块,然后时初始化块,最后是构造函数 书写格式 : 注意事项: 1. 静态初始化块    静态初始化块只 在类首次加载时执行一次 ,同时静态初始化块 只能给静态变量赋值 ,不能给普通成员变量赋值。 静态初始化块不需要在main方法中调用,即使没有main方法它也会执行 2. (非静态)初始化块    (非静态)初始化块 在每次生成实例对象时都执行一次 ,可以给任意变量赋值。 如果对类没有进行实例化,初始化块不会执行,但是静态初始化块会执行。 3. 构造方法    构造方法 在每次生成实例对象时都执行一次 通过反编译可以看到,构造代码块中的代码也是在构造方法中执行的。在 编译时 的编译器看来 会默认将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面 。 另外需要注意的一点是在执行子类的构造方法之前会先执行父类的默认构造函数即无参构造函数 来源: oschina 链接: https://my.oschina.net/fairy1674/blog/3179652