对象导论
Java基础知识:
Java一次编译、处处运行。Java具有跨平台性。
J2SE 2.0平台包括:标准版(J2SE)、企业版(J2EE)、微缩版(J2ME)。标准版主要用于桌面应用软件的编程。J2ME主要用于嵌入式系统的开发。J2EE主要用于分布式网络程序的开发。
J2SE 1.5 后改名为 Java SE 5.0 加入泛型
Java SE 8.0 lambda表达式
Java SE 9.0交互式编程
1.类、对象
对象具有状态(由内部数据表示)、行为(由方法产生行为)和标识。
类描述了具有相同特性和行为的对象集合。一个类相当于一个数据类型。
2.被隐藏的具体实现
将程序开发人员分为类创建者和客户端程序员。
访问控制的两个原因:让客户端程序员无法触及他们不应该触及的部分;允许库设计者可以改变类内部的工作方式而不用担心影响到客户端程序员。
Java中用三个关键字确定类的边界:public、private、protected。
public表示紧随其后的元素对任何人都是可用的。
private表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。如果有人试图访问,就会在编译时得到错误的信息。
protected与private作用相当,差别在于继承的类可以访问protected变量,但是不能访问private成员。
3.继承
源类(基类、超类、父类)发生变动时,会创建出被修改的副本(导出类、继承类、子类) 。
相同之处:由于导出类复制了基类的接口,所有发送给基类对象的消息也可以发送给导出类对象。
不同:导出类中可以添加新的方法;改变现有类的方法,进行覆盖(overriding)。
4.前期绑定和后期绑定
非面向对象编程的编译器产生的函数调用会引起前期绑定,这意味着编译器将产生对一个具体函数名字调用,而运行时将这个调用解析到将要执行代码的绝对地址。
而在面向对象编程中,使用后期绑定,即被调用的代码直到运行时才被绑定。
如以下代码:
首先编写一个方法:
void doSomething(Shape shape){
shape.erase();
shape.draw();
}
如果程序中其它部分运用到了doSomething()
方法:
Circle circle = new Circle();
Triangle triangle = new Triangle();
doSomething(circle);
doSomething(triangle);
很明显调用Circle的draw()方法与调用Triangle的方法不同,但是doSomething()
知道如何去做。而且很明显,Java编译器在调用doSomething()
代码时,并不知道它要处理的确切类型。
在某些语言如C++中需要用特殊关键字(如virtual)来声明希望某个方法具有后期绑定的灵活性。在Java中,后期绑定是默认的。
5.单根继承结构
在Java(除了C++的所有面向对象编程语言),所有的类最终都继承自单一的基类。在Java中,这个基类的名字叫做Object。
C++无法保证所有的对象都属于一个基类型,这样能够更好适应C模型,而且受限较少。但在完全的面向对象编程设计中,必须构建自己的继承体系。
单根继承结构保证所有对象都具有某些功能,可以在每个对象上执行某些基本操作。
6.对象的创建和生命期
C++将对象置于堆栈或静态存储区,在编写程序时确定对象的存储空间和生命周期,以求得最高效率和最大的执行速度。这种做法牺牲了灵活性,因为必须在编写程序时知道对象确切的数量、生命周期和类型。
Java**在堆中动态的创建对象。直到运行时才知道有多少对象,以及它们的生命周期和具体类型。由于存储空间在运行时动态处理,所以需要大量时间**在堆中分配存储空间,远远大于在栈中分配空间所消耗的时间。
动态方式的一般逻辑性假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大的冲击。