最近几天在看java的视频,感觉很多东西java语法上很像c#,但是还是有很多内容惊到我:
1,java虚拟机
用过VMWar或者VirtualBox的童鞋都对“虚拟机”这个词有个大致的了解,虚拟机提供了个虚拟的平台,让我们可以模拟一些脱离硬件的环境。java里的虚拟机起到了一个类似以前学过的ODBC驱动程序的作用,它屏蔽了底层的差异,让操作系统通过虚拟机向下面看去,操作系统的感觉都是一样的。
有了这一层东西,我们彻底解开了底层硬件和运行操作系统之间的耦合,实现了一次编译,到处运行的梦想。这里的解耦思想和软件的分层思想是一致的。
如果你想让各层次都灵活变动,那么,在它们中间加上接口吧。
2,数据类型
在基本数据类型里面,雷到我的是数组和String是引用类型,看来以前我的c#很不扎实啊,百度了一下,c#也是这样的,它们都是引用类型;
先讨论下对基本类型和引用类型的内存访问的区别:在访问基本类型的时候可以直接取到值,而引用类型必须先从stack 里面取到heap的地址,然后跑到heap里面去取实际的值;从对内存的访问来看,引用类型似乎没有值类型的优势。
但从面向对象的角度看,引用类型还是有众多好处的:
a.引用类型可以被序列化,原始类型不行。(这个不懂!)
b.引用类型提供的方法可以灵活转换,可以扩展,原始类型不行
c.在集合类中只能使用对象,不能使用原始类型
d.原始类型没有null的概念,对象有,某些情况下需要辨别某个参数是否被初始化了,如果使用原始类型,那么0的值不知道是初始值还是没有初始化系统自动给的。
关于两种数据类型用变和不变的观点看,基本数据类型编程语言中不变的部分,而引用类型是为了应对显示世界中的对象而动态组合的类型。
3,构造函数的返回值问题
以前学习c++的时候,碰到过很多构造函数的初始化类成员的问题。这次在学习构造函数这里的时候,视频中为了说明构造函数没有返回值的问题时,特意在为构造函数加上void,结果报错。 但是有没有想过构造函数为什么没有返回值呢? 或者说构造函数的返回值已经有一个不可更改的默认值了,就是对象本身。 想想我们使用new的时候,Dog d=new Dog(),new后面的东西就是调用的构造函数,它返回的就是d.
那么,我们是不是可以认为因为类的构造函数有默认的返回值而不能自己定义返回值呢?
小结:面向对象的语言到现在已经学过了VB.NET ,C #,C++,这次对java的学习,是对面向对象知识的一个重新的梳理和总结提升的过程;也是认识封装,继承,多态,抽象,并对它们重新思考的过程。