1996年java第一次发布,我也这一年出生的。
主要特性
简单性
大多时候拿c++和java进行比较,java取消了c语言的头文件、指针运算,降低了学习成本
面向对象
这个词和hello world有一拼,与C++的面向对象类似,不同的是对于多重继承,java提出了接口的概念,顺带提一嘴,这个面向对象:
三特性:
封装:
隐藏对象的属性和实现,仅对外提供公共访问方式。常见的get、set,这里给lombok@Data点个赞
继承:
感觉主要是复用,同时也是多态的前提,从此你有了爸爸
多态:
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,可扩展性
五原则:
单一职责原则SRP(Single Responsibility Principle):
顾名思义专心干一件事比如,在一篇名为父爱的作文里一直强调母爱的光辉,你爸爸会拿他沙包大的拳头,好好的疼爱你。。。
开闭原则OCP(Open-Close Principle):
对扩展开放,对修改关闭,你可以往我的支付宝转钱,但是想让我给你的支付宝转钱,没门。
里式替换原则LSP(the Liskov Substitution Principle LSP):
子类可以替父类出现在父类能够出现的地方,不胜酒力的我逢年过节还得“替父出征”
依赖倒置原则DIP(the Dependency Inversion Principle DIP):
高层次的模块不应该依赖于低层次的模块,抽象不应该依赖于具体实现,具体实现应该依赖于抽象。我们从来都是说中华民族的伟大复兴而不是汉族或其他少数名族
接口分离原则ISP(the Interface Segregation Principle ISP):
根据功能划分出对应的接口,拒绝大锅炖接口。比如说腾讯视频的分类,电视剧、电影
分布式
java有丰富的库来处理http、ftp之类的tcp、ip协议,使java可以通过url访问网络上的对象
健壮性
java编译器能够检测许多其他语言仅在运行时才能检测出的问题,比如java采用的指针模型可以消除重写内存和损坏数据的可能性
安全性
从一开始,java就设计成能够防范各种攻击,比如:
1.运行时堆栈溢出,如蠕虫和病毒常用攻击手段。
2.破坏自己进程空间之外的内存。
3.未经授权读写文件
体系结构中立
java跨平台的实现正是基于此特性,编译器生成一个体系结构中立的目标文件格式,即class文件。通过生成与计算机系统无关的字节码以及对于不同平台对应的jvm从而实现跨平台。
下图可以参考一下:
这里再提一下对于java是编译型语言还是解释型语言:
我的个人观点是解释型语言,java对于源文件的处理如上图所示,先编译成class文件后通过jvm解释成对应操作系统。虽然,java通过即时编译把频繁解释的字节码翻译成机器码但它还是经过了解释。
此外java的安全性化体现在字节码的校验。
可移植性
java规范中没有依赖具体实现的地方,它对基本数据类型的大小及相关运算做了明确的说明。
如,int永远为32位整数,而在c、c++中int可能是16、32、other。二进制数据以固定格式进行存储和传输,消除了字节顺序的困扰。字符串采用标准的unicode。并且java的库都很好的支持平台独立性。
解释性
如上所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
高性能
Java的运行速度随着JIT(Just-In-Time)即时编译器的发展更加高效。
多线程
java是第一个支持并发程序设计的主流语言。
在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子类将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
动态性
Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
java语言的发展
版本 | 年份 | 语言新特性 | 类与接口的数量 |
---|---|---|---|
1.0 | 1996 | 语言本身 | 211 |
1.1 | 1997 | 内部类 | 477 |
1.2 | 1998 | strictfp修饰符 | 1524 |
1.3 | 2000 | 无 | 1840 |
1.4 | 2002 | 断言 | 2723 |
5.0 | 2004 | 泛型类、“for each”、可变元参数、自动装箱、元数据、枚举、静态导入 | 3279 |
6 | 2006 | 无 | 3793 |
7 | 2011 | 基于字符串的switch、钻石操作符、二进制字面量、异常处理改进 | 4024 |
8 | 2014 | lambda表达式,包含默认方法的接口,流和日期、时间库 | 4240 |