当前位置: 首页 > 后端技术 > Python

新的一年我要立一面flag

时间:2023-03-25 22:31:50 Python

我从来没有写技术博客的习惯。打算今年开始立flag,博客每周写2篇。主要是对自己最近学习的内容进行总结、记录和反思,作为知识输出的一种方式,同时也提高写作水平。所以flag来了,一年52周,一周两篇,我明年元旦应该就能看到我100篇的博客了吧???希望不要划桨,把这件事做好。(这篇文章也算hhhhhhhhhh)目前研究生刚毕业,明年会去上海投身中端开发。分享的内容可能是工作中遇到的问题的回顾,专栏学习的经验总结,经典书籍等。有趣的问题等今天的话题是Java和Python中继承的区别publicclassTest{publicstaticvoidmain(String[]args){newA();新B();}}A类{inti=7;公共A(){setI(20);System.out.println("A中的i是"+i);}publicvoidsetI(inti){this.i=2*i;}}classBextendsA{publicB(){System.out.println("ifromBis"+i);}publicvoidsetI(inti){this.i=3*i;}}A是B的父类,经过两个对象实例化后,他们的i值分别是多少?首先在main方法中new了两个实例对象,一个A,一个B。newA()的结果;很简单。在其构造函数A()中,将20作为参数传递给setI,使其成员变量i由7变为40,然后打印出来。至于新的B();语句中,由于B是A的父类,所以构造函数的调用顺序是先调用父类的构造函数。这里的setI方法在父类和子类中都有对应的定义,并且有相同的方法签名,属于方法重写。因此,在父类的构造函数中,调用了子类重写的setI方法,将传入的参数放大3倍赋值给成员变量i。而这个成员变量i是在父类中定义的,被子类继承,属于同一个实例对象,所以后面两次打印输出的i内容是一致的。输出是ifromAis40ifromAis60ifromBis60让我们看一下python中继承的类Person():def__init__(self,identity):print('Personclassinitcalled')self.identity=identitydefprint_grade(self):print(self.grade)classStudent(Person):def__init__(self,name,grade):print('Studentclassinitcalled')Person.__init__(self,'student')自我.name=nameself.grade=grades=Student('Adam','newbie')s.print_grade()这里Person是Student的父类,该类的构造方法由__init__进行,不同于java最重要的是父类的构造函数需要主动调用,所以不需要调用;并且先执行子类的构造函数,再执行父类的构造函数。Person.__init__(self,'student')当我们注释掉这行代码时,父类构造函数的打印输出消失了,但是它的print_grade()方法仍然可以正常使用。所以这里的猜测是:Python中的构造方法并不是构造对象的功能,只是为初始化做准备。Java呢?同理,jvm创建对象后,调用构造函数准备初始化。