面向对象程序设计(OPP)是当今主流的编程范式,OOP把将【对象】作为程序的基本单元,将程序和数据【封装】其中,以提高软件的重用性、灵活性和扩展性。
传统的面对过程的结构化程序设计设计一系列过程(算法)求解问题,Pascal的作者的著作《算法+数据结构=程序》,【算法】是第一位,数据结构是第二位。而OPP中,【数据结构】是第一位的,算法是第二位。
类、对象和封装
类(Class)是构造对象的模版或蓝图。
对象(Object)是类构造(construct)出的实例(Instance)。
封装(Encapsulation),也叫数据隐藏,是将数据和行为组合起来,并对对象使用者隐藏数据的实现方法。
重载(Overloading):创建多个具有不同实现的同名方法,根据方法的参数类型和特定方法调用所使用的值类型挑选要使用的具体方法。
实现封装的关键在于绝不能让类中的方法直接访问其他类的实例域。程序仅通过对象的方法域对象数据进行交互。封装给对象赋予了“黑盒”特性。
对象的属性
- 对象中的数据称为实例域(instance field)
- 对象中操纵数据的过程称为方法(Method)。相当于C语言中的函数。
- 对象中实例域值的集合就是对象的当前状态(State)。
构造对象
Java使用构造器(constructor)构造新实例,构造器是一种特殊的方法,用于构造和初始化对象。操作符号为【new】(C++的也使用new运算符给对象分配内存)。
String[] a = new String[10]; //构造一个10个String字符串对象,将数组初始化
继承和多态
继承(Inheritance):通过拓展一个类来建立另外一个类的过程
extends关键字表明正在构造的新类派生于一个已存在的类。
class dog extends animal //声明dog类继承于animal类
已存在的类是超类(superclass)或者叫基类(base class)、父类(parent class);新类是子类(subclass)、派生类(derived class)或孩子类(child class)。
多态(Polymorphism):超类变量可以引用自己由继承而产生的的【子类】,而反之不行。
覆盖(Override):【子类】中的实现通过提供与【父类】中的方法具有相同名称、相同参数以及相同返回类型的方法来覆盖(替换)超类中的实现。
抽象类(abstract class):不能直接实例化的类,具体实现依赖于【继承】它的【子类】。定义一个抽象类的对象变量,但它只能引用非抽象【子类】的对象。
public abstract class dog //声明一个dog抽象类
对象包装器和自动装拆箱
Java的所有类都通过继承自Object类,除了八种基本类型(byte , short , int , long , float , double , char , boolean),其他的数据类型都是【对象】。
在一些方法中必须使用对象,而基本数据类型不是【对象】实现的。而Java为所有的基本类型提供了对应的类(Byte , Short , Integer , Long , Float , Double , Character , Boolean , Void)。
使用这些方法时,int值会自动转换成Integer对象,这是由Java编译器自动实现的。
例如
ArrayList<Integer> list = new ArrayList<>(); //泛型数组列表
list.add(3); //自动转换成:
list.add(Integer.valueOf(3)); //自动装箱
int n = lis.get(i); //自动转换成:
int n = list.get(i).intValue(); //自动拆箱
接口
接口(Inheritance)描述类具有什么功能,而不给出功能的具体实现。
一个类可以实现(implement)一个或多个接口,提供实例域和方法实现的任务由实现这个接口的类完成。
类实现了一个接口,就要实现这个接口的【所有功能】。这是定义一个接口的步骤:
1.将类【声明】为实现给定的接口
2.对接口中的所有方法进行【定义】
public interface AnimalOfInterface //声明一个接口
public class dog implements AnimalOfInterface //dog实现Animal接口
接口的特性
1.接口不是类不能用new运算符实例化一个接口
x = new Comparable // 错误的
2.能声明接口的变量,接口变量必须引用了实现接口类的对象
Comparable x;
x = new dog(); // dog实现了Comparable
3.接口使用extends可以拓展其他接口
4.接口中不能包含实例域和静态方法(Java SE 8 允许接口中增加静态方法,但这有违接口设计初衷),但可以包含常量(static 和 final 修饰的变量)
抽象类VS接口
【抽象类】和【接口】很相似,但是每个类只能拓展于一个类,而一个类可以实现多个接口。接口与超类冲突,类优先。
Java不支持多重继承(multiple inheritance),允许一个类有多个超类(C++可以,但是非常复杂),接口可以提供多重继承的多数好处,避免复杂性和低效。
Lambda表达式和泛型
lambda表达式,又叫闭包(closure)、匿名函数(anonymous function)。这是一种可传递的代码块,是一个没有名称且不属于任何类的函数。lambda表达式只能引用【值不会改变】的变量,而且这个变量初始化后都【不能赋新值】。
内部类(Inner class)是指定义在另一个类中的类,内部类是Java中最复杂最难懂的概念之一,这篇文章没办法说明它的概念。
泛型(Generic)即参数化类型,是参数多态。和C++中的模板很相像。
泛型类(generic class)是具有一个或多个类型变量(type variable)的类。
泛型程序设计意味着编写的代码可以被不同类型的对象重复使用。比如我写了一个排序的泛型方法,那么我可以对整型数组、字符串数组甚至其他任何类型的数组进行排序。
public class Sort<T> //定义一个泛型类
extends & inheritance & abstract & implementb 辨析
可以使用 extends 和 implements 这两个关键字来实现【继承】。
在 Java 中,类的继承是【单一继承】,一个子类只能拥有一个【父类】,所以extends 只能继承一个类。
使用 implements 关键字可以【变相】的使java具有【多继承】的特性,使用范围为【类】继承了【接口】的情况,可以同时继承【多个】接口。
abstract可以修饰【类】和【方法】,修饰类就是抽象类,修饰方法就是抽象方法。由于抽象类不能实例化对象,所以【抽象类】必须被一个【具体类】用extends关键字继承,才能被使用。
interface关键字用来声明一个接口,类可以通过implements关键词继承接口。
文章评论