二、继承
1、类与类的关系:单继承,只有一个父类。 (1)继承了父类中非private修饰的成员
直接使用:如果一个子类继承了父类,那么这个子类拥有父类所有的成员属性和方法,即使是父类里有private属性的变量,子类也是继承的,只不过不能使用,也就是说,它继承了,但是没有使用权。 间接使用:我们还是可以通过set和get的方法来间接的访问父类中的private属性的变量。
(2)覆盖 变量的覆盖(变量的隐藏)规则: • 父类的实例变量和静态变量能被子类的同名变量隐藏 • 父类的静态方法被子类的同名静态方法隐藏 • 父类的实例方法被子类的同名实例变量覆盖
还有几点需要注意的是: •不能用子类的静态方法隐藏 父类中同样标示(也就是返回值 名字 参数都一样)的实例方法。 • 不能用子类的实例方法覆盖 父类中同样标示的静态方法。(这点儿请注意,就是变量只会被隐藏 不会被覆盖 ,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏 父类的实例变量,子类的实例变量可以隐藏 父类的静态变量)
方法的覆盖: Java⼦类继承⽗类⽅法的重写(或者覆盖,override): •⼦类重写⽗类⽅法的⽅法名、参数类型必须与⽗类被重写(被覆盖)的⽅法相同;
•⼦类⽅法的返回值类型必须⼩于等于⽗类被重写的⽅法的返回值类型; • ⼦类抛出的异常⼩于等于⽗类⽅法抛出的异常; • ⼦类的访问权限⼤于等于⽗类的访问权限;(⼦类重写了⽗类的⽅法,⼦类的⽅法的权限修饰符不能⽐⽗类低,最好与⽗类⼀致。(public > 默认修饰符>protected>private) ⽗类是public的,那么⼦类只能是public的)
2、接口与接口之间的关系:多继承,可以有多个父接口。 (1)接口的定义:在抽象类中,可以含有普通成员函数,如果一个抽象类中的所有函数都是抽象的,也可以定义为接口。 (2)接口继承多个父接口: •多个父接口之间的抽象方法可以重复。 •多个父接口之间的默认方法如果重复,子接口必须进行默认方法的覆盖重写,而且必须带着default关键字(接口当中的default关键字不可以省略)
3、类与接口之间的关系:一对多 (1)接口和实现类 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。 接口中声明了方法,但不定义方法体,因此接口只是定义了一组对外的公共接口。接口只规定了一个类的基本形式,不涉及任何实现细节。实现一个接口的类,将具有接口规定的行为(方法)。 接口只定义了方法,没定义方法体,接口的方法在实现类实现。 (2)必须实现所有接口的方法 实现接口或继承抽象类的非抽象子类必须实现接口的所有方法或抽象类的所有抽象方法。接口中的所有方法均为抽象方法,抽象类中包含非抽象方法和抽象方法。如果一个非抽象子类实现了接口,那么该子类必须实现父接口的所有方法。如果一个非抽象子类继承了抽象类,那么该子类必须实现抽象类的所有抽象方法。
4、抽象类和接口 (1)抽象类 定义:用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。(含有抽象函数的类称为抽象类,抽象类必须用abstract修饰) 注意 : 抽象类不能被实例化 抽象类必须被重写,除非此类也是抽象类 在抽象类中可以含有补充成员函数
(2)接口 定义:在抽象类中,可以含有普通成员函数,如果一个抽象类中的所有函数都是抽象的,也可以定义为接口。 •在“继承接口”的情况下,一般有另一种说法叫“实现接口”,子类也称为实现类。
说明: 接口中的方法不需要专门指明abstract,系统默认其为抽象函数,在接口中只能包含常量和函数。 接口中的成员函数默认都是public访问类型,成员变量默认是用public static final标识的,所以接口中定义的变量是全局静态常量。 接口可以通过extends继承另一个接口,类通过关键字implements来实现一个接口。 一个类可以在继承一个父类的同时,实现一个或多个接口,多个接口用逗号隔开。格式如下: class 子类 extends 父类 implements 接口 1,接口 2,...{} 关键字extends必须位于关键字implements之前
5、final关键字
1 .final关键字修饰成员变量,成员变量就不能被修改,即常量。
2. final关键字修饰成员方法,最终方法,不能被重写。
3. final关键字修饰类,最终类,不能被继承。
三、多态
•定义: 了多态是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
•对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。
•Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。