默认构造函数和直接初始化对象的字段有什么区别? 有什么理由比其他的更喜欢下面的例子之一? 例1 public class Foo { private int x = 5; private String[] y = new String[10]; } 例2 public class Foo { private int x; private String[] y; public Foo() { x = 5; y = new String[10]; } }
一个构造函数可以是私有的吗? 私人构造函数如何有用?
考虑这个 – 一个基类A,从Binheritance的类B,从Binheritance的类C.什么是在构造函数中调用父类构造函数的通用方法? 如果这仍然听起来太模糊,这是一些代码。 class A(object): def __init__(self): print "Constructor A was called" class B(A): def __init__(self): super(B,self).__init__() print "Constructor B was called" class C(B): def __init__(self): super(C,self).__init__() print "Constructor C was called" c = C() 这是我现在做的。 但是它看起来还是非常通用的 – 你仍然必须手工传递正确的types。 现在,我已经尝试使用self.__class__作为super()的第一个参数,但显然这不起作用 – 如果将它放在C的构造函数中,那么B的构造函数会被调用。 如果你在B中做同样的事情,“self”仍然指向C的一个实例,所以你最终再次调用B的构造函数(这以无限recursion结束)。 现在没有必要考虑钻石inheritance,我只是想解决这个具体问题。
什么时候运行? 它是针对我应用的每个对象运行,还是只运行一次? 它可以做任何事情,或者其行动受到限制?
Ryan Delucchi 在这里向Tom Hawtin的回答#3发表了评论: 为什么是Class.newInstance()“邪恶”? 这在响应代码示例: // Avoid Class.newInstance, for it is evil. Constructor<? extends Runnable> ctor = runClass.getConstructor(); Runnable doRun = ctor.newInstance(); 那么,为什么是邪恶呢?
叫我疯了,但我喜欢喜欢带参数的构造函数(如果需要的话)的types,而不是没有参数的构造函数,然后设置属性。 我的思考过程:如果要求属性实际构造对象,则应该在构造函数中进行。 我有两个好处: 我知道当一个对象被构造时(没有错误/exception),我的对象是好的。 它有助于避免忘记设置某个属性。 在forms/用户控制发展方面,这种思维方式已经开始伤害我。 想象一下这个UserControl: public partial class MyUserControl : UserControl { public MyUserControl(int parm1, string parm2) { // We'll do something with the parms, I promise InitializeComponent(); } } 在devise时,如果我把这个UserControl放在窗体上,我会得到一个exception: 无法创build组件“MyUserControl”… System.MissingMethodException – 为此对象定义的无参数构造函数。 对我来说,唯一的办法就是添加默认的构造函数(除非其他人知道方法)。 public partial class MyUserControl : UserControl { public MyUserControl() { InitializeComponent(); } public MyUserControl(int parm1, string parm2) […]
我希望有一个不带参数的模板构造函数的非模板类。 据我所知,这是不可能的(因为它会违反默认的构造函数 – 我是吗? ), 解决方法如下: class A{ template <typename U> A(U* dummy) { // Do something } }; 也许有更好的替代scheme(或更好的解决方法)? 谢谢。
我遇到了一些麻烦,如何在接口中定义构造函数。 我可能完全误解了一些东西。 但是我已经search了很长一段时间的答案,我找不到与此相关的任何内容。 如何在TypeScript类中实现以下接口: interface MyInterface { new ( … ) : MyInterface; } Anders Hejlsberg在本video中创build了一个包含类似内容的界面(大约14分钟)。 但是对于我来说,我不能在课堂上实现这一点。 我可能误解了一些东西,我没有得到什么? 编辑: 澄清。 与“新(…)”我的意思是“任何事情”。 我的问题是,我无法得到这个工作的最基本的版本: interface MyInterface { new () : MyInterface; } class test implements MyInterface { constructor () { } } 这不是我编译我得到“类'testing'声明接口'MyInterface',但没有实现它:types'MyInterface'需要一个构造签名,但types'testing'缺乏一个”试图编译它。 编辑: 所以在研究了这一点之后再给予反馈。 interface MyInterface { new () : MyInterface; } class test implements MyInterface […]
我的代码是 public class Parent { public Parent(int i) { Console.WriteLine("parent"); } } public class Child : Parent { public Child(int i) { Console.WriteLine("child"); } } 我收到错误: 父母不包含带有0个参数的构造函数。 我明白问题是, Parent没有0参数的构造函数。 但我的问题是,为什么我们需要一个零参数的构造函数? 为什么没有它的代码工作?
今天,我发现了关于g++或nm一个相当有趣的事情…构造函数定义在库中似乎有两个入口。 我有一个标题thing.hpp : class Thing { Thing(); Thing(int x); void foo(); }; 和thing.cpp : #include "thing.hpp" Thing::Thing() { } Thing::Thing(int x) { } void Thing::foo() { } 我编译这个: g++ thing.cpp -c -o libthing.a 然后,我运行nm : %> nm -gC libthing.a 0000000000000030 T Thing::foo() 0000000000000022 T Thing::Thing(int) 000000000000000a T Thing::Thing() 0000000000000014 T Thing::Thing(int) 0000000000000000 T Thing::Thing() U […]