一:继承
1.继承概述
继承是面向对象的核心特性,是面向对象的学习重点。同时继承是代码复用的重要方式,可以表示类与类之间的关系,是所有面向对象语言不可缺少的组成部分。
2. 继承概念
当一个类的属性与行为均与现有类相似,属于现有类的一种时,这一个类可以定义为现有类的子类。
或者换成相反的角度来看,如果多个类具有相同的属性和行为,我们可以抽取出共性的内容定义父类,这时再创建相似的类时只要继承父类即可。
子类拥有父类的所有属性与方法,无需重新定义。并且可以直接使用非私有的父类成员。
从类与类之间的设计关系来看,子类必须属于父类的一种时,才会继承。
我们在完成一个庞大项目体系的时候,都是将共性的内容抽取出,后续构建过程是从各种父类“向外”扩散的。
下例展示了一个继承关系
动物类可以有姓名、年龄的成员变量,可以有吃饭、睡觉的方法。
所有猫科与犬科均有动物的成员变量与成员方法,且猫科与犬科均属于动物,所以猫科与全科均可以继承动物类。
猫科可以在动物的基础上再添加抓老鼠的方法
犬科可以在动物的基础上再添加看门的方法
犬科与猫科仍可以继续出现子类,如波斯猫、巴厘猫、沙皮狗、斑点狗等,而其子类仍可以再出现该品种的特性。
3. 继承定义
class 子类 extends 父类{
//父类的非私有方法与属性均继承过来
}
如:
父类的定义:
class Person{
private String name;
public void eat(){
System.out.println(“吃饭”);
}
get/set方法
}
子类继承父类的定义:
class Chinese extends Person{}
4. 继承使用
继承关系的产生通常是为了定义出功能更为具体、更为强大的子类。所以,定义子类后,一般创建子类对象使用。子类可以直接使用父类非私有的成员变量与成员方法
(注:如果成员变量没有使用private修饰,则子类也可直接访问。)
子类的使用:
class Test extends Person{
public static void main(String[] args) {
Person c = new Person();
c.setName(“张大力”);
String name = c.getName();
System.out.println(name);//打印结果为张大力
c.eat(); //打印结果吃饭
}
5.方法重写概念与格式
概念:当子类继承父类后,拥有了父类的成员并可以直接调用父类非私有方法。如果子类认为父类提供的方法不够强大,子类可以按照子类自身的逻辑重新定义继承过来的父类方法,这个重新定义一个方法的过程叫做方法重写。
格式:
子类中定义与父类一样的方法便将父类的方法重写了。此时,当创建子类对象,调用方法时,会调用子类重写后的方法。如:
类的定义:
class Person{
public void eat(){
System.out.println(“吃饭”);
}
}
class Chinese extends Person{
public void eat() {
System.out.println(“按照中国的习惯,使用筷子吃”);
}
}
子类的使用:
class Test{
public static void main(String[] args) {
Chinese c = new Chinese();
c.setName(“张大力”); //父类继承方法直接调用
String name = c.getName(); //父类继承方法直接调用
System.out.println(name); //打印结果为张大力
c.eat(); //方法重写后调用的为重写后的方法
//打印结果:按照中国的习惯,使用筷子吃
}
}
Java中方法重写规则
a)子类重写方法时,在声明前加@Override可检测该方法是否为重写的方法
b)访问权限相同或子类方法访问权限更大(访问权限顺序public>默认)
c)方法名称必须相同
d)参数列表必须相同
d)返回值为基本类型时必须相同
e)返回值为引用类型时相同或子类小(了解)
5. 继承注意事项
Java只支持单继承,不支持多继承。即只能有一个父类。
父类可以继续有父类。
所有类均有父类,只有Object类没有父类。
在所有使用父类类型的地方均可以传入其子类对象。
二:抽象类
抽象类用来描述一种类型应该具备的基本特征与功能, 具体如何去完成这些行为由子类通过方法重写来完成,如:
犬科均会吼叫,但属于犬科的狼与狗其吼叫内容不同。所以犬科规定了有吼叫功能,但并不明确吼叫的细节。吼叫的细节应该由狼与狗这样的犬科子类重写吼叫的方法具体实现。
类似上边犬科中的吼叫功能,并不明确实现细节但又需要声明的方法可以使用抽象方法的方式完成。即抽象方法指只有功能声明,没有功能主体实现的方法。
具有抽象方法的类一定为抽象类。
那么犬科就可以定义为抽象类,吼叫方法为抽象方法,没有方法体。
2. 抽象定义格式
使用abstract修饰抽象类与抽象方法
l abstract在class前修饰类
l abstract在访问权限后,返回值类型前修饰方法,方法没有方法体。
如:
abstract class Person {
public abstract void eat();
}
3. 抽象类&抽象方法的使用
抽象类无法直接创建对象,只能被子类继承后,创建子类对象。
子类需要继承抽象父类并完成最终的方法实现细节(即重写方法,完成方法体)。而此时,方法重写不再是加强父类方法功能,而是父类没有具体实现,子类完成了具体实现,我们将这种方法重写也叫做实现方法。
4. 抽象类注意事项
l 抽象类的意义
抽象类往往用来表示对问题领域进行分析、设计中得出的抽象概念。其存在的意义在于其设计性、复用性与扩展性。
抽象类方便了具体类的定义。
抽象类仅是对功能和属性的声明,表示这类事物应该具备这些内容。限制程序员不能直接创建该抽象类对象,必须定义其子类才可使用。如我们可以听一只狼的叫声,也可以听一只狗的叫声,但是如果我们听一只犬科的叫声就显然不合适了。
2 抽象类继承细节
只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。如果存留未实现的抽象方法则该子类仍为一个抽象类,无法创建对象。
抽象类不一定包含抽象方法。
抽象类可以有非抽象方法。