everything is object

人们所能够解决问题的复杂性直接取决于抽象的类型与质量。所谓类型是指所抽象的是什么?汇编是对底层机器的轻微抽象,C是对汇编的抽象,它在汇编的基础上有了大幅度的改进,但是它们所做的抽象还是要求在计算的机构上解决问题,而不是基于所要解决的问题的结构来考虑。面向对象语言相比之前,这是一种更加灵活和更强有力的语言抽象。OOP根据问题来描述问题,而不是根据计算机来描述问题。你可以通过类把数据和功能封装在一起,以此可以对问题空间的观念给出恰当的表示,类描述了具有相同特性和行为的对象集合,所以类实际上就是一个类型,我们可以通过定义类来适应问题,而不再被迫使用表示计算机存储单元特定的数据类型


Alan Kay曾总结面向对象语言的五大特性:
1)万物皆为对象
2)程序是对象的集合,他们是通过发送消息(调用方法)来告知彼此所需要的
3)每个对象都有自己的由其他对象所构成的存储
4)每个对象都拥有其类型,每个对象都是某个类的一个实例
5)某一特定对象的所有对象都可以接受同样的消息


有人会有这样的印象,处处应该使用继承,实际上这会导致设计过于复杂。我们应该先考虑组合,因为它更加的简单灵活,设计更加清晰。


接口方法一定要实现的原因是:
当发送某个消息时(产生请求/执行方法),该方法所在的对象必须知道这个消息的目的,然后执行相应的代码。接口方法未写实现,所以必须要在子类中实现它,不然无法知道这个消息的目的(程序无法执行这个方法对应的代码)。


每个对象都有一个接口,每个对象都提供服务


高内聚是软件设计的基本质量要求之一:这意味着一个软件构件的各个方面组合的很好。每个对象都可以很好的完成一项任务,而不需要依赖与其他的对象。当然,这并不意味着你视图让一个对象做更多的事。


继承类型等价性与向上转型:
导出类复制了基类的接口,当基类接收到消息时,导出类同样可以收到这个消息,由消息的主调者可以知道接受者的类型是相同的,所以导出类和基类具有相同的类型,这就是继承的等价性。将导出类看成其基类的过程,就叫做向上转型。而实际上人们经常把一个对象不当做它所属的特定类型来对待,而是将其当做其基类的对象来对待。这使得人们可以编写出不依赖与特定类型的代码。当向一个对象发送一个其基类的消息时(调用方法),该对象能够确切的知道这条消息具体应该做什么。这种发送同一个消息而产生不同行为的方式就是多态。而实现多态的基础就是后期绑定,在程序被调用时编译器并不知道程序所在的地址,只有被分发到具体的导出类时才被确定,也就是说该程序是可扩展的,你可以在基类基础上写出无限的导出类而能够正确的处理。


单根继承:
Java中所有的类都继承自Object,即一切都是对象。单根继承保证所有的对象都具有某些功能,所以对象很容易在堆上创建,同样在垃圾回收时也不会因为无法确定对象的类型而陷入僵局,这就是Java重大改进之一的垃圾回收器诞生的基础。


容器存储的对象是Object,单根继承决定了所有对象都是Object,所以容器可以存储任何东西。但因为容器只能存储Object,当你向容器置入对象时,它必须向上转型为Object,因此它会丢失身份,在取出时就需要向下转型,而向下转型是不安全(向上转型是安全的),它会消耗程序和程序员的时间,这就需要用到Java5中出泛型,也就是参数化类型。


如何控制对象的生命周期?C++认为效率控制是最重要的,为了追求最大的执行速度,对象的存储空间和生命周期都是在程序里面确定的,但是这样就牺牲了灵活性,在试图解决一般化问题时,因为无法确定具体需要的对象空间,会显得过于局限。Java采用动态的分配方式,在这种方式中,直到运行时才知道需要多少对象以及对象的生命周期和对象类型。C++ 因为无法确定何时销毁对象,必须由程序来指定,所以很容易发生内存泄漏。


信息存储池、用于分发信息的软件以及信息与软件所驻留的机器称为服务器,驻留在用户机器上,用于与服务器进行通信,以及获取信息、处理信息,然后将它们显示出来的机器叫客户机。


.net平台相当于JVM+JRE(编程环境),C#相当于Java(编程语言)


OOP编程中,程序员只需要看2部分的内容:用来表示空间的对象,和发送给对象的消息,以完成在此空间内的行为。


在Java中,你要做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象。


String s;这里只是创建了一个引用,并没有创建对象,所以此时向s发送消息会出错。


方法名和参数列表(合起来叫方法签名)唯一的标识出某个方法。


使用数组最常见的错误就是在初始化之前使用它。Java确保数组会被初始化,而且不会在它的范围之外被访问。Java采用运行时下标检查来做的范围检查,以此换来安全性和效率的提高,只是消耗了少量的内存开销。Java在创建数组时,每个引用都会被初始化为null,当运行时看到null时,如果程序视图使用它,编译器将会报错,这样就避免了这个数组常见的错误。而如果你创建的是个基本类型的数组,那么Java会把这种数组所占的内存置零。


作用域(scope),用花括号包起来的位置就是作用域,在一个作用域内定义的变量只可用于作用域结束之前,但是new出来的对象,只要你需要,可以一直保留下去。
如:{String s = new String(“a string”); }引用S在作用域结束之后就消失了,但是对象”a strng”仍然存活。Java根据GC来监视new出来的对象,并辨别哪些不会再被引用,然后释放对象空间。


存储
RAM存储

名称数据内容特点优点缺点
new出来的对象可以动态分配内存大小,不用去主动释放空间,由垃圾回收器负责回收存取速度较慢
基本类型的变量和引用类型对象句柄(实例、指针、引用)通过堆栈指针可以控制内存分配,指针下移则分配新内存,上移释放内存数据可以共享(不用重复创建对象空间),位于通用RAM,存取速度较快,仅次于寄存器数据的大小和生存期必须确定,当没有引用指向数据时,这个数据就会消失
寄存器位于处理器内部,存取速度最快程序中无法控制寄存器的分配
静态域static定义的成员
常量池final定义的成员,包括字符串常量和基本类型常量数据可以共享(不用重复创建对象空间)

注1)对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中 。
注2)对象和实例的区别:实例是对象的具体化,一个对象可以实例化很多实例,对象是一个模型,实例是照着这个模型生产的产品。从内存分配来说,对象保存在堆里中,实例保存在栈中,实例只是对象的一个引用,也就是指向对象的指针。
非RAM存储(断电也可以保持该对象的状态)

名称特点
持久化对象存储于磁盘上
IO流对象以字节流形式保存在机器上

面向对象三大特性:
1)封装性:2方面,一是把对象的属性和方法封装在一个不可分割的对象中,二是把不需要外界知道的信息隐藏起来,只允许使用对象功能,隐蔽对象功能的实现细节
2)继承性:继承机制大大增加了代码的可复用性和可维护性,降低程序出错的可能
3)多态性:程序中重名对象即为多态,有2种:一是方法重载,二是对象多态,子类对象可以和父类对象相互转换,根据其使用的子类不用以实现不同的功能


对象实例化过程
#


一个字符串就是一个String类的匿名对象,String str = “hello”;这个过程就是把一个在堆中开辟好的空间使用权给了str对象,如果”hello”这个字符串已经被一个名称引用,那么就不会开辟新的空间,new String(“hello”)则必会创建一个空间

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值