黑马程序员——JAVA基础之继承

来源:互联网 发布:宁波每日成交数据 编辑:程序博客网 时间:2024/04/27 00:32

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

继承

    继承:类与类之间的所属关系,使子类拥有父类的一些属性或方法

    关键字:extends 继承,用于类与类,接口与接口之间

    格式: class A extends B{}     

    特点:

            1.提高代码复用性

            2.让类与类之间产生了关系,有了这关系,才有多态的特性

    注意:

            1.千万不要为了获取其他类的功能简化代码而继承,必须是类与类之间有所属关系才可以继承,所属关系:is a

               最简单判断所属关系的办法,先继承一下,然后判断父类中的东西是不是子类都应该具备的,如果不是则不能继承

            2.Java中只支持单继承,因为多继承容易带来安全隐患,多继承通过另一种形式体现(实现多个接口)

               因为当多个父类中定义了相同功能但功能内容不同时,子类对象不确定要运行哪一个

            3.Java支持多层继承,也就是一个继承体系

    如何使用一个体系中的功能?

            1.先要查阅父类的描述,因为父类中定义了该体系的共性功能

            2.通过了解共性功能可以了解该体系的基本功能,那么这个体系就可以基本使用了

            3.在具体调用时,要创建最子类的对象

               (1)因为有可能父类不能创建对象,如抽象类

               (2)创建子类对象可以适用更多的功能,包括基本的,也包括特有的

            简单一句话就是查阅父类功能,创建子类对象使用功能

    代码实例:

class Fu{    int x = 4;    public void function(){        System.out.println(x);    }}class Zi extends Fu{}public class Demo{    public static void main(String args[]) {        Zi zi = new Zi();        zi.function();//由于子类继承了父类,所以子类可以继承父类的非私有成员    }}

类成员特点

    关键字:super 代表父类对象,与this使用几乎相同

    变量:如果子父类中出现了非私有的同名成员变量,子类访问本类中成员变量用this,访问父类中成员变量用super

    函数:

            1.当子类父类出现一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容

            2.如同父类的函数被覆盖一样,这种情况是函数的另一个特性:覆盖

    构造函数:

            1.在对子类进行初始化时,父类的构造函数也会运行

            2.子类的构造函数默认第一行有一行隐式的语句super(),会默认访问父类中无参构造函数

    为什么子类一定要访问父类的构造函数:

            因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的

            所以子类在对象初始化时,要先访问一下父类中的构造函数。

            如果要访问父类中指定的构造函数,可以手动的定义super语句来指定

覆盖 

    覆盖:当子类继承了父类,沿袭了父类的功能到子类中

                子类具备该功能但是功能内容却和父类的不一致这时没有必要定义新功能

                而是使用覆盖特性,保留父类的功能定义,并重写功能内容

    注意:

            1.静态只能覆盖静态

            2.重载只看同名函数的参数列表,重写子父类方法要一模一样

            3.子类覆盖父类必须保证,子类权限大于等于父类权限才可以覆盖,否则编译失败

    代码实例:

class Fu{int x = 4;public void function(){System.out.println(x);}}class Zi extends Fu{public void function(){System.out.println("子类覆盖了父类的方法");}}public class Demo{public static void main(String args[]) {Zi zi = new Zi();zi.function();}}

Final关键字

    final:最终,可以修饰类,变量,函数

    特点:

            1.被final修饰的类不可以被继承

            2.被final修饰的方法不能被复写

            3.被final修饰的变量是一个常量,只能赋值一次,既可以修饰成员变量又可以修饰局部变量

    注意:

            1.在描述事物时,一些事物的值是固定的,那么为了增强阅读性,都给这些值起个名字,而这个值不需要改变所以加上final修饰

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

抽象

    抽象:就是不完整的,不确定的描述

    由来:当多个类中出现相同功能,但是功能主体不同时,可以向上抽取,只抽取功能定义而不抽取功能主体

    关键字:abstract 抽象,用于修饰方法,类

    格式:abstract class A{ //抽象类

                       public abstract  void function(); //抽象方法,没有方法体

               } 

    特点:

            1.抽象方法一定定义在抽象类中

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

            3.抽象类不可以用new创建对象,因为调用抽象方法没意义

            4.抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类调用

            5.如果子类只实现了部分抽象方法,那么该子类还是一个抽象类

            6.抽象可以强制子类做一些事情,必须要实现某个方法

            7.抽象类中可以不定义抽象方法,这样做仅仅是不让该类创建对象,但是不多见

    与一般类的区别:

            1.抽象类和一般类没太大的不同,该如何描述事物就如何描述事物

            2.抽象类只是出现了一些不确定的部分,也是该事物的功能,需要明确出现,但是主体无法确定

            3.抽象类比一般类多了抽象函数,就是可以在类中定义抽象方法,也可以不定义

            4.抽象类不能自己创建对象,而一般类可以

    代码实例:

abstract class A{ public abstract void  function();}class B extends A{@Overridepublic void function() {System.out.println("实现抽象类A的方法");}}

接口

    理解:可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示

    关键字:interface 修饰接口,如同class修饰类

    格式:interface A{} 

    关键字:implements 用于确立类与接口之间的实现关系

    格式:class A implements B{} (B为已定义的接口)

    成员特点:

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

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

                常量:public static final

                方法:public abstract

            3.接口中的成员都是public的

    注意:

            1.接口是不可以创建对象的,因为有抽象方法需要被子类实现

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

    特点:

            1.接口是对外暴露的规则

            2.接口是程序扩展的功能

            3.降低了耦合性,

            4.接口可以被类多实现,也是多继承的转换形式

            5.类与接口之间是实现关系,而类可以继承一个类同时实现多个接口

            6.接口与接口之间有继承关系

    代码实例:

interface A{int x= 0; //不写修饰符 ,默认为 public static finalvoid  function(); //不写修饰符,默认为public abstract }class B implements A{@Overridepublic void function() {System.out.println("实现接口A的方法");}}


0 0
原创粉丝点击