系列文章目录
【跟小嘉学习JavaWeb开发】第一章 开发环境搭建
【跟小嘉学习JavaWeb开发】第二章 Java 程序设计概述
前言
本章节讲解Helloworld、ClassPath、Java语言的发展与现状、SUM公司介绍等等
一、Java 发展与现状
目前,Java是现在最流行的编程语言之一,并且其自身拥有庞大、完善的生态系统;就国内而言,之所以Java使用广泛,其原因是有许多的互联网大户都在使用Java实现其各自的核心业务。可以说,Java在某种意义上已经成为了事实意义上的程序的开发标准结构。据说有一个美国的卫星项目使用了Java开发了一些程序。
最早Java是由SUN(Stanford University Network,斯坦福大学网络)公司开发的一套编程语言,其前身并不是Java。在1991年的时候,当时有一个GREEN项目,这个项目的核心功能就在于要通过Email来控制各个家电产品的运行(就是今天所炒作的物联网的概念,智能家居),在80年代Email流行的时候,在当时可以发送个Email是一件很厉害的事情。于是SUN公司打算竞标这个项目,SUN的公司的工程师们打算使用C++进行开发,后来考虑到使用C++开发复杂度较高,用C++搭建了一个新的平台,而这个平台就称为Oak(橡树),但是后来这个系统没有竞标成功。
在90年代初期的时候,网景公司创造了互联网时代的第一个神话(第一家依靠技术上市的公司),在短短的几个月之内就成功的上市了,网景公司靠的就是一个浏览器技术,所以SUN公司从网景公司学习浏览器技术,从而推出了HotJava浏览器(这是一个模块化、具扩展性的网页浏览器,可以在网页中运行Java Applet)。
1995年,SUN公司正式将Oak改名为Java,Java的主要设计者是James Gosling。1996年,Java正式推出JDK1.0的程序开发包,1997年传到了中国。后来到了1998年,为了纪念Java,Java彻底脱离Windows图形界面的控制,重新命名Java2,同时推出了JDK1.2开发包,在2005年的时候又一次重命名的改革,推出了JDK1.5版本(更名为Tiger,引入了Annotation注解技术),2014年Oracle推出了JDK1.8版本,增加了函数式编程(Lambda表达式)和数据流(MapReduce)的处理。2017年推出了Java9版本,可以总结归纳为以下几个阶段:
- 1995.05.23:JDK1.0的开发包发布,1996年的时候正式提供下载,标志Java的诞生;
- 1998.12.04:JDK1.2版本推出,而后Java正式更名为Java2(只是一个Java的升级版本);
- 2005.05.23:Java十周年大会上,推出了JDK1.5版本,同时这个版本也是带来新特性以及开发支持更多的标志性的历史版本,可以说这一版本直接决定了Java后续十年的技术核心;
- 2014年:Java提供了JDK1.8版本,并且支持有Lambda表达式支持,可以使用函数式编程了;
- 2017年:Java提供了JDK1.9版本,进一步提升了JDK1.8的稳定性;
- 2018年:Java提供了JDK1.10版本,这是属于JDK1.9的稳定版本;
- 2018.09.25:JDK11正式发布;
- 2019年:JDK12正式发布;
- 2021年9月14日,推出了 Java 17 版本;
二、Sun公司介绍
2.1、Sun公司介绍
SUN被人们所熟悉的最多的产品就是Java编程语言,SUN是一家从事硬件开发的技术型公司,最著名的产品是小型机。它的公司最典型的应用就是Amazon(亚马逊)上大量使用了SUN公司的小型机,并且AWS亚马逊云服务在国外特别火。
最初的电子商务是由IBM提出来的,但是在90年代-2000年初的互联网低潮而言(互联网寒冬),这对SUN公司来说是一个很严重的伤害,SUN公司没有恢复往日的经济实力。所以在2009年的时候,SUN原本打算被IBM收购(IBM当年软件产品线上技术基础就是Java语言),但是IBM不给多的钱,IBM收购失败之后,Oracle只花了两天时间就完成了SUN公司的收购。
2.2、问题分析:Oracle为什么要收购SUN?
因为Oracle一直把Microsoft当做潜在的竞争对手,我们可以根据下列表格来对比一下。
Microsoft | Orcale | |
---|---|---|
操作系统 | Windows | Solaris(类似 Unix 系统) |
数据库 | SQL Server | Oracle Database |
中间件 | IIS | Oracle Server、收购BEA(第二家依靠技术上市的公司)得到Web Logic |
编程语言 | VS.net | PL/SQL、收购Sun公司(就有了自己的编程语言) |
软件产品 | Office | ERP、CRM |
三、Java 语言的特点
Java之所以可以得到持续的发展力以及良好的生态系统,这完全取决于Java自身的特点:
- Java基本上是一个行业内通用的技术实现标准,Java本身也算是一个开源的产品,所以很多的产商得以接触到Java的底层,这样使得Java开发的更加的透明;
- Java是一门支持面向对象(支持面向过程、函数式编程)的编程语言,这样就使得Java语言语法结构更加方便开发者接受,并且这些面向对象的设计思想还在不断进行扩充;
- 提供有方便的内存回收处理机制,像一些编程语言里面需要明确的手工进行对象的回收与释放操作,否则程序将无法正常提供支持,但是Java可以提供有自动的内存回收操作(Garbage collection,垃圾回收机制),这样处理回更加方便一些(这里就回牵扯到优化)。
- 避免了复杂的指针问题,而使用了更加简单的引用来处理内存关系的分配(指针虽然是一种高效的内存处理模式,但是需要较强的逻辑分析,Java在设计的时候充分的考虑到了这一点),开发者可以直接利用引用来处理内存关系,而这也是初学者最难以理解的部分;
- Java是为数不多支持多线程编程的开发语言,这样可以使得单位时间内,处理的性能得到提升(性能的提升并不是绝对的);
- Java提供有高效的网络处理能力,可以基于NIO实现更加高效的数据传输速率
- Java具有良好的可移植性,这样就可以提升一个程序的适用范围,可以“一次编译,到处运行”;
四、可移植性
Java语言最大的特点就是可移植性的支持,所谓的可移植性指的是同一个程序可以在不同的操作系统之间任意部署,这样就可以减少了开发的难度。在Java里面如果要想实现可移植性的控制,那么主要的依靠的是JVM(Java Visual Machine,Java虚拟机)。
Java虚拟机是一个由软件和硬件模拟出来的计算机,所有的程序只要有Java虚拟机的支持,那么就可以实现程序的执行,并且不同的操作系统上有不同版本的JVM存在,这样就可以实现可移植性。
高级编程语言类型
- 编译型:先编译再运行
- 解释型:边解释边执行
Java是两种语言的结合
- 编译命令:Javac.exe
- 解释命令:java.exe
Java程序组成:Java源文件(.java)、字节码文件(.class)、机器码指令
在Java语言之中最大的特点就是其可移植性的支持,所谓的可移植性指的是同一个程序可以在不同的操作系统之间可以任意进行部署,这样就减少了开发的难度。在Java之中如果要想实现可移植性的控制,那么主要的依靠的是Java虚拟机(JVM, Java Virtual Machine)。Java虚拟机是由软件和硬件模拟出来的计算机,简称Java虚拟机(Java virtual Machine)。所有的程序只要有Java虚拟机的支持,那么就可以实现程序的执行,并且不同的操作系统上会有不同版本的JVM存在。
Java运行机制:Java虚拟机(JVM)读取并处理经编译过的平台无关的字节码*.class文件。Java编译器针对Java虚拟机产生*.class文件,因此是独立于平台的。Java解释器负责将Java虚拟机的代码在特定的平台上运行。由于各个操作系统的支持不同,在最早的时候如果一个程序如果要想在不同的操作系统上使用,那么就必须针对此操作系统重新进行开发,但是Java为了让一个程序可以在不同的平台上随意的开发,即:根据不同的操作系统提供不同的JVM,但是所有的JVM的支持是完全一样的,而我们所有的程序只找JVM,而不管JVM的使用操作系统是哪一个。
五、当前Java的发展现状
Java技术发展的过程之中,分为三个发展方向:
- Java标准开发(Java SE ,2005年之前称为J2SE):提供的是底层的支持,实现了桌面程序的开发
- Java嵌入式开发(Java ME,2005年之前称为J2ME): SUN最早的时候想做嵌入式开发,利用了Java封装了底层的Linux操作。但是这个嵌入式的发展被当年的Nokia给折腾够了,后来基本上被Android替代,但是后来由于Oracle和Google的撕逼大战,导致Android发展也出现了瓶颈,后来Google干脆推出了自己专属的编程语言kotlin来进行Android开发
- ·Java企业开发 (Java EE,2005年之前称为J2EE):主要是进行企业平台的搭建,现在主要的开发是互联网平台。
六、Hello World
从编程语言诞生开始,基本上程序入门第一个就是“Hello World!”。下面还是以屏幕输出此类信息为主,所有的Java程序的文件后缀都是*.java。
6.1、第一个程序的编写
public class Hello{
public static void main(String [] args){
System.out.println(“hello world!”);
}
}
强调一点:作为开发者,电脑不能隐藏文件后缀名。我们可以使用Editplus、Sublime Text(涉及到编码问题)、Notepad++、Vim等文本编辑器编写,也可以使用集成开发环境但是不要用Windows自带的记事本。
Java程序分为两个操作
- 对源代码程序进行编译:javac Hello.java,此时会形成Hello.class字节码文件
- 程序的解释执行:java Hello ,注意这里没有.class,不用带.class
javac Hello.java
java Hello
此时我们就完成了 hello,world 的程序编写。
DOS命令 | 命令功能的描述 |
---|---|
E:/回车 | 盘符切换 |
dir(directory) | 列出当前目录下的文件以及文件夹 |
md(make directory) | 创建目录 |
rd(remove directory) | 删除一个目录 |
cd(change directory) | 改变指定目录(进入指定目录) |
del(delete) | 删除文件 |
cls(clear Screen) | 清屏 |
Exit | 退出dos命令行 |
6.2、程序的组成部分分析
所有的Java程序都有一个最为核心的单元:类。而本次程序中使用了一个Hello类,类的声明有如下两种形式:
- public class 类名称{}:文件名称必须与类名称保持一致,一个*.java文件内只能有一个public class
- class 类名称{}:文件名称可以与类名称不一致,但是生成*.class是与Java文件中定义的class名称一致的。
严格来讲,在以后的编程开发之中,每一个*.java文件里面都只会出现一个public class定义,但为了方便讲解代码,会在一个*.java文件里面出现多个类。
主方法:所有的程序都是由主方法开始执行的。为了以后方便讲解,会把主方法所在的类使用public class来定义,同时这个类我们将其称为主类。
屏幕输出(系统输出),输出有两种形式:
- 输出之后增加换行:System.out.println(“内容”);
- 输出之后不换行:System.out.print(“内容”);
那么现阶段对于数据的输出都主要依靠System.out.println()来完成,这个语法也是比较长。
6.3、JShell
Shell是脚本程序的含义,在很多的编程语言里面为了方便使用者进行代码的开发,都会有Shell的交互式编程环境。有些时候可能只是为了进行一些简短的程序验证,但是在Java里面就必须编写很多的结构代码,所以为解决这样的一个问题,在JDK1.9版本之中提供了JShell环境,直接运行即可。
除了可以直接在jshell命令之中进行程序的编写之外,也可以将一些内容直接交由一些文件来进行保存。
范例:定义程序文件:”D:\helloworld.txt”
// 首先在文本文件中,把Java代码写好
System.out.println(“hello world”)
// 在jshell之中执行 /open d:/ helloworld.txt”
可以发现只需要编写核心结构的代码即可,减少了对于结构化的需求,如果发现不使用了,则可以使用“/exit”退出交互式界面。
七、CLASSPATH环境变量属性
7.1、了解CLASSPATH环境变量
CLASSPATH是在开发之中,最为有用处的一个属性。CLASSPATH指的是类的加载路径。由于CLASSPATH如果要完整的进行解释就需要好多的知识,所以本次简单的介绍。
现在假设有一个Hello.class文件保存在了:”E:\testdemo”目录下,只要将命令行方式也设置到此路径下才可以使用java Hello去解释Hello.class文件,但是如果现在要切换到其他磁盘上。
这个时候如果执行了java Hello,那么会无法找到类,因为默认情况下,类都是从当前所在的目录种加载的,如果想要改变加载目录,就是用CLASSPATH。
1、临时设置环境变量(Windows)
# 临时设置环境变量
set CLASSPATH=d:\testjava
# 查看环境变量
echo %CLASSPATH%
2、设置永久生效(方法与Java_HOME的设置)
3、范例:在任何目录执行java Hello都可以执行到
我们把刚刚编译好的字节码文件Hello.class,移动到d:\testjava目录之中。然后使用临时设置环境变量的方式来演示。
set CLASSPATH=d:\testjava
java hello
此时,我们再次执行java Hello命令,发现程序可以正常的执行完毕,除了以上的做法之外,我们还可以通过java命令的-classpath参数来完成。
范例:使用java命令的-classpath参数
java -classpath d:\testjava Hello
一旦设置之后,不管在那个磁盘下只要解释Java程序都会跑到同一个目录之中,但是严格来讲,所有程序解释时,如果都跑到同一个目录下,是不方便开发,最好的做法还是应该从当前所在的路径下加载类,那么就可以将CLASSPATH设置为:”.”。
可以发现,即使此处没有设置CLASSPATH,它也是默认从当前所在路径之中加载类。在以后的开发之中,有可能在你安装一些程序的时候就会出现,安装程序去修改已经设置好的CLASSPATH,这样就可能导致你的程序无法正确执行,我们就需要的进行手工的修改,而是直接创建一个CLASSPATH属性。
当Java命令运行的时候实际上JVM会自动的找到CLASSPATH属性,而后找的此属性对应的内容,通过制定内容设置的路径来加载所需要的类。
补充:在WEB项目之中,WEB-INF/lib目录存放的是*.jar文件、WEB-INF/classes目录存放的是所有*.class文件,所这两个也就是CLASSPATH。如果你开发的是JavaSE程序并且没有集成开发工具的情况下可以使用Java安装目录下的jre/lib/ext来存放你的*.jar文件。
在Eclipse中CLASSPATH的配置是无效的,必须手动配置buildPath才可以。
关于Web开发和IDE的后续大家就会了解
7.2、请解释PATH和CLASSPATH的区别
- PATH:是属于操作系统属性,定义所有可执行程序的路径
- CLASSPATH:是Java程序解释类文件时所使用的加载路径,即类文件搜索路径,CLASSPATH的属性主要目的是定义类的加载路径,不管定义了多少个路径,一定要定义一个“.”(表示由当前路径所在的目录进行类的加载)