Tag: 构造器

C#中的构造函数与对象初始化优先级

我一直在学习C#中的对象初始值设定项,但现在我想知道它是如何工作的,当它与构造函数冲突。 public class A { public bool foo { get; set; } public A() { foo = true; } public A(bool bar) { foo = bar; } } 当我尝试这个时会发生什么? public class B { a = A() {foo = false}; b = A(true) {foo = false}; } 构造函数中的默认是一个很好的方式来让一个bool开始真实并且可以被改变? public A(bar=true) { foo = bar; }

为什么不能同步Java构造函数?

根据Java语言规范 ,构造函数不能被标记为同步的,因为其他线程在创build它的线程完成之前不能看到正在创build的对象。 这似乎有点奇怪,因为我确实可以让另一个线程在构造时查看对象: public class Test { public Test() { final Test me = this; new Thread() { @Override public void run() { // … Reference 'me,' the object being constructed } }.start(); } } 我知道这是一个非常人为的例子,但从理论上来说,有人可能会想出一个更现实的情况,即标记同步的构造函数是合法的,以防止像这样的线程的比赛。 我的问题是:是否有一个原因,Java会明确禁止在构造函数的同步修饰符? 也许我上面的例子是有缺陷的,也许真的没有理由,这是一个任意的devise决定。 无论哪种情况,我都很好奇,很想知道答案。

为什么C#构造函数不能推断types?

为什么types推断不像构造函数那样支持generics方法? public class MyType<T> { private readonly T field; public MyType(T value) { field = value; } } var obj = new MyType(42); // why can't type inference work out that I want a MyType<int>? 虽然你可以用工厂类来解决这个问题, public class MyTypeFactory { public static MyType<T> Create<T>(T value) { return new MyType<T>(value); } } var myObj = MyTypeFactory.Create(42); […]

为什么this()和super()必须是构造函数中的第一个语句?

Java要求,如果你在构造函数中调用this()或super(),它必须是第一个语句。 为什么? 例如: public class MyClass { public MyClass(int x) {} } public class MySubClass extends MyClass { public MySubClass(int a, int b) { int c = a + b; super(c); // COMPILE ERROR } } Sun编译器说“调用super必须是构造函数中的第一条语句”。 Eclipse编译器说:“构造函数调用必须是构造函数中的第一个语句”。 不过,你可以通过重新安排代码来解决这个问题: public class MySubClass extends MyClass { public MySubClass(int a, int b) { super(a + b); // […]

在构造函数中重写的方法调用有什么问题?

我有一个Wicket页面类,根据抽象方法的结果设置页面标题。 public abstract class BasicPage extends WebPage { public BasicPage() { add(new Label("title", getTitle())); } protected abstract String getTitle(); } NetBeans用“构造函数中的Overridable方法调用”消息警告我,但是它会出现什么问题? 我能想象的唯一select是将其他抽象方法的结果传递给子类中的超级构造函数。 但是这可能很难用许多参数来阅读。