黑马程序员—— Java 基础 面向对象之继承 (复习)

来源:互联网 发布:vb.net加载dll 编辑:程序博客网 时间:2024/05/01 19:40

 -----------android培训java培训、java学习型技术博客、期待与您交流!------------

一、面向对象特征 之 继承

1.理解为什么会出现继承?

当我们将对象用类描述后,发现某一些类中依然存在一些共性的描述,这时我们可以将这些共性的内容提取出来,再定义一个类来单独进行描述,只要让这些类与提

取出来的类存在关系就可以了。

例:我们有两个类 Student  和 Worker 他们中定义了一些共性的内容,比如姓名和年龄。

这时候我们就将姓名和年龄进行抽取,定义在一个新类Person中,让Student 以及和Worker 与Person类存在关系就可以了。

这个关系就是:继承


关键字:extends 


继承的代码示例:

class Person{     String name ;     int age;}class Student extends Person{        public void study(){}}class Worker extends Person{       public void work(){}}


这时,我们将Person称为父类,Student 和 Worker 称为子类。

父类的由来:其实是由多个类不断向上抽取共性内容而来的。

继承的好处:

1.提高了代码的复用性。

2.继承让类与类之间产生了关系,有了这个关系后,才有了面向对象的另一个特性:多态。

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

  2.在Java中只支持单继承,不支持多继承。单继承指的是:一个子类只能继承一个父类。

Java中为什么不支持多继承?多继承会带来安全隐患,当一个类同时继承两个父类时,两个父类中假如有相同的功能,那么子类对象调用该功能时,子类对象不确定要运行哪一个,所以不能出现多继承。


继承体系:

在理解继承体系时,必须理解多重继承(注意不是多继承)。例如 A继承B , B继承C, C继承D 这就是多重继承。

多重继承的出现就有了继承体系,继承体系中最顶层的父类是由其子类不断向上抽取出来的。简单说,最顶层的类中包含了该体系中最基本最共性的内容。

那么我们使用时,如何使用一个继承体系中的功能呢?

想要使用体系,先查阅体系中父类的描述,然后建立子类对象。因为父类中定义了该体系中的共性功能,通过了解父类功能就能了解该体系的基本功能,那么这个体系已经可以基本使用了。在具体调用时,创建最子类的对象,因为有可能父类不能创建对象,创建子类对象可以使用更多的功能,包括基本的也包括特有的。


子类对象如何调用父类的功能呢?

1.成员变量

子类要想使用父类的成员变量,通过关键字 super 实现。

关于this和super

this:代表本类对象引用。

super:代表该子类所属父类对象的引用。

2.成员函数
子类对象可以直接调用父类中的方法,但有个特殊情况:当子父类中出现了一摸一样的方法时,建立子类对象时会调用子类的方法。这种情况称为 函数的覆盖。

什么时候使用覆盖?

当子类继承父类时,子类就已经沿袭了父类的功能。子类虽有该功能,但功能的内容却和父类的不一致,这是可以使用覆盖。

3.构造函数子类对象在初始化时,子类的构造函数会默认优先访问父类的空参构造函数,因为在子类的第一行都含有一个隐式的语句: super();

如果父类没有空参构造函数,那么子类必须在构造函数内自己定义super 语句来实现访问父类的构造函数。super();

  为什么要定义在第一行?因为子类继承父类,会继承到父类中的数据,所以要将父类先加载到内存中,在加载子类,才能使用父类的成员。


二、final 关键字

继承有一个弊端:打破了封装性。

解决办法: 关键字 final ,最终。

final 作为一个修饰符,可以修饰类,变量,函数

final 特点:
1.被final 修饰的类,不能被继承

2.被final 修饰的方法不可以被复写。

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

在Java中的常量:

例:final int X = 4 ; // 定义一个常量 4

常量书写规范:所有字母都大写,如果是多单词组成,单词之间用下划线练接。


三、关键字abstract

abstract :抽象。

1.抽象的由来

当多个类中出现相同功能,但功能的主体不同,这时可以向上抽取,这时只抽取功能定义,不抽取功能主体。

对于这种方法,我们就用 关键字abstract 来标识一下。该方法称为抽象方法。

注意:抽象方法只能存在于抽象类中,而且abstract只能修饰方法和类,不能修饰变量。

抽象的代码示例:


avstract class Student{  abstract void study();}//定义一个抽象类,该类中有一个抽象方法。class BaseStudent extends Student {       void study(){             System.out.println("baes study");      }}//定义子类覆写了父类中的抽象方法class GoodStudent extends Student{       viod  study(){          System.out.println("good study");   }}//定义子类覆写了父类中的抽象方法



2.抽象类的特点

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

2.抽象方法和抽象类一定必须被abstract修饰。

3.抽象类不能用new 建立对象,因为调用抽象方法没意义。

4.抽象方法要被使用,必须要是子类覆写所有的抽象方法后,建立子类对象调用,如果子类仅仅覆盖了部分抽象方法,那么该子类还是抽象类。

总结:抽象类和一般类没有太大不同。该如何描述事物,就如何描述事物。只不过该事物出现了一些看不懂的东西,这些不确定的部分,也是该事物的功能

   需要明确出现。但是无法定义主体。通过抽象方法来表示。抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法。

特殊:抽象类中可以不定义抽象方法,这样做仅仅是为了不让该类创建对象。

抽象类不可以实例化。


四、接口

1.什么是接口?

当抽象类中的方法全部都是抽象的时候,那么该类可以通过接口来表示。也就是可以将接口理解为一个特殊的抽象类。

2.接口的定义

通过关键字 interface 来定义接口

接口在定义时,格式特点:

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

2.接口中的成员都有固定的修饰符。常量:public static final      方法:public abstract

总结:接口中的成员都是public 的

3.如何使用接口?

接口里面的成员全是抽象的,所以接口不能创建对象。

所以,需要被子类实现,子类将其所以的抽象方法覆盖后,子类才可以实例化。

子类要实现接口,必须通过 关键字 implement   

实现接口的代码示例:

interface Inter{public abstract void show();}class InterDemo implements Inter{         viod show(){         System.out.println("run");     }}

接口的特点:

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

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

3.接口可以用来多实现。

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

5.接口和接口之间是继承关系。

总结:基本功能定义在类中,扩展功能定义在接口中。

0 0
原创粉丝点击