您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 6 第六天 魔乐java基础视频学习笔记
1、课程名称:面向对象2、知识点2.1、上次课程的主要知识点1、链表:最简单的单向数据链表,链表的思路一定要清楚;2、结合链表实现的数据模型:一对多、简单多对多。2.2、本次预计讲解的知识点1、Java继承性的主要特点及实现;2、方法覆写的操作;3、对象多态性的特点及使用;4、重点掌握抽象类和接口的使用(想理解概念,代码以后再说)。3、具体内容3.1、继承性(重点)继承性是面向对象的第二大主要特征3.1.1、继承问题的引出任何的概念出现都有其自己的目的以及可以结局的问题范畴,那么下面先编写两个程序:Person类、Student类。Person.javaStudent.javaclassPerson{privateStringname;privateintage;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}classStudent{privateStringname;privateintage;privateStringschool;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}}}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicStringgetSchool(){returnthis.school;}}以上两个程序所使用到的概念都是利用之前所学习的知识点来完成,但是现在通过代码的比较就可以清楚的发现一点:代码之中存在了重复,而按照之前所学,这种重复是不可能消除的,在所有的代码之中,最具有重复意义的就是链表类,针对于每一个简单Java类或者是说其他的任何类,都编写一个链表程序,代码量庞大,而且不方便维护。3.1.2、继承的基本概念继承性严格来讲就是指扩充一个类已有的功能。在Java之中,如果要实现继承的关系,可以使用如下的语法:class子类extends父类{}•对于extends而言,应该翻译为扩充,但是为了理解方便,统一称为继承;•子类又被称为派生类;•父类又被称为超类(SuperClass)。范例:观察继承的基本实现classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}}classStudentextendsPerson{//Student类继承了Person类}classTestDemo5{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.setName(张三);stu.setAge(20);System.out.println(姓名:+stu.getName()+,年龄:+stu.getAge());}}现在通过代码就可以发现了,子类(Student)并没有定义任何的操作,而在主类之中所使用的全部操作都是由Person类定义的,就证明,子类即使不扩充父类,也属于维持功能的状态。范例:在子类之中扩充父类的功能classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}}classStudentextendsPerson{//Student类继承了Person类privateStringschool;//子类的属性publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetSchool(){returnthis.school;}}classTestDemo5{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.setName(张三);stu.setAge(20);stu.setSchool(清华大学);System.out.println(姓名:+stu.getName()+,年龄:+stu.getAge()+,学校:+stu.getSchool());}}以上的代码,子类对于父类的功能进行了扩充(扩充了一个属性和两个方法)。但是思考一下:子类从外表看是扩充了父类的功能,但是对于以上的代码,子类还有一个特点:子类实际上是将父类定义的更加具体化的一种手段。父类表示的范围大,而子类表示的范围小。3.1.3、继承的限制虽然继承可以进行类功能的扩充,但是其在定义的时候也是会存在若干个限制的。限制一:一个子类只能够继承一个父类,存在单继承局限。这个概念实际上是相对于其他语言而言,在其他语言之中,一个子类可以同时继承多个父类,就好比如以下代码:范例:错误的程序classA{}classB{}classCextendsA,B{}//一个子类继承了两个父类实际上以上的做法就是希望一个子类,可以同时继承多个类的功能,但是以上的语法不支持而已,但是可以换种方式完成同样的操作。以上的代码是多重继承,实际上以上的做法就是希望一个范例:正确的程序classA{}classBextendsA{}classCextendsB{}C实际上是属于(孙)子类,这样一来就相当于B类继承了A类的全部方法,而C类又继承了A和B的方法,这种操作成为多层继承,结论:Java之中只允许多层继承,不允许多重继承。Java存在单继承局限。严格来讲,按照以上的代码格式,可以一直无限制的继承下去,但是从实际来讲,应该不超过三层。限制二:在一个子类继承的时候,实际上会继承父类之中的所有操作(属性、方法),但是需要注意的是,对于所有的非私有(noprivate)操作属于显示继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)。classA{privateStringmsg;publicvoidsetMsg(Stringmsg){this.msg=msg;}publicStringgetMsg(){returnthis.msg;}}classBextendsA{publicvoidprint(){System.out.println(msg);//错误:msg可以在A中访问private}}classTestDemo6{publicstaticvoidmain(String[]args){Bstu=newB();b.setMsg(张三);System.out.println(b.getMsg());}}此时对于A类之中的msg这个私有属性发现无法直接进行访问,但是却发现可以通过setter、getter方法间接的进行操作。限制三:在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。classA{publicA(){//父类无参构造System.out.println(*************************);}}classBextendsA{publicB(){//子类构造System.out.println(#######################);}}classTestDemo6{publicstaticvoidmain(String[]args){Bstu=newB();//实例化子类对象}}这个时候虽然实例化的是子类对象,但是发现它会默认先执行父类构造,调用父类构造的方法体执行,而后再实例化子类对象,调用子类的构造方法。而这个时候,对于子类的构造而言,就相当于隐含了一个super()的形式。classBextendsA{publicB(){//子类构造super();//调用父类构造System.out.println(#######################);}}现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法。classA{publicA(Stringmsg){//父类构造System.out.println(*************************);}}classBextendsA{publicB(){//子类构造super(Hello);//调用父类构造System.out.println(#######################);}}classTestDemo6{publicstaticvoidmain(String[]args){Bstu=newB();//实例化子类对象}}在任何的情况下,子类都逃不出父类构造的调用,但是,既然super()可以调用父类构造,那么这个语法和this()很相似,那么狠明显,super()调用父类构造的时候,一定要放在构造方法的首行上。疑问?有没有可能性,不让子类去调用父类构造?既然super()和this()都是调用构造方法,而且都要放在构造方法的首行上,那么如果说this()出现了,那么super()应该就不会出现了,所以他编写了如下一段程序。classA{publicA(Stringmsg){//父类构造System.out.println(*************************);}}classBextendsA{publicB(Stringmsg){this(msg,10);//调用本类构造}publicB(Stringmsg,intage){//子类构造this(msg);//调用本类构造System.out.println(#######################);}}classTestDemo6{publicstaticvoidmain(String[]args){Bstu=newB(,20);//实例化子类对象}}在之前讲解this关键字的时候强调过一句话:如果一个类之中有多个构造方法之间使用this()互相调用的话,那么至少要保留有一个构造方法作为出口,而这个出口就一定会去调用父类构造。此时在某种程度上来讲,有一个问题解释了一半:一个简单Java类一定要保留有一个无参构造方法。3.2、覆写(重点)既然现在出现了继承的关系,那么就存在了子类和父类的联系。而在子类之中有可能定义和父类完全相同的方法或属性的名称,这个时候就成为覆写。3.2.1、方法的覆写当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。范例:没有覆写的操作classA{publicvoidprint(){//父类构造System.out.println(helloworld);}}classBextendsA{}classTestDemo6{publicstaticvoidmain(String[]args){Bb=n
本文标题:6 第六天 魔乐java基础视频学习笔记
链接地址:https://www.777doc.com/doc-4406415 .html