-----------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.接口和接口之间是继承关系。
总结:基本功能定义在类中,扩展功能定义在接口中。