面向对象——三大特性之——继承(一)

来源:互联网 发布:xilinx linux系统类型 编辑:程序博客网 时间:2024/05/16 19:17

将对象中的共性内容不断地向上抽取,就形成了关系,就有了关系,就有了继承,有了子父类。

  所谓的: 超类,基类——父类;

【继承的好处】提高了代码的复用性,让类与类之间产生了关系。

 

单继承:一个类只能有一个父类。一个儿子只能有一个父亲。

多继承:一个类可以有多个父类。一个儿子有多个父亲。(在Java中不允许,但用接口可以改良!)

【继承的特点】——Java中只能单继承,


【Java不直接支持多继承的原因】——会产生调用的不确定性。

【Java支持多层继承】这样就出现了继承体系。

【如何去使用一个继承体系中的成员?】

   1.查阅该体系中的顶层类的内容。因为通过该类可以了解该体系的基本功能。。

   2. 创建最子类的对象,即可以调用共性的基本功能,也可以使用子类的特有功能。

   简单说:看父类内容,建子类对象使用。


【什么时候定义继承呢?】

   必须是事物之间存在着所属关系时,才定义继承。

   所属关系:xxx是zzz中的一种。用英文表示  is  a关系。


【继承误区】不要仅仅为了提高复用,为了方便获取其他类中的内容而去继承。

【继承中成员的特点】

   1. 成员变量;

   2. 成员函数;

      当子父类中出现了一模一样的方法时,会发生一个函数的特性:覆盖 or 复写 or 重写。

【覆盖在使用时候的注意事项】

      1. 子类覆盖父类时,必须要保证覆盖方法的权限大于等于被覆盖的方法的权限。

         【权限】——public ,private , 默认权限(小于公有大于私有)

         @@@@@. 参与覆盖的两个方法必须保证:返回值类型,参数列表都一样;

         @@@@@ 构造方法的重载:与返回值类型无关,只要保证参数个数 和 参数类型不一样就可以保证重载。

2.  覆盖方法有静态修饰时,静态只能覆盖静态,或者被静态覆盖。在写法上注意这个事项。


【覆盖 代码体现——】

/*

覆盖的举例:

描述一个手机,有一个来电显示功能。

思路:

先让新电话继承已有电话就可以获取其功能.

继承了父类中的功能后,想要对已有的功能进行内容的改变。

意味着功能声明不变,将内容在子类中进行自定义。这种定义就是覆盖。

*/

class Phone{void show(){System.out.println("number");}void call(){System.out.println("我想给,女朋友打个电话!");}}class NewPhone extends Phone{void show(){System.out.println("name");super.show();}}class ExtendsDemo {public static void main(String[] args) {NewPhone p = new NewPhone();p.show();}}

【构造函数】  

 

【构造函数】——

特点:

1. 函数名与 类名相同

2. 不用定义返回值类型;

3. 没有具体的返回值;

 

【什么是构造函数】

创建的每个对象都是一个实体,每个实体必须要进行初始化后才可以使用。实体的初始化是需要通过动作完成的。这个动作就是构造函数。

 

【构造函数作用:】

给对象进行初始化。

 

【特点:】任何用class 定义的类中,都有一个默认的空参数的构造函数。用于给该类对象进行初始化。

如果该类中指定了具体的构造函数,那么默认的构造函数就被覆盖掉,没有了。

 

【构造函数和 一般函数的不同:】

1. 书写格式上不同;

2. 运行上的不同。

构造函数,是在对象一旦创建就被调用了。而且只执行一次。

一般函数,是对象创建完成后,需要时再调用,可以调用多次。

 

一般函数不能调用构造函数。构造函数是初始化的,初始化结束后,构造函数就结束。

 

3. 构造函数里有 return 语句的,用于结束构造函数的初始化!

 

当一个类中存在着多个构造函数时,他们的存在形态是重载。

 

【构造函数什么时候用:】

当描述事物时,该事物一旦存在就具备着一些属性和行为;

那么  就将这些内容定义在构造函数中。



【子类的实例化过程:】

      其实在子类的所有构造函数 中的第一行,默认多有一条隐式的语句,就是super(  );

     也就是说子类都会访问默认的父类的空参数的构造函数。


       【为什么子类的构造函数都要去默认访问父类的构造函数呢?】


        因为子类继承了父类,可以访问父类中的已有的一些属性。

在子类中进行实例化的时候必须要为父类中的属性分配空间并要进行初始化。

所以必须要访问一次父类的构造函数,看看父类是如何对其属性进行初始化的。

所以子类要实例化对象时,必须要先看父类的初始化过程。

结论:父类的构造函数,既可以给本类对象初始化,也可以给子类对象初始化。


原创粉丝点击