学习Java基础的一些知识(9)继承 阳光穿透心脏的1/2处 2022-05-29 05:23 142阅读 0赞 **继承**:面向对象思想的特征之一。在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所 属关系,通过继承可以使多种事物之间形成一种关系体系。 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自 动拥有父类所有可继承的属性和方法。(也就是没有被私有化的属性和方法) 在程序中,如果想声明一个类继承另一个类,需要使用**extends**关键字。 <table style="width:200px;"> <tbody> <tr> <td><strong>继承的语法格式: </strong><span style="color:#ff0000;">class 子类 extends 父类{}</span></td> </tr> </tbody> </table> <table style="width:200px;"> <tbody> <tr> <td> <p>我们定义一个父类,再定义一个子类帮助我们更好的理解继承</p> <p><span style="color:#000000;">class Employee{ //员工类(父类)</span></p> <p><span style="color:#000000;"> String name; //属性</span></p> <p><span style="color:#000000;"> public void work(){ //方法</span></p> <p><span style="color:#000000;"> System.out.println("努力工作!");</span></p> <p><span style="color:#000000;"> }</span></p> <p><span style="color:#000000;">}</span></p> <p> </p> <p><span style="color:#000000;">class Developer </span><strong><span style="color:#ff0000;">extends</span></strong><span style="color:#000000;"> Employee{ //定义Developer类继承Employee类</span></p> <p><span style="color:#000000;"> //定义一个打印name的方法</span></p> <p><span style="color:#000000;"> public void printName(){ </span></p> <p><span style="color:#000000;"> System.out.println("name="+name);</span></p> <p><span style="color:#000000;"> }</span></p> <p><span style="color:#000000;">}</span></p> <p> </p> <p><span style="color:#000000;">public class Example{ //测试类</span></p> <p><span style="color:#000000;"> public static void main(String[] args){ </span></p> <p><span style="color:#000000;"> Developer d = new Developer(); //实例化一个Developer类对象</span></p> <p><span style="color:#000000;"> d.name = "小明"; //为<span style="color:#000000;">Developer类继承的Employee类的name属性</span>赋值</span></p> <p><span style="color:#000000;"> d.printName(); //调用<span style="color:#000000;">printName()方法</span></span></p> <p><span style="color:#000000;"> d.work() //调用Developer类继承的Employee类的work()方法</span></p> <p><span style="color:#000000;"> }</span></p> <p><span style="color:#000000;">}</span></p> <p><span style="color:#000000;"><strong>运行结果为</strong>:</span></p> <p><span style="color:#000000;"><img alt="" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWctYmxvZy5jc2RuLm5ldC8yMDE4MDMxNzIyMDAyOTc1OA"></span></p> <p><span style="color:#000000;">从结果中可以看出来,Developer类通过extends关键字继承了Employee类。子类中虽然没有定义name属性和work()方法, 但是却可以访问这两个成员,这就说明,子类在继承父类的时候,会自动继承父类可继承的属性和方法。</span></p> </td> </tr> </tbody> </table> **继承的好处**: 1、继承的出现提高了代码的复用性,提高软件开发效率。 2、继承的出现让类与类之间产生了关系,提供了多态的前提。 **继承需要注意一些的问题**: 1、在Java中,类只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类 2、多个类可以继承一个父类 3、一个类既可以是父类也可以是子类,例如C继承B,B继承A。这样就是说B是A的子类,B是C的父类! 在继承中父类和子类,如果有成员变量是不同名字的,调用时是没有任何问题,但是如果父类和子类成员变量名字一样怎么去调用父类和子类变量呢? 首先需要明确一点:当出现继承的时候,父类和子类同名成员变量,这时如果在子类中我们想查看父类成员变量时,就需要用到super关键字和this关键字来区分到底是本类成员变量还是父类成员变量。 <table style="width:200px;"> <tbody> <tr> <td> <p><span style="color:#000000;">class Fu{ //父类</span></p> <p><span style="color:#000000;"> int num = 5;</span></p> <p><span style="color:#000000;">}</span></p> <p> </p> <p><span style="color:#000000;">class Zi </span><strong><span style="color:#ff0000;">extends</span></strong><span style="color:#000000;"> Fu{ //定义Zi类继承Fu类</span></p> <p> int num = 6;</p> <p> void show(){ </p> <p> System.out.println(super.a);<br> System.out.println(this.a);</p> <p> }</p> <p><span style="color:#000000;">}</span></p> <p> </p> <p><span style="color:#000000;">public calss Test{ </span></p> <p><span style="color:#000000;"> public static void main(String[] args) { <br> Zi z = new Zi();<br> z.show();<br> }</span></p> <p><span style="color:#000000;">}</span></p> </td> </tr> </tbody> </table> 但成员方法就不同了,当在程序中通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的 方法,若子类中不存在就会执行父类中相应的方法。因为子类继承父类方法之后可以选择重写方法。 方法重写:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样即有了父类方法,方法中 又定义了子类特有的内容。 方法重写的注意事项: 1、子类方法覆盖父类方法,必须要保证权限大于等于父类权限 2、写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢。此时我们可以定义一个抽象类。 **抽象类**:类中包含没有方法体的方法,也可以包含带有方法体的方法。 抽象类的定义格式: abstract class Developer\{ //定义抽象类需要抽象类的关键字 **abstract** public abstract void work(); //抽象方法,也要加abstract关键字(一个方法定义为抽象方法,类也必须是抽象类) \} **抽象类的特点**:1、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。 2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。 3、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。 **抽象类不可以和一些关键字共存:** 1、private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。 2、final,一个类被定义为final类就不可以被继承 3、static,抽象类是不能实例化的,即不能被分配内存;而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以抽象类中不能有静态的抽象方法。(静态属于字节码,不需要对象就可以运行,而抽象方法没有方法体,运行也没有意义,所以不能共存)
还没有评论,来说两句吧...