目录
1.基本概念
1.1对象
对象是一个状态和行为的集合。
状态是指包含在对象里的数据。在Java中,这些被表示为字段。
而行为是对象所支持的操作。在Java中通过方法来实现。
1.2类
每个对象中都包含类,类定义了接口和实现,是应用程序编程的接口,在其中定义了功能如何具体的实现。
2.接口
什么是接口?在接口中,所有的方法只有定义,但是没有具体的实现。其具体的实现需要通过其他类来实现。一个接口可以有多个实现,这是实现ADT的一种方式。在实现接口的类中,通过关键字implements来注明实现了哪个接口。
需要注意的是,在接口中不包含构造器。因为在接口中不存在具体的实现,需要通过其他的类来实现。而其他的类的名字无法预知,同时接口又支持多实现,所以无法保证所有实现类中都包含同名的构造函数。另外,不能使用构造函数,却可以使用工厂的方法来创建实例。
接口中的方法只有定义无具体实现,但是,我们可以通过default方法来在接口中实现某些功能。这样,我们就可以把某些通用的重复功能统一在接口中实现,可以大大的简化代码。
3.封装与信息隐藏
一个设计良好的模块其内部的具体实现应该是被隐藏的,使用的人只知道具体的操作,但对其内部的代码细节一无所知,这就是封装。
这样有什么好处呢?可以将复杂的系统分解成一个个小的模块,分离地对模块进行开发维护等,可知这样大大加快了操作的效率,并且各模块之间可以并行展开。
通过不同的关键词可以实现对内部成员的可见性的控制。
4.继承和重写
关于继承,比如接口可以继承接口,类可以继承类等,继承是为了实现代码的重用。
4.1重写
一个允许被重写的方法被称为可重写方法,在Java中,若没有特殊说明,默认为可重写的。
若子类中只允许添加新的方法,但不允许重写类中的方法,则为严格继承。一个被final关键字标注的方法就不可以被重写。
重写的子类与父类有着同样的姓名、参数、返回值类型等,而在使用时具体调用哪个方法在编译阶段是无法判断出来的,需要在运行时根据具体情况来选择。
4.2抽象类
只有定义但没有实现的方法被称作抽象方法,它被用关键字abstract标注出来。而具有抽象方法的类就为抽象类。
抽象类不可以实例化,需要通过子类来具体实现。对于子类中共性的方法可以放在抽象类中来实现。这是抽象类与接口最大的不同之处。、
5.多态,子类型,重载
5.1三种多态
- 特殊多态 一个方法可以有多个同名的实现
- 参数化多态 一个类型名字可以代表多个类型
- 子类型多态 一个变量名字可以代表多个类的实例
5.2特殊多态
如果一个函数适用于很多的类型,并且有可能有多种类型的实现,就会有特殊多态。
public class OverloadExample {
public static void main(String args[]) {
System.out.println(add("C","D"));
System.out.println(add("C","D","E"));
System.out.println(add(2,3));
}
public static String add(String c, String d) {
return c.concat(d);
}
public static String add(String c, String d, String e){
return c.concat(d).concat(e);
}
public static int add(int a, int b) {
return a+b;
}
}
这里涉及到重载的概念。重载是允许多个方法有同样的名字,但有不同的参数列表和返回值类型。在编译阶段时,就根据各个方法间的不同确定调用的具体是哪个方法。这样编写代码就方便于使用者的使用。对于不同类型的相类似操作,不需要记住额外的方法名来具体区分每种方法,而交给编译器去判断。
对于重载来说,参数列表必须是不相同的,这是判断具体选用哪个方法的依据。
5.3参数化多态
如果一个方法对于多种类型都有同样的行为时,就可以用统一的变量类型来代表多种类型,在运行时根据具体制定的类型来操作。
在Java中使用泛型变量来代表多种类型,有三种形式,即泛型类,泛型接口,泛型方法。
5.4子类型多态
在Java中,一个类只能继承一个父类,但却可以实现多个接口。即单继承,多实现。
需要注意的是,在Java中声明一个子类型时,要确保子类型的规约至少要与超类型一样强,即子类型的规约不能弱化超类型的规约。
利用子类型多态就可以实现不同类型的对象统一处理,无需在进行区分。