黑马程序员技术交流社区

标题: 急!!关于继承的问题 [打印本页]

作者: MGC    时间: 2014-7-24 16:42
标题: 急!!关于继承的问题
class fu
{
         fu()
        {
                System.out.println("a");
        }
       
}

class SubFu extends fu
{
         void Subfu()
        {
                System.out.println("b");
        }
}

class zi extends SubFu
{
         zi()
        {
                System.out.println("c");
        }
}

public class lianxi
{
        public static void main(String[]args)
        {
                zi c=new zi();
                               
        }
}

为什么SubFu()一定要有void?为什么最后结果输出的不是a,b,c?
作者: star5603    时间: 2014-7-24 18:36
好奇怪。。。
作者: D.reamJA    时间: 2014-7-24 18:48
构造函数是规定格式,是没有返回类型。如果写成 void 返回值类型 相当于重新定义了一个函数。不能起到构造函数的作用。    ps:我也是新手,不知道对不对。
作者: Jpor    时间: 2014-7-24 18:59
我怎么觉得第三个写错了class zi中主函数自己 new zi。。。。。
作者: J.twt    时间: 2014-7-24 20:05
初步看了一下,先不说结果,有两个问题
1. 下面这个类的定义中的构造方法有问题,构造方法是没有任何类型的,但是可以用修饰符来修饰,例如private,你用了void来定义,这样的话就不是构造函数了,在new zi()的时候访问的是SubFu的默认的构造方法,所以是不会打印b,最后结果应该是a,c
class SubFu extends fu
{
         void Subfu()
        {
                System.out.println("b");
        }
}
2. public class lianxi,类名没大写
作者: J.twt    时间: 2014-7-24 20:10
还有关于你的这个问题:为什么SubFu()一定要有void?
你仔细看看你定义的方法和类名是否一致
作者: MGC    时间: 2014-7-24 20:29
J.twt 发表于 2014-7-24 20:05
初步看了一下,先不说结果,有两个问题
1. 下面这个类的定义中的构造方法有问题,构造方法是没有任何类型的 ...

太感谢了
作者: ZhangYL    时间: 2014-7-24 20:33
首先 您的第一个问题:为什么必须有void
不晓得您是否知道成员函数和构造函数的区别在哪里。它们之间最大的一个区别就在于是否有返回值。
构造函数在定义上是不允许有返回值的,所以必须有void应该也知道为什么了吧?因为编译器将其当做了一个成员函数。 构造函数的变量名和类名必须一致,正因为你的大小写问题所以必须要加void。

其次 您的第二个问题: 为什么结果不是a b c
您的主方法中在堆内存中开辟了一个空间存储zi类的对象,在此过程中,
可能子类对象会调用父类的一些函数,所以创建对象时,会自动调用其父类的构造方法,您的SubFu由于添加void的原因并非构造函数,所以并没有进行调用。所以打印的结果为a c

最后一个问题就是 希望能改变一下写代码的态度,这种代码阅读性很差,也有可能会因此造成如同问题一的情况,所以请按照规范写代码,毕竟这是自己亲手写出来的代码,写出来了就要对它负责不是么,我也是个新手,也在学习中,希望大家能共同进步。
作者: kakasa    时间: 2014-7-24 21:57
我就挑个小毛病吧

上面Sub”F“u,下面是Sub"f"u。。


作者: MGC    时间: 2014-7-24 22:11
ZhangYL 发表于 2014-7-24 20:33
首先 您的第一个问题:为什么必须有void
不晓得您是否知道成员函数和构造函数的区别在哪里。它们之间最大 ...

谢谢,这些坏习惯我以后会注意的
作者: meibinlove    时间: 2014-7-24 22:23
你的类名是SubFu而方法名是:Subfu,构造函数的方法名要和类名一模一样,所以zi继承的是SubFu的系统给予的默认构造函数,打印结果应该是ac
作者: 席杰    时间: 2014-7-25 00:14
通过大家的回答,我感觉这个问题不是楼主不会,只是粗心大意造成的。这也不怪楼主,有时一个很小的问题,特别是代码长的还很像,自己看好几遍也发现不了问题,等让大家一看就一眼就看出了,自己也恍然大悟了!小问题,希望楼主再接再厉,大家互相帮助学习!:)
作者: 烟海    时间: 2014-7-25 00:17
二楼回复的特别详细。。。

看二楼的就行了。。重复的话,就不再说一遍了。。
作者: MGC    时间: 2014-7-25 00:34
席杰 发表于 2014-7-25 00:14
通过大家的回答,我感觉这个问题不是楼主不会,只是粗心大意造成的。这也不怪楼主,有时一个很小的问题,特 ...

谢谢,粗心这个问题挺严重的,要改
作者: wisely    时间: 2014-7-25 03:06
童鞋们全都正解了

void Subfu()不是构造方法
作者: heimacs    时间: 2014-7-25 07:22
学习了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2