构造方法可以重载但不可以重写对吗? 构造方法可以重载但不可以重写对吗?在线等待! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关于访问修饰符,如果是default的方法或属性可以让子类来访问吗? 问:关于访问修饰符,如果是default的方法或属性可以让子类来访问吗?答:可以。 对不起,第二个回答收回。修改为:问:关于访问修饰符,如果是default的方法或属性可以让子类来访问吗?答:不可以。 第二个回答:问:关于访问修饰符,如果是default的方法或属性可以让子类来访问吗?答:如果子类和父类在同一包内,可以;否则,不可以。 Dan1980() 说的对,下表摘自Sun SL-275幻灯片:Modifier | Same Class | Same Package | Subclass | Universeprivate | Yesdefault | Yes | Yesprotected| Yes | Yes | Yespublic | Yes | Yes | Yes | Yes 构造方法可以重载但不可以重写对吗?我认为这个说法不正确,因为父类的构造函数是不可以被称为 重载或者重写的就如同你在JDK1.5中,是不可以增加“@Override”这个Annotation到构造函数上 To ChDw:重载(Overloading)构造方法是可以的。但是重写(Overriding)则不可以,因为被重写的前提是被继承,而构造方法根本就不能被继承,所以谈不上被重写。 Dan1980,我 同意这为朋友说的! 既可以重载,也可以重写。重载就不谈了,在形式上可以简单理解为多个名字相同而参数不同的方法。至于重写,请看下面的例子:public class Test { Test(){ System.out.println("Test: construct"); } void hello(){ System.out.println("Test: Hello"); } public static void main(String[] args) { Test1 t1 = new Test1(); t1.hello(); }}class Test1 extends Test{ Test1(){ // 这一条是默认执行的,写或不写都会执行 // 虽然形式不一样,其实就是构造方法的重写。 super(); System.out.println("Test1: construct"); } void hello(){ // 普通方法的重写。 super.hello(); System.out.println("Test1: Hello"); }}我同意Dan1980()说的“被重写的前提是被继承”这句话,不过不同意“构造方法根本就不能被继承”。至少要有一个构造方法会被继承,构造方法的overriding只是在形式上不同于普通方法。 UnAgain所说的至少要有一个构造方法会被继承的说法我不同意,如下例子:class Test{ Test( String s ){ System.out.println(s) ; } Test( int i ) { System.out.println(i) ; }}class Test1 extends Test{ Test1(){ super("") ; //这里必须指定调用父类的某个构造方法,而不是自动调用 }}在这样的情况下如果子类的构造中不指定调用父类的哪一个构造方法的时候,编译会出错 按照Sun SL-275课程的说法,构造方法是不能被继承的。 TIJ上说构造方法实质上是一个静态方法,仔细思考一下的确如此:构造方法是被类而不是类的实例所有的。既然是静态方法就无所谓继承和Overriding了。 重载(overload):在一个类中,重载方法具有相同的方法名,根据它的参数类型,个数,位置的不同可以构成重载函数。编译器编译代码的时候,会根据主调函数的参数对重载函数进行匹配编译,也就是说重载是静态的。所以也叫做”静态绑定“,或者”静态多态性“重写(override):在具有继承的类结构体系中,子类可以重写父类中的方法。重写要求子类中的重写方法必须和父类中的方法具有相同的”方法签名“,即相同的方法名,相同的参数列表,相同的返回值类型(严格的说,返回值类型不算方法签名,所以在JDK5.0中允许重写方法的返回值类型不同)。重写主要实现的”动态绑定“,程序运行的时候才去决定那一个重写方法被调用。所以也叫做”动态多态性“。关于”多态性“,在C++还有一种“模板多态性”,即Template。这涉及泛型的内容。在Java5.0,C#2.0都实现了泛型。但是各有区别。……好像有点跑题了。:)另外,关于继承:子类能够继承父类中所有的“除了构造函数和析构函数”之外的任何东西。所以构造函数不可能被重写,只能重载。 To freewilling(笨笨):我的“至少要有一个构造方法会被继承”说错了,应该说成“必须继承一个构造方法”。不过这到底算不算是“继承”确实有些疑惑,应该说成“必须首先调用一个父类的构造方法”,即第一句必须是 super(parm, ...);缺省则调用无参数 super();现在觉得对“重写”的语义、概念有点似是而非了,呵呵,还得回头看看教科书。 我比较赞同nirvana_li(东成西就,芝兰境界)的说法! 构造函数不能被重写,方法名都不一样 可以重载。default的意思就是在同一命名空间下有可见性,与是否子类无关建议lz看到这些概念的时候边学边练,这些问题多写一下更容易理解 Java为啥这么难呢?弄得我头昏脑涨的,好难受哦! 文件输入流 如何打印? 小生想买本书学习操作系统,不知道哪本书好~~ 请各位高手帮忙,在下不胜感激 ### 奖励:为了感谢火龙果(bao110908 对Java版的杰出贡献,特奖励400分 ### 这个问题没人看呢,牛友们,看看吧!!! tomcat 启动时调用的第一个带main函数的类是哪个类? 想请问下,下面的代码有什么问题吗?为什么画不出图像??谢谢各位了! 关于学习过程中遇到的问题 关于基本类型转换 难道是参数传递问题? 为什么java的api文档资料帮助这么差啊!!! 在java里可以用包里面定义好的类的类名做自定义的类名吗?
答:可以。
答:不可以。
答:如果子类和父类在同一包内,可以;否则,不可以。
Modifier | Same Class | Same Package | Subclass | Universe
private | Yes
default | Yes | Yes
protected| Yes | Yes | Yes
public | Yes | Yes | Yes | Yes
重载(Overloading)构造方法是可以的。
但是重写(Overriding)则不可以,因为被重写的前提是被继承,而构造方法根本就不能被继承,所以谈不上被重写。
Test(){
System.out.println("Test: construct");
} void hello(){
System.out.println("Test: Hello");
} public static void main(String[] args) {
Test1 t1 = new Test1();
t1.hello();
}
}class Test1 extends Test{
Test1(){
// 这一条是默认执行的,写或不写都会执行
// 虽然形式不一样,其实就是构造方法的重写。
super();
System.out.println("Test1: construct");
} void hello(){
// 普通方法的重写。
super.hello();
System.out.println("Test1: Hello");
}
}我同意Dan1980()说的“被重写的前提是被继承”这句话,不过不同意“构造方法根本就不能被继承”。至少要有一个构造方法会被继承,构造方法的overriding只是在形式上不同于普通方法。
class Test{
Test( String s ){
System.out.println(s) ;
}
Test( int i ) {
System.out.println(i) ;
}
}class Test1 extends Test{
Test1(){
super("") ; //这里必须指定调用父类的某个构造方法,而不是自动调用
}
}在这样的情况下如果子类的构造中不指定调用父类的哪一个构造方法的时候,编译会出错
既然是静态方法就无所谓继承和Overriding了。
所以构造函数不可能被重写,只能重载。
super(parm, ...);
缺省则调用无参数
super();现在觉得对“重写”的语义、概念有点似是而非了,呵呵,还得回头看看教科书。
可以重载。
default的意思就是在同一命名空间下有可见性,与是否子类无关建议lz看到这些概念的时候边学边练,这些问题多写一下更容易理解