一、
OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。但它还是与计算机有关系,可以把对象看成一台微型计算机,它具有状态,操作,用户可以要求这些对象执行操作。如果和现实生活中的事物关联,那么他们就具有特性和行为。
面向对象的五大特征:
1.万物皆为对象:可以把对象当作一个其他的变量,他可以存储数据,还可以对自身执行操作,你可以将任何待解决的问题概念化为构件,表示为程序中的对象。
2.程序是对象的集合,他们通过发消息来互相交流:可以把消息想象成对某特定对象的方法调用的请求。
3.每个对象都有自己的由其他对象所构成的存储:就是可以通过创建包含现有对象的包的方式来创建新类型的对象,这样做可以构建复杂的程序体系,同时把这复杂的体系隐藏在对象的简单性背后。
4.每个对象都拥有其类型:每一个对象都是某个类的实例,每个类最重要的区别就是和其它类的特性和行为。
5.某一特定类型的所有对象都可以接受同样的消息:‘学生’类型对象同时也是‘人类’类型的对象,所以一个学生类型的对象可以接受发送给人类类型对象的消息。这意味着可以编写与“人类”交互并自动处理所有与人类类型相关的的事物代码。
解决问题的思路
当需要开发或者理解一个程序或代码是=时,最好的方法之一就是将对象想象为“服务提供者”,它将通过调用其他对象提供的服务拉实现目的。我们的目标就是创建能够提供理想服务来解决问题的一系列对象。在这之前问自己:“如果我可以将问题从表象中抽取出来,那么什么样的对象可以马上解决我的问题呢?这些对象是否需要依赖另一些兑现才能履行义务呢?又是需要哪些对象呢?”
访问控制:public private protected
1.为什么会需要访问控制呢?
a.访问控制可以让其他人在访问自己程序时,无法触及到他们不该触及到的部分,只对外开放一部分,类似于向其他程序员提供的一种服务。
b.当自己的程序或类库需要改变时,因为添加了访问控制,就不需要担心你影响到其他使用你程序的消费者。
2.
public:对所有人公开
private:仅仅对类型创建者和类中方法公开
protected:与private类似,区别在于protected可以让子类访问
default:以上都没有时用到,类可以访问同一个包下其它类成员
复用具体实现
最简单的复用就是直接使用该类的对象,或者将一个类的对象置于另一个新的类中。新的类可以由任意数量,任意类型的其他对象以任意可以实现新类中想要功能的方式所组成。这个概念就是所谓的组合,的、如果组合是动态发生的就被成为聚合。组合也叫has-a(拥有)关系。例如:汽车有引擎。
继承
创建一个类后,如果另一个类与其具有相似的功能,不需要再新增一个类,而是以现有类为基础,复制它,然后通过修改副本来来创建新的类。通过继承就可以做到,被复制的类称为(基类,超类,父类),副本被称为(导出类,继承类,子类)。
继承一个基类如果只是覆盖了基类中的所有方法而不添加基类中没有的方法,那么继承类对象可以完全替代一个基类对象,被视为纯粹替代,通常被称作替代原则。基类和继承类的关系是is-a。例如:一个原型就是一个几何形状。判断继承就判断基类和继承类是否可以用is-a的关系。如果继承类中添加了新的方法,那么基类和继承类的关系被称为is-like-a(像是一个)。继承时,把导出类看作是基类的过程称为向上转型,反之则为向下转型。向上转型是安全的,因为可以说学生是一个人类,但是却不能说人类就是学生。所以除非确切知道所要处理的类型,否则向下转型是不安全的。例如:从一个Map中拿出一个Object,需要将对象转型成对应的具体类型。
为什么java时单继承?
a.单继承(单根继承)结构可以保证所有对象都具备某些功能,,所以每个对象都可以执行某些基本操作。所有对象可以很容易再堆上创建,参数传递也得到极大简化。
b.单继承使垃圾回收器的实现变得容易,由于每个对象都保证具有其类型信息,因为不会因无法确认对象的类型,对系统及操作显得尤为重要,并且给编程带来了更大的灵活性。
客户/服务器的核心思想
系统具有一个中央信息存储池,用来存储某种数据,它通常存在于数据库中,你可以根据需要把他分发给某些人员或者集群。客户/服务器概念的关键在于信息存储池的位置集中于中央,这使得它可以被修改,并且这些修改会被传播给其他的信息消费者。总之,信息存储池、用于分发信息的软件、信息与软件所驻留的机器或者机群被称为服务器。驻留再客户端的软件与服务器进行通信,以获取信息处理信息,然后将它们显示在被称为客户机的用户机器上。
二、
对象的创建和存储
对象通过new关键字于一个引用(对象的名字)相关联,new关键字的意思是“给我一个新对象”。
数据们都储存在哪儿呢?
1.寄存器:最快的存储区,因为它不同于其他存储区的地理位置----处理器内部(距离cpu最近)
2.堆栈:位于通用RAM(随机访问存储器)中,通过堆栈指针来分配存储。若堆栈指针向下移动,则分配新的内存;若向上移动,则释放那些内存。创建程序时,Java必须知道存储在堆栈内所有项的确切周期,但是这又限制了程序的灵活性,所以一般只把Java的对象引用存储在堆栈中。Java对象并不储存在其中。
3.堆:一种通用的内存池,位于RAM区,用来存放所有的Java对象。堆不同于堆栈的地方就是:编译器不需要存储在堆中的数据需要存活多久。因此具有很大的灵活性,当需要创建对象时只需要new就可以开辟一块空间存储对象。但是进行存储分配和清理的时间可能比用堆栈的时间要长。
4.常量存储:直接放在程序代码内部,这样做更安全,不会被改变。
5.非RAM存储:数据完全存活于程序之外,最基本的两个例子就是:流对象和持久化对象,流对象中:对象被转化为字节流,通常被发送到另一台机器。在持久化对象中:对象被放在磁盘中,可以保留自己的状态。
怎样销毁对象?
在Java中,用new创建的对象,只要你需要会一直保留,那怎样才能防止内存被占满?Java有一个垃圾回收器,用来监视用new创建的对象,并辨别那些不会再被引用的对象,释放它们的内存空间。
关于++和–
后缀递增:a=i++等价于a=i,i=i++;递减同理
前缀递增:a=++i等价于i=i++,i=a;递减同理
三、
Java中的finalize()
因为垃圾回收器只会释放哪些由new关键字分配的内存,而非new分配的内存空间(例如使用C++的方式分配的内存,一般发生在使用"本地方法"的时候)却不知道如何释放。所以Java定义了finalize()方法。原理:一旦垃圾回收器准备释放对象占用的空间,将首先调用finalize(),并在下次回收动作发生时,才会真正回收对象占用的内存,所以可以在使用finalize方法时做一些重要的清理工作。
垃圾回收器如何工作
Java中通过堆指针的移动来为对象分配内存空间,而垃圾回收器则会辨别不会被引用的对象的内存空间,除此之外它还会将每个对象的内存空间紧凑排列,这样对指针就可以很容易的靠近堆的开始处,避免了内存的浪费实现了高速的、有无限空间可供分配的堆模型。
Java的变量初始化
对于方法中的局部变量,如果在创建时没有初始化则会在编译时报错。而对于类中的数据成员变量分为两种情况:如果是基本数据类型成员变量则会赋初始值例如(boolean false,int 0,char []);如果是对象的引用,如果不自定义初始值,则会获得null。
对象创建的过程
1.当需要创建一个对象Dog时,或者Dog类的静态静态成员北访问时,Java解释器会找到类路径,用来定位Dog.class文件。
2.类加载器载入Dog.calss,有关静态静态初始化的所有动作都会执行,而且只会在Class对象首次加载的时候进行一次。
3.当new Dog()时,首先会在堆上为Dog对象分配足够的存储空间。
4.将Dog对象的所有基本类型数据都设置为默认值,引用类型设置为null。
5.执行代码中定义的初始化操作。
6.执行构造器
多态
当只有某以一个对象的引用时,为了让编译器知道究竟调用了哪个方法,使用了后期绑定,也被称为动态绑定或运行时绑定,通过对象的类型,调用正确的方法。在Java中除了static方法和final方法(包括private方法)之外,其他所有方法都是后期绑定。
复杂对象创建时构造器执行顺序
1.调用基类构造器,这个步骤会反复递归下去,知道找到最上层的基类,而后从上往下执行构造器,直到最底层。
2.按照创建顺序调用成员的初始化方法。
3.调用导出类的构造器的实体。