【发布时间】:2012-04-01 14:14:04
【问题描述】:
我不确定一件事。面向对象编程有两件事。
构造函数
方法
其中哪一项可以重载,哪一项可以覆盖?
谢谢!
【问题讨论】:
标签: object methods constructor
我不确定一件事。面向对象编程有两件事。
构造函数
方法
其中哪一项可以重载,哪一项可以覆盖?
谢谢!
【问题讨论】:
标签: object methods constructor
两者都可以重载。 重载意味着拥有两个或多个名称完全相同但签名不同的方法或构造函数。类似的东西:
public myClass(String a){} public myClass(Double d){}
或方法:
public void aMethod(String s){} publis int aMethod(Double d){ return 0; }
编辑: bebin,重写通常伴随着继承,当超类实现一个方法但子类需要以其他方式实现该方法时,例如: 在超类中:
public int doSomething(){ return a+2; }
但在子类中:
@override public in doSomething(){ return a*2; }
关于覆盖以下行的构造函数来自 CollinD,我引用它: “构造函数不是普通方法,它们不能被“覆盖”。说构造函数可以被覆盖意味着超类构造函数将是可见的并且可以被调用来创建子类的实例。这不是真的......默认情况下,子类没有任何构造函数(如果它扩展的类有一个无参数构造函数,则除外)。它必须显式声明任何其他构造函数,并且这些构造函数属于它而不属于它的超类,即使它们采用与超类构造函数相同的参数。
您提到的关于默认无参数构造函数的内容只是构造函数工作方式的一个方面,与覆盖无关。”
【讨论】:
这可能取决于语言,但理论上两者都可以被重载和覆盖。
C# 示例:
class Parent {
protected string Name;
public Parent(string name) {
this.Name = name;
}
public Parent(string firstName, string lastName) {
this.Name = firstName + " " + lastName;
}
public virtual string GetName() {
return this.Name;
}
}
class Child : Parent {
public Child(string firstName) : base(firstName, "Doe") {}
public override string GetName() {
return this.Name = " Jr.";
}
public string GetName(string prefix) {
return prefix + " " + this.GetName();
}
}
这说明了构造函数和方法的覆盖以及构造函数和方法的重载。
【讨论】:
您可以重载和覆盖构造函数和方法。 (我认为构造函数实际上只是一种特殊的方法。)
重写允许子类替换其父类的实现。
重载允许您创建采用不同参数列表的不同版本的方法。
【讨论】: