黑马程序员——面向对象(下)— 重写、多态、抽象、接口

来源:互联网 发布:apache ddos ip 大量 编辑:程序博客网 时间:2024/05/18 20:10



------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


1、重写和重载

(1)重写override概念

    子父类关系中,子类中存在与父类中方法声明完全一样的方法叫重写

    一句话:除了方法体以外其他都相同,但是子类修饰符权限要大于等于父类

 

(2)重载overload概念

    一个类中或者子父类关系中存在多个同名方法,并且参数列表不同的方法 叫重载

    子父类关系中:子类中的方法和父类中的方法也可以构成重载关系

 

(3)、重写的作用\应用

    当子类需要父类的功能,而子类又有自己特有的方法时,可以重写父类的方法这样既          

    可以使用父类的功能又可以定义子类特有的内容.

    举例:父亲把武功传给儿子,儿子可以改进该武功,或者不改

 

(4)重载与重写的区别

    方法重写:

        子父类中,出现方法声明相同的情况。返回值、方法名、参数列表都要一样。

    方法重载:

        同一个类中或子父类中,方法名相同,参数列表不同,与返回值无关。

 

(5)子父类间重写需要注意的地方

    A:父类中的私有方法不能被重写(就算有相同的,但私有的不能被继承,所以不算重写)

    B:子类方法的访问权限修饰符要大于等于父类的访问权限修饰符

    C:静态的方法只能重写静态方法

                     

2、子父类间构造方法的执行顺序

    (1)子类的构造方法默认都会去访问父类的无参构造方法,子类的构造方法都有默认语句:super()

    为什么呢?

    因为子类会自动具备父类中非私有数据,那么,这个数据只能靠父类完成。所以会先去调用父类的构造方法对数据进行初始化。

 

    注意:构造方法中this() 或 super()一定要是第一行有效代码.

        任何类都直接或间接访问了 Object 类中的构造方法. object 是所有类的超类。

 

(2)如果父类无无参构造,子类构造如何访问父类构造
    A、通过super(参数)调用父类带参构造方法
    B、通过this(..)调用本类构造方法 //一般不用,如果一个子类中所有的构造方法第一句都调用this(..),这样是错误,因为必须有一个构造方法要调用父类的。

    注意:构造方法执行完后会创建该类的对象吗?

        不一定,子类的构造方法第一行调用父类的构造方法时,不会创建对象

 

(3)子父类间静态代码块,代码块,构造方法执行顺序

    1、优先级
        静态代码块 -> 构造代码块 ->构造方法

    2、执行顺序
        父类静态代码块->子类静态代码块->父类构造代码块->父类构造方法->子类构造代码块->子类构造方法 

    注意:当创建多个对象的时候静态代码块每次运行只执行一次

    案例:
   
class Zi{//静态代码块static{System.out.println("zi 静态代码块");}//构造代码块{System.out.println("zi 构造代码块");}public Zi(){System.out.println("zi 构造方法");}}class BlockCodeDemo{public static void main(String[] args){Zi z = new Zi();Zi z2 = new Zi();}}


    3、静态代码块作用

        初始化静态成员变量

 

    4、构造代码块作用 

        A把所有构造方法中共性内容抽取出来,提高代码的复用性

        B初始化非静态成员变量

 

(4)如果父类成员变量被私有,子类如何访问?
    1、子类通过父类提供的get/set方法访问父类的成员变量
    2、通过子类调用父类的带参构造方法。
 

3、final关键字的概述和使用

(1)概述

    很多时候有些方法内容时不能被重写的。而父类方法声明为public就可以被重写。针对这种情况,我们可以做个标记,告诉别人这个不能被重写。


    final关键字:最终的意思,可以修饰类,成员变量,成员方法

 

(2)被final修饰的内容的特点
    A 被final修饰的方法不能被重写
    B 被final修饰的类不能被继承

    C 被final修饰的变量其实是常量























4、多态

(1)概念-什么是多态

    对象在不同时刻表现出来的不同状态。


(2)多态的前提条件

    A、要有继承关系

    B、要有方法重写

    C、要有父类引用指向子类对象(Fu  fu = new  Zi();)

 

(3)多态的成员特点

    A.成员变量:编译看父类(父类有这个变量就不报错),运行也看父类。
    B.成员方法:编译看父类(父类有这个方法就不报错),运行看子类。
    C.因为方法有重写,变量没有。

(4)多态的弊端与好处

    1、父类引用不能直接使用子类对象的特有功能

        如何解决这个问题?

            答:向下转型 (就是强转)

            格式  (子类)父类

    2、好处

        可以提高代码的扩展性和可维护性。

 

5、抽象类和抽象方法

(1)抽象类与抽象方法

    抽象类:被abstract修饰的

    抽象方法:被abstract修饰只有方法声明,没有方法体的方法

        

(2)抽象类的特点

    A、抽象方法和抽象类用关键字abstract修饰
    B、有抽象方法的类一定是抽象类或者接口。抽象类中不一定有抽象方法。
    C、抽象类不能被实例化。(通过多态创建子类对象实例化)

    D、如果一个类继承抽象类,那么这个类要么本身也是抽象类。这个类必须重写父类的所有抽象方法。

 

(3)抽象类作用

    强制子类必须实现某些功能。

 

(4)抽象类的成员特点

    1、成员变量

        可以有成员变量,也可以有常量。

    2、构造方法 

        有构造方法,但是不能通过构造方法创建对象

        问:既然不能被实例化,那么有构造方法有什么用?

        答:可以用于子类访问父类数据前,对父类数据进行初始化。

    3、成员方法

        A、可以有抽象方法,也可以有非抽象方法。

        B、非抽象方法和抽象方法的作用

            抽象方法是为了要求子类做某些事情。

            非抽象方法是为了提高代码复用性,被子类继承。

 

(5)abstract不能和哪些关键字共存

    Final :被final修饰的方法不能被重写,而抽象方法最终都是要被重写的

    Static :如果一个类被static修饰,方法可以被类名.方法名直接调用

    Private:被 private 修饰的方法在子类中是看不见,所以这个抽象方法也是不能被重写的.

 

6、接口

(1)概念

    特殊的抽象类,里面的方法全是抽象方法。


(2)接口特点
    A.接口不能被实例化
    B.接口中的方法要么被子类重写,要么子类也是抽象类或接口。

(3)接口成员的特点

    A、成员变量:接口中只有常量。(变量有默认的修饰符:public static final.)

    B、成员方法:接口中的方法都是抽象的。(方法有默认修饰符public abstract)

    C.构造方法:接口没有构造方法。(常量是静态的,随类的加载而加载,不需要构造方法创建对象来初始化数据)
案例:
 
interface Animal{public abstract void eat();}class Dog implements Animal{public void eat(){System.out.println("eat dog");}}class InterfaceDemo {public static void main(String[] args) {//错误//Animal a = new Animal();Dog d = new Dog();d.eat();//接口多态Animal a = new Dog();a.eat();}}


(4)抽象类和接口的区别,类和接口的关系

    1、抽象类和接口的区别

        抽象类:

            成员变量:可以是变量,也可以是常量。

            成员方法:可以是抽象方法,也可以是非抽象方法。

            构造方法:有构造方法。

        接口:

            成员变量:只能是常量。有默认修饰符:public static final

            成员方法:只能是抽象方法。有默认修饰符:public abstract

            构造方法:没有构造方法,不需要初始化数据。


    2、类与接口的关系

        类与类:

            继承关系,只能单继承,可以多层继承。

        类与接口:

            实现关系,可以单实现,也可以多实现。

            还可以在继承一个类的同时,实现多个接口。

       接口与接口:

          继承关系,可以单继承,也可以多继承。

 

    3、抽象类与接口设计理念的区别

        抽象类被继承,这个类中定义的是整个继承体现的共性内容。

                   体现:is a

        接口被实现,这个接口中定义的是整个体现的扩展内容。

                   体现:like a


------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

0 0
原创粉丝点击