Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
这里面重点是面向对象、安全性、平台独立与可移植性。
安全性
Java提供一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题。这里先了解下内存泄露概念:
内存泄露:分配出去的内存得不到及时回收,如此便会导致系统运行速度变慢,更有甚者,导致系统瘫痪。什么情况下会导致内存泄露呢?程序忘记及时回收无用的资源、程序错误回收核心类库内存。前者只是让系统变慢,后者可能造成系统的瘫痪。平台独立与可移植性
如何才能称为平台独立与可移植性呢?那就得是在不同的cpu、Java编译器或者操作系统上运行代码得出的结果应该是一致的。JVM给Java提供了一个虚拟CPU般的存在使得Java呈现出这个特性。面向对象我们在后续的章节里面具体分析。
Java的发展历史
计算机从无到有,因此,任何语言也是有发展历程的,Java也不能例外。但是有意思的是,Java的诞生更为的有意思,甚至可以说是一场意外。
1990年年末,Sun公司打算给智能家电编写一个通用的系统,因此Java之父James Gosling领导的“Green计划”团队准备为此开发。起初考虑使用C++语言,该团队很多成员发现C++和可用的Api在某些方面存在很大的问题,该团队资源有限,且C++太过复杂,缺少垃圾回收、可移植性和分布式等特性。于是乎,Gosling创造了一种新的语言Oak,Oak便是Java的前身。
1995年Sun公司发布了Java,Sun公司直接把Java放在互联网上,供大家免费使用。
1996年Sun公司发布了Java1.0,这个环境下已经包含了JRE和JDK
中间省略掉某些版本,我们直接聊聊Java1.4,这个版本是一个相对成熟的版本,目前国内还有很多公司在使用。2002年2月发布,在此期间,诞生了大量的基于Java的开源框架,如我们熟悉的三大框架Spring,Struts,Hibernate,同时也涌现了大量的企业应用服务器,Weblogic,Jboss等。
2004年10月发布了Java的里程碑版本Java1.5(更名Java5.0),把之前一直称呼的J2EE正式更名为Java EE。这个版本增加了增强for、泛型、可变参数、枚举类、注解、自动装箱和拆箱等。
2014年3月18日,Oracle公司发布了Java SE8,(Sun公司很不幸的被收购了)。这次更新带来了全新的Lambda表达式和很多其他的新特性。
Java程序的基本规则
说完发展历史,我们直接说点实在的,说说代码吧。
首先我们要理解两个概念:类和实例。
类:英文名class在Java里面随处可见,所有的Java文件编译后都是.class,程序员面向世界的第一个代码如下
public class HelloWorld{}
这就是一个类,百度百科描述:类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。
好吧,其实说白了,就是存放我们要写的代码的容器,我们的代码都写在类里面(狭义的,后面还有接口,枚举等)。专业点的说法就是:类是Java程序的最小程序单位。
实例:英文名instance,也称之为对象,就是我们常说的面向对象的对象。是类的具体实现。如new HelloWorld();
,就是一个实例。还有一种创建实例的方式,我们可以根据英文名称,去java.lang.Class类中查找下关于实例的方法,找到一个叫newInstance()
,顾名思义,这也是创建实例的一种方式。
Java的一些规范
和Linux操作系统般的,Java是大小写敏感的。我们会有一些约定的规范,类名首字母为大写,方法名首字母为小写(其实,反过来,Java也能编译成功,不会影响结果),命名规范为驼峰原则(早期sun公司并没有遵守这个规范比如大名鼎鼎的Hashtable),final修饰的常量采用全部大写的方式(这个 java.awt.Color类里面很有意思的是出现一个大写,一个小写的变量,可能当时开发粗心导致的吧,后续为了修复这个问题全部改大写了,实现的效果是一样的,再次说明Java大小写敏感)。类的程序入口是main方法,且这个main方法是public static void 修饰,形参是String[] 数组。
浅谈垃圾回收机制
之前说到Java安全特性,我们聊到了内存泄露和指针越界的问题,其实就引出了垃圾回收机制。
众所周知,Java的堆是一个运行时数据区,用以保存Java的实例(对象)。由于Java程序员不负责对象的回收,那么Java需要自己把无用对象回收掉,这就是垃圾回收机制。你可以这样理解,C/C++ 就好比一个小孩在房间里面玩折纸,地上无用的纸屑,需要小孩自己去捡起来,扔掉。而Java,则允许小孩丢纸屑,不必自己去捡起来,有一台扫地机器人帮忙丢掉无用的纸屑。
优点
提高编程效率 (玩的开心)
保护程序完整性(不打断玩)
特性
回收无用对象的内存空间,只回收内存资源,对于物理资源、数据库连接、磁盘I/O等无能为力(如果纸屑在桌子上,机器人表示无能为力)
将引用变量置为null,能暗示垃圾回收机制可以回收对象
垃圾回收发生不可预知,System.gc()或Runtime对象的gc()只是起到建议作用
垃圾回收机制能精确标记活着的对象;垃圾回收器能精确定位到对象之间的引用关系。
JVM有多种不同的垃圾回收实现
关于运行时内存区域:2014年3月发布的Java8删除了HotSpot JVM中的永久代内存(PermGen,永久代内存主要用于存储一些需要常驻内存、通常不会被回收的信息),而是改为使用本地内存来存储类的元数据信息,并称之为元空间,这就意味着以后不会出现Java.lang.OutOfMemoryEror:PermGen错误(解决了eclipse自动重启报错的问题)
尾声
篇幅加上个人能力有限,对于初遇Java只能写到这里了。后续将会发布更多可能含有些技术含量的文章,再见。
作者:湖面的舟
链接:https://www.jianshu.com/p/5da40fc1c01e