该文是整个Java学习的第一篇,主要是树立对编程的认识以及Java的一些基本概念,接下来我将按照Java SE→Java web→框架→中间件&服务框架这样一个顺序学习Java。
首先,我之前学过什么?计算机组成原理、操作系统、网络、数据库、数据结构、C语言、C++、人工智能。虽然只是学了皮毛,至少对于计算机这门学科是有一个基本认识的:
通过组成原理,我们知道:
①计算机的体系结构是由软件(软件是分层的)和硬件(硬件是由CPU(控制器和运算器)、内存以及硬盘、网卡、鼠标、键盘、显示器等外设(后三个可称为输入输出设备)组成的)组成,计算机有七层存储体系结构,寄存器、缓存、内存是易失的,固态硬盘、磁盘、光盘、磁带是非易失的,软硬件通过指令系统进行交互;
②计算机以二进制形式进行信息表示,计算机中的有符号数值都是由补码进行表示的,以及数制转换(十进制、0和0x的相互转换)和模二运算。
通过操作系统,我们知道:
①进程管理。OS的作用是上为应用层提供服务(系统调用或者说系统API),下管理硬件(指令系统),鉴于他的功能,OS一般认为由两层组成,下是内核态,上是用户态,程序一般在用户态执行,遇系统调用则“陷入”内核态执行,这个机制称为中断机制(又称陷阱机制),这个机制是并发现象的原因,这是因为当一个程序中断时会进入阻塞状态,此时他是在白白占用CPU而不做事情,因此没有必要让他保持阻塞,而是并发即让另一个程序来CPU上执行,由并发就引发了程序的进程管理的问题,即如何让多个进程或者多个线程同步(这里有一个非常重要的问题:进程和线程有何不同?进程就是拷贝,两个进程间没有任何关系,线程虽然也独立运行,但是多线程间是有一些关系的,多个线程间共用:代码、data区、其他资源比如打开的文件和信号量),进程或者线程本身是异步的即随机执行的,而同步就是要让他们有顺序的执行,同步和进程间通信差不多是一个概念,关键是要保持原子性,即一个进程保证他可以一次执行完毕,互斥锁、信号量等机制可以做到这一点,实现同步的方式主要有管道、消息队列、共享内存、信号量、socket(进程间通信的这些机制和方法以后在工作中遇到再学习)。
中断的类型:
进程有哪些状态:
②内存管理。内存是进程所处的地方,程序在硬盘里,一个程序打开时,他会被由硬盘加载进内存。malloc、calloc、realloc、free四个函数可进行堆区内存的分配和释放(动态内存分配)。重点问题是要弄清楚内存模型,下面是32位Linux系统下的内存模型:
尽管Java舍弃了指针这一概念,但是不要忘了Java的运行环境也是用C语言写的,本质上还是要用到指针的,所以很多看上去不用的东西,并不是因为他过时了,而是因为他被封装了。计算机的控制器就是通过指针即内存地址对程序进行控制的,所以指针就是内存的地址即内存中每个字节的编号,在64位操作系统里,指针的长度是64位,即8字节,也就是说8字节的指针表示一个一字节的内存单元。
③除了进程管理和内存管理以外,剩下的无非就是对于外设的管理,操作系统的三大功能对应于硬件的三大结构。
关于网络,我们知道:
网络的知识非常杂,五层体系结构中的每一层都有很多协议,我认为对于网络最重要的是要理解到底什么是协议和服务,协议是对等的,服务是垂直的。
服务的概念好理解,毕竟程序就是为人提供服务的,而一个协议在某台计算机上就是一个程序,这个程序会使用某些已经写好的程序,而这个”已经写好的程序“就是下层协议或者说服务提供者,这个程序也会提供一些API给其他程序使用,而这个”其他程序“即是上层协议或者说被服务者,理解服务的概念不光是为了理解计算机网络的体系结构,更是为了建立编程的架构思想,小到主函数调用某个其他函数,大到需要分层的大型项目都需要用到这种架构思想;
那什么是协议?协议说白了就是对等程序。
另外,我将要学习Java,在第二阶段会学习Java web,web程序即浏览器服务器程序的实现靠的就是HTTP协议。
关于数据库,我们知道:
数据库是持久化存储数据的地方,即在硬盘中以某种形式将大量数据组织起来以方便持续利用,一个数据库会有一个DBMS,这个东西是一个软件,用来管理数据库,由关系型和非关系型之分。
关于数据结构,我们知道:
数据库在硬盘中存储数据,数据结构在内存中存储数据,实际上在物理层面上,只有两种数据结构,那就是顺序存储结构(数组)和链式存储结构,但是在逻辑层面,我们将数据结构分为了三种:线性表、树、图,线性表可以是顺序,也可以是链式,数和图一般是链式。
关于C语言和C++,我们知道:
C语言是一门面向过程的语言,他的编程单元是函数而不是类,但是他有一个非常接近类的概念那就是结构体,C语言是一门贴近底层的语言,这得益于他有指针,可以直接操作内存单元,C++在C语言的基础上增加了面向对象机制,即将数据和函数抽象为一体。Java不面向过程,只面向对象,且并不贴近底层,他没有指针,只是有一个类似于指针的引用,并且他与操作系统间还隔了一个JVM,和C++相比,在面向对象部分他们也有些许不同,Java没有多继承。
C++和Java的本质区别: