我明天有面试,我正在尝试回答这个问题:
此类中有一个名为C
和方法m
的类,此类也有空构造函数:
Main ()
{
C c = new c();
}
Class C {
public c {
//empty constructor
}
public m {
//does something - doesnt mind
}
}
您需要做的是更改代码,以便在创建实例类C
时,方法m
将在类构造函数之前调用。
您必须在不更改main
的情况下执行此操作(仅编辑类代码)。
提前致谢!
答案 0 :(得分:2)
要在调用构造函数之前调用类的方法,您必须将此方法转换为 static ,这样您就不需要该类的实例来调用它,或者(在C#中)可以使用FormatterServices.GetUninitializedObject Method来获取类的实例,而无需运行构造函数(这当然可能不是明智之举)。
答案 1 :(得分:2)
与其他答案一样,您可以将方法设为静态。但是你需要明确地调用它。如果你创建了一个静态类构造函数,那么第一次引用类时就会自动调用(你不需要调用它)(比如构造第一个实例时)。您无法精确控制何时执行,但它将在构造第一个实例之前执行。根据他们提出问题的方式(你不能改变Main方法),我认为静态类构造函数是他们正在寻找的答案。
http://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=vs.80%29.aspx
静态构造函数具有以下属性: 静态构造函数不接受访问修饰符或具有参数。 在创建第一个实例或任何静态成员之前,会自动调用静态构造函数来初始化类 引用。 无法直接调用静态构造函数。 用户无法控制程序中何时执行静态构造函数。
Java没有静态类构造函数,但它们确实有静态初始化块..
static {
// code in here
}
答案 2 :(得分:2)
在Java和C#中,您可以使用,基类构造函数,静态构造函数(Java中的编辑:静态初始化程序块)和字段初始化程序,以便在C
类的构造函数执行之前调用代码修改Main
。
在Java中使用字段初始化程序块的示例:
class C {
{ m(); }
public C() {
System.out.println("cons");
}
public void m() {
System.out.println("m");
}
}
这打印" m"然后" cons"。请注意,每次构造m
时都会调用C
。静态初始化程序块只能为JVM调用一次。
答案 3 :(得分:2)
在JAVA中:
make方法static
并在static
块中调用您的方法。
class C{
static{
m();
}
public C() {
System.out.println("Constructor Called..");
}
public static void m() {
System.out.println("m() is called.");
}
}
主要电话
public static void main(String[] args) {
new C();
}
答案 4 :(得分:1)
它的基本OOP。您必须创建一个公共静态方法并调用它。然后该方法可以调用构造函数,也可以直接从main调用构造函数。
在调用构造函数之前,该对象不存在,因此不存在实例方法,因此无法调用与实例/对象无关的任何内容。调用构造函数之前唯一存在的就是静态方法。
答案 5 :(得分:1)
以下方式似乎达到了要求。不使用静态方法/变量
namespace FnCallBeforeConstructor
{
static void Main(string[] args)
{
MyClass s = new MyClass();
Console.ReadKey();
}
partial class MyClass: Master
{
public override void Func()
{
Console.WriteLine("I am a function");
}
public MyClass()
: base()
{
Console.WriteLine("I am a constructor");
}
}
class Master
{
public virtual void Func() { Console.WriteLine("Not called"); }
public Master()
{
Func();
}
}
}
输出是:
我是一名职能
我是构造函数