黑马程序员-Java基础总结05——继承(1)

面向对象——继承(1)

-------android培训java培训、期待与您交流!----------

内容: 继承(类之间五种关系)、复写、抽象方法(模板方法设计模式)、多态。

1、继承的概述:

  A、当多个类中存在相同属性和行为时,将这些共性内容向上抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承该类即可。

   B、多个类可以称为子类,共性抽取成单独的这个类称为父类或者超类(Super)

   C、子类可以直接访问父类中的非私有的属性和行为,但是不能访问父类中私有(private)内容;【私有化封装,仅提供子类等所需的功能】

   私有内容跟其他父类内容存在于子类内存,只不过是没有权限使用该私有内容

   D、通过extends关键字让类与类之间产生继承关系:class SubDemoextends Demo{ }

特点与作用:   a、继承的出现提高了代码的复用性。

b、继承的出现让类与类之间产生了关系,提供了多态的前提。

类中的成员:  变量、函数(构造函数与一般函数)等。

 

2、继承的特点:

   AJava只支持单继承,不支持多继承(子类不可以有多个父类,避免出现重复方法)

   B、支持多层继承(继承体系,即子类的父类也可以有父类);

(为弥补该功能,Java支持多实现(实现接口)功能,之后会学。)

C、继承是继承父类的全部非私有的成员(变量和方法),所以不要仅因需要单功能而继承;

多层次继承出现的继承体系中,通常看父类中的功能,了解该体系的基本功能,建立子类对象即可使用该体系功能

 (即子类创建的对象可使用父类的继承体系中的功能,因为这些功能是共性抽取成的)

 

3、类与类之间的五种关系:

A、泛化(Generalization):

   即继承,是说子类获得父类的功能的同时,还可以扩展自己的功能。

   Java代码中表现为:extendsimplements

B、依赖(Dependency) :

   两个相对独立的类型(AB),当A负责构造B时,AB形成依赖关系,即A使用B

   Java代码中的表现为局部变量、方法的参数以及对静态方法的调用。

C、关联: (包括聚合与组合)

   两个相对独立的类型(AB),当A对象持有B对象的时候,形成关联关系。

   关联分为有两种特殊的形式:聚合(Aggregation)和组合(Composition),聚合和组合仅概念上区别,而Java代码实现上没有区别。

   聚合:指的是整体与部分的关系,部分可以离开整体而存在

   组合:同样式整体与部分的关系,但是组合中整体和部分具有统一的生存期,即整体对象不存在,部分对象也将不存在;部分不能离开整体而存在。

   Java代码中,表现为成员变量。

 Java基础总结05——继承(1)

4覆盖(重写):当子类出现与父类出现相同的函数(但数据内容不同)时,子类调用该函数时会运行子类函数的内容,这就相当于重写(覆盖)父类的方法。    

特点:有利于功能的扩展,即延续父类功能,定义子类特有内容。

【这是软件更新扩展的基础,Java中的继承和实现等都使用。】

注意:

1、子类覆盖父类方法,保证子类的权限必须大于父类,才能覆盖,不然编译失败;

2、静态只能覆盖静态(不常用,主要是静态不能覆盖非静态)。

 

【重载:只看同名函数的参数列表;

重写:子父类方法(参数列表与返回值类型)一样,方法体内容不同。】

 

子类的实例化过程(子父类中的构造函数):

1、子类中所有的构造函数默认都会访问父类中空参数的构造函数

2、因为每一个构造函数第一行都有一条默认的语句super( ); [因为先初始化父类数据]

3、子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。

4、当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数

 

5super关键字            (和this用法一致)

super:代表的是父类对象的引用

this:代表的是本类对象的引用

 

当子类要调用父类已定义好的功能时:super关键字的应用)

super(参数); 调用父类构造函数;      super.方法名;  :调用父类方法;

构造函数中super( );的作用:调用父类的构造函数,初始化父类继承的对象数据


构造函数中的super()this( )语句:

this();super( );两者不能同时出现在同一构造函数中:

1、因为两者都要处于构造函数的第一行;

2、而两者都处于第一行的原因是初始化动作要先执行。

(不过在继承中因为每个子类构造函数都有默认super( )语句,当存在this( )语句时它会在访问其他子类构造函数的同时也实现super( );语句的动作。)

 

5final关键字: 最终/终极,属于一个修饰符。

1final可以修饰类,方法,变量;

2final修饰的类不可以被继承

3final修饰的方法不可以被覆盖

4final修饰的变量是一个常量只能被赋值一次

5内部类定义在类中局部位置上时,只能访问被final修饰的局部变量


应用: 1、继承打破了Java类间的封装性,而final修饰类,可禁止该类被随意继承重写

             2、同理1,仅修饰类中的方法,禁止该方法被复写。

             3、修饰变量为常量,方便于该常量的使用和理解。

[作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过_连接。]

类的修饰符:publicfinal与默认无修饰符。

 

6抽象类: 当多个类中出现相同功能,但是功能主体不同,这是可以进行向上抽取。

这时,只抽取功能定义,而不抽取功能主体。封装成为抽象类,类中有抽象方法。

 

抽象类的特点:

1抽象方法一定在抽象类/接口中。

2,抽象方法和抽象类都必须abstract关键字修饰

3,抽象类不可以用new创建对象(即不可以被实例化)。因为调用抽象方法没意义。

4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。 如果子类只覆盖部分抽象方法,那么该子类还是一个抽象类。)

 

abstract关键字,不能共存和哪些关键字:

1final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。

2private:修饰私有化方法,不能被子类所知,就无法被复写。而抽象方法必需要被复写。

3static:修饰的方法,直接类名调用即可,无需创建对象,但是抽象方法运行没意义。

 

抽象方法:

抽象方法只有方法声明,没有方法体,定义在抽象类中。

格式不同于一般方法:        例:abstract void study( );      

[  修饰符abstract 返回值类型函数名(参数列表)]

如果是{ }则属于一般方法,只不过是方法体为空,则不能用abstract修饰

(当类中存在抽象方法,该类就是抽象类,必须用abstract修饰,抽象类可以存在一般方法)

PS当抽象类中所有的方法都为抽象方法时,该类或称为接口(implements )

 

抽象类与一般类的区别:           (大体上类似)

    1、抽象类不能被实例化(实例化的是已复写全部抽象方法的子类对象);

   2、抽象类比一般类仅多了抽象函数,就是在类中可以定义抽象方法(函数)

 

抽象类中存在构造函数: 因为抽象类是一个父类,要给子类提供实例的初始化。

特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象(不能被实例化)

 

7、模板方法设计模式

当定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分封装成单独的方法暴露出去,由该类的子类去完成。

(不确定部分的方法可根据需要设为抽象方法或一般方法)

示例 :

abstract class GetTime {

      public final void getTime() { //计时功能,通过添加final避免其功能被子类复写;

             ……………………….(方法代码);

      }

      public abstract void runcode( );   //抽象方法强制继承的子类复写;

}

class SubTime extends GetTime {

      public void runcode(){           //复写父类抽象方法;

             ..................................(特有方法代码);

      }

}

 

8、接口: 初期理解,可以认为是一个特殊的抽象类

      当抽象类中的方法都是抽象的,那么该类可用接口的形式来表示

class用于定义类;   interface用于定义接口

 

格式:   interface  接口名{ ……..(一个以上抽象方法)  }

接口定义时,格式特点:

1,接口中常见定义:常量,抽象方法

2接口中的成员都有固定修饰符:

  常量:public static final 数据类型 数据类型名(因为是常量,所以所有字母大写);

  方法:public abstract返回值类型方法名( );

记住:接口中的成员都是public的。

接口的出现多继承通过另一种形式体现出来,即多实现

 

接口: (与抽象类共性)不能直接创建实例对象,因为有抽象方法,需要被子类实现

子类对接口中的抽象方法全都覆盖后,子类才可以实例化;否则子类是一个抽象类。

 

注意:

接口与接口之间存在多继承、多实现,而类与类之间只能存在单继承、多实现。

1、接口间的允许多继承是因为接口的方法:只有方法声明、没有方法体     

2、但是不允许一个接口多继承的(父类)接口间存在同名但返回值类型不同的情况,因为出现这种情况,当类实现该接口无法判断实现哪一种情况。

 

接口特点 :        1、是对外暴露的规则

2、是程序的功能扩展

3、接口的出现降低耦合性

4、接口可以用来多实现。(举例,如:USBPCI、主板、插座)

 

9多态      

定义:  某一类事物的多种存在形态。

程序中体现:   父类或者接口的引用指向或者接收自己的子类对象

好处和作用:   多态的存在提高了程序的扩展性后期可维护性

 

总结: 一、使用父类类型的引用指向子类的对象

      二、该引用只能调用父类中定义的方法和变量

      三、如果子类中重写父类中方法,那么在调用该方法时,将会调用子类中的这个方法,这叫做动态调用/动态绑定

      四、变量不能被重写(覆盖),“重写”的概念只针对方法。

注意:

  1当子类中有与父类同名的变量时,子类对象会优先访问本类中的变量

2如果要直接给从父类继承的变量重新赋值,则需要在子类的方法中才能进行

因为不能直接类体中给变量进行赋值,只能在变量声明同时进行初始化赋值

 

多态3个必要条件:         (这三个点缺一不可,其中只有父类拥有的方法才能)

1.继承(或实现)2.重写(覆盖)[如果是重载也不行,因为与父类拥有的方法不同]

3.父类引用指向子类对象Father f = new Child( );  其中类Child为类Father的子类)。

【老话,看视频或看代码文件DuoTai.java观察、理解】

 

多态中成员:                

1、成员函数的特点:

编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。                    运行时期:参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。(也可用动态绑定理解)

2在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)

3在多态中,静态成员函数的特点:

无论编译和运行,都参考左边

 

概括理解:

                    [父类的引用指向子类的对象   Father f = new Child( );  ]

即:多态中   非静态成员函数是动态绑定哪个类的对象就运行该类的方法

      成员变量以及静态成员函数都是静态绑定哪个类的引用就运行该类的方法

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值