class="markdown_views prism-github-gist">
一、 问题引出
面向对象的编程思想使得代码中创建的class ="tags" href="/tags/Lei.html" title=类>类更加具体,他们都有各自的属性,方法。有的时候一些客观事物之前存在一些联系,那么他们在代码中的具体class ="tags" href="/tags/Lei.html" title=类>类也存在一些联系。 例如:设计一个动物class ="tags" href="/tags/Lei.html" title=类>类
class="prism language-class ="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">public class="token keyword">class class="token class -name">Animal class="token punctuation">{
class="token keyword">public class="token class -name">String nameclass="token punctuation">;
class="token keyword">public class="token keyword">int ageclass="token punctuation">;
class="token keyword">public class="token class -name">Animal class="token punctuation">( class="token class -name">String nameclass="token punctuation">) class="token punctuation">{
class="token keyword">this class="token punctuation">. name class="token operator">= nameclass="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token class -name">Animal class="token punctuation">( class="token keyword">int ageclass="token punctuation">) class="token punctuation">{
class="token keyword">this class="token punctuation">. age class="token operator">= ageclass="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token keyword">void class="token function">eat class="token punctuation">( class="token punctuation">) class="token punctuation">{
class="token class -name">System class="token punctuation">. outclass="token punctuation">. class="token function">println class="token punctuation">( class="token keyword">this class="token punctuation">. nameclass="token operator">+ class="token string">"吃东西" class="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token punctuation">}
这个动物class ="tags" href="/tags/Lei.html" title=类>类有自己的name,age属性和eat方法 我们又想创建一个猫class ="tags" href="/tags/Lei.html" title=类>类和狗class ="tags" href="/tags/Lei.html" title=类>类
class="prism language-class ="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">class cat class="token punctuation">{
class="token keyword">public class="token class -name">String nameclass="token punctuation">;
class="token keyword">public class="token keyword">int ageclass="token punctuation">;
class="token keyword">public class="token function">cat class="token punctuation">( class="token class -name">String nameclass="token punctuation">) class="token punctuation">{
class="token keyword">this class="token punctuation">. name class="token operator">= nameclass="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token function">cat class="token punctuation">( class="token keyword">int ageclass="token punctuation">) class="token punctuation">{
class="token keyword">this class="token punctuation">. age class="token operator">= ageclass="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token keyword">void class="token function">eat class="token punctuation">( class="token punctuation">) class="token punctuation">{
class="token class -name">System class="token punctuation">. outclass="token punctuation">. class="token function">println class="token punctuation">( class="token keyword">this class="token punctuation">. nameclass="token operator">+ class="token string">"吃饭" class="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token punctuation">}
class="token keyword">class dogclass="token punctuation">{
class="token keyword">public class="token class -name">String nameclass="token punctuation">;
class="token keyword">public class="token keyword">int ageclass="token punctuation">;
class="token keyword">public class="token function">dog class="token punctuation">( class="token keyword">int ageclass="token punctuation">) class="token punctuation">{
class="token keyword">this class="token punctuation">. age class="token operator">= ageclass="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token function">dog class="token punctuation">( class="token class -name">String nameclass="token punctuation">) class="token punctuation">{
class="token keyword">this class="token punctuation">. name class="token operator">= nameclass="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token keyword">void class="token function">eat class="token punctuation">( class="token punctuation">) class="token punctuation">{
class="token class -name">System class="token punctuation">. outclass="token punctuation">. class="token function">println class="token punctuation">( class="token keyword">this class="token punctuation">. nameclass="token operator">+ class="token string">"干饭" class="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token punctuation">}
由于大家都是碳基生物,你要吃饭我也要吃饭,你有名字我也有名字,也都有自己的年龄,我们在创建其他class ="tags" href="/tags/Lei.html" title=类>类的时候还需要在写一遍他们的属性name,age,和方法eat。并且,从逻辑上来说猫和狗都属于动物。这就造成了大量重复的代码,那有没有什么办法能让我不用把这些属性。方法在写一遍呢?
继承:我来啦!!!
继承作为class ="tags" href="/tags/MianXiangDuiXiangBianCheng.html" title=面向对象编程>面向对象编程的一个非常重要的关键字,在C++,和Java当中都可以使用它来减少代码冗余。顾名思义,它可以让一个子class ="tags" href="/tags/Lei.html" title=类>类继承另一个父class ="tags" href="/tags/Lei.html" title=类>类,就像儿子继承爸爸的财产一样,继承后的子class ="tags" href="/tags/Lei.html" title=类>类可以拥有父class ="tags" href="/tags/Lei.html" title=类>类的方法,属性,这样每次在定义动物class ="tags" href="/tags/Lei.html" title=类>类完之后,在想要定义狗或者猫class ="tags" href="/tags/Lei.html" title=类>类的时候就不用再把多余的代码写一遍了。我们来看看效果。
二、继承extends
2.1 继承的用法
子class ="tags" href="/tags/Lei.html" title=类>类extends父class ="tags" href="/tags/Lei.html" title=类>类即可
class="prism language-class ="tags" href="/tags/JAVA.html" title=java>java">class="token keyword">class cat class="token keyword">extends animalclass="token punctuation">{
class="token keyword">public class="token function">cat class="token punctuation">( class="token class -name">String nameclass="token punctuation">) class="token punctuation">{
class="token keyword">super class="token punctuation">( nameclass="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token function">cat class="token punctuation">( class="token keyword">int ageclass="token punctuation">) class="token punctuation">{
class="token keyword">super class="token punctuation">( ageclass="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token keyword">void class="token function">catchMouce class="token punctuation">( class="token punctuation">) class="token punctuation">{
class="token class -name">System class="token punctuation">. outclass="token punctuation">. class="token function">println class="token punctuation">( class="token keyword">this class="token punctuation">. nameclass="token operator">+ class="token string">"抓老鼠" class="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token punctuation">}
class="token keyword">class dog class="token keyword">extends animalclass="token punctuation">{
class="token keyword">public class="token function">dog class="token punctuation">( class="token class -name">String nameclass="token punctuation">) class="token punctuation">{
class="token keyword">super class="token punctuation">( nameclass="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token function">dog class="token punctuation">( class="token keyword">int ageclass="token punctuation">) class="token punctuation">{
class="token keyword">super class="token punctuation">( ageclass="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token keyword">public class="token keyword">void class="token function">defence class="token punctuation">( class="token punctuation">) class="token punctuation">{
class="token class -name">System class="token punctuation">. outclass="token punctuation">. class="token function">println class="token punctuation">( class="token keyword">this class="token punctuation">. nameclass="token operator">+ class="token string">"看家" class="token punctuation">) class="token punctuation">;
class="token punctuation">}
class="token punctuation">}
在上面的代码中,cat,dog被称为子class ="tags" href="/tags/Lei.html" title=类>类、派生class ="tags" href="/tags/Lei.html" title=类>类,而animal被称为父class ="tags" href="/tags/Lei.html" title=类>类或者超class ="tags" href="/tags/Lei.html" title=类>类,extends英文意思为扩展,这里可以理解成继承,例如我们写的catclass ="tags" href="/tags/Lei.html" title=类>类有了抓老鼠的方法,dogclass ="tags" href="/tags/Lei.html" title=类>类有了看家的方法。继承可以让子class ="tags" href="/tags/Lei.html" title=类>类拥有父class ="tags" href="/tags/Lei.html" title=类>类public修饰的属性和方法,cat、dogclass ="tags" href="/tags/Lei.html" title=类>类就继承了animalclass ="tags" href="/tags/Lei.html" title=类>类的name、age属性以及eat方法。
2.2 基本语法
使用 extends 指定父class ="tags" href="/tags/Lei.html" title=类>类. 子class ="tags" href="/tags/Lei.html" title=类>类会继承父class ="tags" href="/tags/Lei.html" title=类>类的所有 public 的字段和方法. 对于父class ="tags" href="/tags/Lei.html" title=类>类的 private 的字段和方法, 子class ="tags" href="/tags/Lei.html" title=类>类中是无法访问的. 子class ="tags" href="/tags/Lei.html" title=类>类的实例中, 也包含着父class ="tags" href="/tags/Lei.html" title=类>类的实例. 可以使用 super 关键字得到父class ="tags" href="/tags/Lei.html" title=类>类实例的引用 子class ="tags" href="/tags/Lei.html" title=类>类继承父class ="tags" href="/tags/Lei.html" title=类>类之后,还可以声明自己特有的属性和方法,实现功能的拓展。
2.3继承的好处
1:减少代码的冗余,提高复用性。 2:便于功能的拓展 3:为多态 提供了前提。
2.4继承性
Java各种class ="tags" href="/tags/Lei.html" title=类>类互相继承的属性称作继承性,继承性有一些规定。 1:一个class ="tags" href="/tags/Lei.html" title=类>类可以被多个子class ="tags" href="/tags/Lei.html" title=类>类继承。 2:Java的单继承性:一个子class ="tags" href="/tags/Lei.html" title=类>类只能继承一个父class ="tags" href="/tags/Lei.html" title=类>类。比如一个儿子只能有一个亲爸爸,一个爸爸可以有好几个儿子。在C++,和python中支持多继承 3:如果一个class ="tags" href="/tags/Lei.html" title=类>类没有说明一个class ="tags" href="/tags/Lei.html" title=类>类的父class ="tags" href="/tags/Lei.html" title=类>类的话,那么此class ="tags" href="/tags/Lei.html" title=类>类继承于class ="tags" href="/tags/JAVA.html" title=java>java.lang.Objectclass ="tags" href="/tags/Lei.html" title=类>类 4:所以的class ="tags" href="/tags/Lei.html" title=类>类(除了class ="tags" href="/tags/JAVA.html" title=java>java.lang.Object)都间接或直接的继承class ="tags" href="/tags/JAVA.html" title=java>java.lang.Objectclass ="tags" href="/tags/Lei.html" title=类>类。那么就意味这所有的class ="tags" href="/tags/Lei.html" title=类>类都具有class ="tags" href="/tags/JAVA.html" title=java>java.lang.Objectclass ="tags" href="/tags/Lei.html" title=类>类声明的功能。