面向对象编程强调抽象、封装、继承、多态(三大特征)。所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面
。面向对象把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的。
面向对象的特性提高了大型程序的重用性和可维护性。封装隐蔽了对象内部不需要暴露的细节,使得内部细节的变动跟外界脱离,只依靠接口进行通信,封装性降低了编程的复杂性。通过继承,使得新建一个类变得容易,一个类从派生类那里获得其非私有的方法和公用属性的繁琐工作交给了编译器。而继承和实现接口和运行时的类型绑定机制所产生的多态,使得不同的类所产生的对象能够对相同的消息作出不同的反应,极大地提高了代码的通用性。
动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化 比如众所周知的ECMAScript(便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。之所以叫做动态,是因为必须到运行时(run
time)才会做一些事情。
什么是线程?
线程是指程序在执行过程中,能够执行程序代码的一个执行单元。
线程与进程的区别?
进程是一段正在运行的程序,而线程有时也被称为轻量级进程,它是进程的执行单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间,但是,各个线程拥有自己的栈空间。
为什么使用多线程?
多线程的目的就是让一个进程能够同时处理多件事情或者请求。比如现在我们使用的QQ软件可以同时和多个人聊天,我们用eclipse开发代码时还可以编译代码,tomcat可以同时服务多个用户。
(1)使用多线程可以减少程序的响应时间。单线程如果遇到等待或阻塞,将会导致程序不响应鼠标键盘等操作,使用多线程可以解决此问题,增强程序的交互性。
(2)与进程相比,线程的创建和切换开销更小,因为线程共享代码段、数据段等内存空间。
(3)多核CPU,多核计算机本身就具有执行多线程的能力,如果使用单个线程,将无法重复利用计算资源,造成资源的巨大浪费。
(4)多线程可以简化程序的结构,使程序便于维护,一个非常复杂的进程可以分为多个线程执行。
多进程与多线程区别
对比维度
多进程
多线程
总结
数据同步、共享
数据共享复杂,需要用IPC;数据是分开的,同步简单
因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂
各有优势
内存CPU
内存占用多,切换复杂,CPU利用率低
占用内存少,切换简单,CPU利用率高
线程占优
创建销毁、切换
创建销毁、切换复杂,速度慢
创建销毁、切换简单,速度很快
线程占优
编程、调试
编程简单,调试简单
编程复杂,调试复杂
进程占优
可靠性
进程间不会相互影响
一个线程挂掉导致整个进程挂掉
进程占优
分布式
适用于多核、多机分布式;可扩展多台机器
适用于多核分布式
如何选择?
1.
需要频繁创建销毁优先用线程
2.
需要进程大量计算优先用线程(耗费CPU,切换频繁)
3.
强相关的处理用线程,弱相关的处理用进程(也就是数据交换多的用线程)
4.
可能要扩展到多机分布的用进程,多核分布用线程
C/C++/Java的区别
指针
Java
没有指针的概念,从而有效地防止了在 C/C++语言中,容易出现的指针操作失误(如指针悬空所造成的系统崩溃)。在
C/C++中,指针操作内存时,经常会出现错误。在Java 中没有指针,更有利于 Java 程序的安全。
多重继承
C++支持多重继承,它允许多父类派生一个子类。也就是说,一个类允许继承多个父类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。所以
Java 不支持多重继承,但允许一个类实现多个接口。可见,Java 既实现了 C++多重继承的功能,又避免了
C++的许多缺陷。
数据类型
Java
是完全面向对象的语言,所有方法和数据都必须是类的一部分。除了基本数据类型之外,其余类型的数据都作为对象型数据。例如对象型数据包括字符串和数组。类将数据和方法结合起来,把它们封装在其中,这样每个对象都可实现具有自己特点的行为。而
C++将函数和变量定义为全局的,然后再来调用这些函数和变量,从而增加了程序的负担。此外,Java 还取消了
C/C++中的结构和联合,使编译程序更简洁。
自动内存管理
Java 程序中所有的对象都是用
new 操作符建立在堆栈上的,这个操作符类似于 C++的“new”操作符。Java 自动进行无用内存回收操作,不需要程序员进行删除。当
Java 中一个对象不再被用到时,无须使用内存回收器,只需要给它加上标签以示删除。无用内存的回收器在后台运行,利用空闲时间工作。而
C++中必须由程序释放内存资源,增加了程序设计者的负担。
操作符重载
Java
不支持操作符重载,操作符重载被认为是 C++的突出特征。在 Java 中虽然类可以实现这样的功能,但不支持操作符重载,这样是为了保持
Java 语言尽可能简单。
预处理功能
C/C++在编译过程中都有一个预编译阶段,即预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。Java
允许预处理,但不支持预处理器功能,因为 Java 没有预处理器,所以为了实现预处理,它提供了引入语句(import),它与
C++预处理器的功能类似。
Java 不支持缺省函数参数,而
C++支持。
在 C
中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与 Java
类方法十分相似。由于 C++仍然支持 C,所以 C++程序中仍然可以使用 C 的函数,结果导致函数和方法混合使用,使得
C++程序比较混乱。
Java 没有函数,作为一个比
C++更纯的面向对象的语言。Java
强迫开发人员把所有例行程序包括在类中。事实上,用方法实现例行程序可激励开发人员更好地组织编码。
字符串
C 和 C++不支持字符串变量,在 C
和 C++程序中使用“Null”终止符代表字符串的结束,在 Java 中字符串是用类对象(String 和
StringBuffer)来实现的,在整个系统中建立字符串和访问字符串元素的方法是一致的。Java 字符串类是作为 Java
语言的一部分定义的,而不是作为外加的延伸部分。此外,Java 还可以对字符串用“+”进行连接操作。
goto 语句
“可怕”的 goto 语句是 C 和
C++的“遗物”。它是该语言技术上的合法部分,引用 goto语句造成了程序结构的混乱,不易理解。goto
语句一般用于无条件转移子程序和多结构分支技术。Java 不提供 goto 语句,其虽然指定 goto
作为关键字,但不支持它的使用,这使程序更简洁易读。
类型转换
在 C 和
C++中,有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在
C++中可将一个浮点值赋予整型变量,并去掉其尾数。Java 不支持
C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
SSH框架
SSH是
struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架。区别于 Secure
Shell
。集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO(Data
Access
Objects)接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring做管理,管理struts和hibernate。