Java基础VSPython基础学习

白癜风的治疗方法 http://pf.39.net/bdfyy/bdfyc/150828/4687762.html

一、Java继承

继承是面向对象编程中非常强大的一种机制,首先它可以复用代码,例如当大家让Student从Person继承时,Student就获得了Person的所有功能,大家只需要为Student编写新增的功能。Java使用extends关键字来实现继承:

classPerson{privateStringname;privateintage;publicStringgetName(){...}publicvoidsetName(Stringname){...}publicintgetAge(){...}publicvoidsetAge(intage){...}}classStudentextendsPerson{//不要重复name和age字段or方法,只需要定义新增score字段/方法:privateintscore;publicintgetScore(){…}publicvoidsetScore(intscore){…}}

如上所示可见,通过继承,Student只需要编写额外的功能,不再需要重复Person代码。注意到我们在定义Person的时候,没有写extends。在Java中,没有明确写extends的类,编译器会自动加上extendsObject。所以,任何类,除了Object,都会继承自某个类。

二、Java:super

super关键字表示父类(超类)。子类引用父类的字段时,可以用super。但是,在某些时候,就必须使用super。大家来看一个栗子:

classPerson{protectedStringname;protectedintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}classStudentextendsPerson{protectedintscore;publicStudent(Stringname,intage,intscore){this.score=score;}}publicclassMain{publicstaticvoidmain(String[]args){Students=newStudent("XiaoMing",12,89);}}

Java结果如下:

运行上面的代码,会得到一个编译错误,大致意思是在Student的构造方法中,无法调用Person的构造方法,为什么会出现这个错误呢?

这是因为在Java中,任何子类的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地显式调用父类的构造方法,若父类没有默认的构造方法,就会编译报错!因为,好的解决办法或者说良好的写法就是,子类必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。

这里还顺带引出了另一个问题:即子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。

正确代码如下,增加一行super():

classPerson{protectedStringname;protectedintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}classStudentextendsPerson{protectedintscore;publicStudent(Stringname,intage,intscore){super(name,age);//增加一行,调用父类的构造方法this.score=score;}}publicclassjava1{publicstaticvoidmain(String[]args){Students=newStudent("LiLei",12,89);System.out.print(s.name+""+s.age+""+s.score+"");}}

Java结果如下:

三、Python继承

Python与C++、Java一样,也是支持面向对象(OOP)的动态语言的编程语言,因此同样具有面向对象的三大特性:封装、继承、多态。但Python又有一些极具Python自身特色的不同之处,今天微微老师就来和大家讨论一下,Python的继承、__init__初始化、super方法,也许大家之前会用,知道要这么写才能运行程序,否则会报错,但是为什么要这么写,可能想不明白,看完本文,期待能彻底搞清楚了。

大家先来看一个栗子,先写了一个父类Parent及父类的__init__构造函数,然后写了一个子类Child继承父类Parent,也写了子类的__init__构造函数:

classParent(object):def__init__(self,name):self.name=nameprint("createaninstanceof:",self.__class__.__name__)print("nameattributeis:",self.name)#子类继承父类classChild(Parent):#子类中没有显示调用父类的初始化函数def__init__(self):print("call__init__fromChildclass")

接下来,将子类Child实例化,看看效果,打印输出什么结果:

#将子类实例化c=Child()

Python结果如下:

如上图所示的输出结果,不难看出,我们将子类实例化并没有调用父类的构造函数,只是调用了子类的构造函数。由于在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化,因而此时调用子类中name属性会报错不存在:AttributeError:‘Child’objecthasnoattribute‘name’

四、Python:super

当在Python中出现继承的情况时,一定要注意初始化函数_init_的行为:

1.如果子类没有定义自己的初始化函数,父类的初始化函数会被默认调用;但是如果要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。

2.如果子类定义了自己的初始化函数,而在子类中没有显式调用父类的初始化函数,则父类的属性不会被初始化。

.如果子类定义了自己的初始化函数,在子类中显式调用父类,子类和父类的属性都会被初始化。

因此,Python继承正确而良好的写法,应该是下面代码这样:

classParent(object):def__init__(self,name):self.name=nameprint("createaninstanceof:",self.__class__.__name__)print("nameattributeis:",self.name)#子类继承父类classChild(Parent):def__init__(self):print("call__init__fromChildclass")super(Child,self).__init__("小小明")p=Parent(小明)c=Child()print(p.name)print(c.name)

如上面代码,子类定义了自己的初始化函数,并使用super方法显式调用父类__init__,则子类和父类的属性都会被初始化。

Python结果如下:

觉得不错,点个在看吧~

林雨微



转载请注明地址:http://www.sanbaicaoasb.com/scls/8357.html
  • 上一篇文章:
  • 下一篇文章:
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章