JavaSE:初识Java(学习笔记)
java是高级语言的面向对象语言 .[最贴近生活.最快速分析和设计程序]
一,计算机语言发展历史
二,Java体系结构
1,JavaSE(Java Standard Edition)
标准版,定位在个人计算机上的应用
这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口AWT及Swing,网络功能与国际化、图像处理能力以及输入输出支持等。
2,JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用
JavaEE是JavaSE的扩展,增加了用于服务器开发的类库。如:JDBC是让程序员能直接在Java内使用的SQL的语法来访问数据库内的数据
3,JavaME(Java Micro Edition):微型版,定位在消费性电子产品的应用上
JavaME是JavaSE的内伸,包含J2SE的一部分核心类,也有自己的扩展类,增加了适合微小装置的类库:javax.microedition.io.*等。该版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。
三,Java的特性和优势
1,跨平台/可移植性
这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
1.Java跨平台原理(字节码文件、虚拟机)
- C/C++语言都直接编译成针对特定平台机器码。如果要跨平台,需要使用相应的编译器重新编译。
- Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。
- 字节码文件不面向任何具体平台,只面向虚拟机。
- Java虚拟机是可运行Java字节码文件的虚拟计算机。不同平台的虚拟机是不同的,但它们都提供了相同的接口。
- Java语言具有一次编译,到处运行的特点。就是说编译后的.class可以跨平台运行,前提是该平台具有相应的Java虚拟机。但是性能比C/C++要低。
- Java的跨平台原理决定了其性能没有C/C++高
2,安全性
Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。
2.Java的安全性
- 语言层次的安全性主要体现在:
- Java取消了强大但又危险的指针,而代之以引用。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使用指针也容易数组越界。
- 垃圾回收机制:不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收不再使用的内存。避免程序忘记及时回收,导致内存泄露。避免程序错误回收程序核心类库的内存,导致系统崩溃。
- 异常处理机制:Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。
- 强制类型转换:只有在满足强制转换规则的情况下才能强转成功。
- 底层的安全性可以从以下方面来说明
Java在字节码的传输过程中使用了公开密钥加密机制(PKC)。
在运行环境提供了四级安全性保障机制:
字节码校验器 -类装载器 -运行时内存布局 -文件访问限制
3,面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。
4,简单性
Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。
5,高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接待C++的效率。
因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
6,分布式
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
7,多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
8,健壮性
Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
总结:一句话:java很好!
但是,并不是说学习了java,以后所有的东西都要用java开发了:某些领域其他语言有更出色的表现,比如,Objective C和后来的Swift在iOS设备上就有着无可取代的地位。浏览器中的处理几乎完全由JavaScript掌控。Windows程序通常都用C++或C#编写。Java在服务器端编程和跨平台客户端应用领域则很有优势。
只能说,不同的语言之间,平分秋色!
四,核心机制
1,跨平台原理
(1)C跨平台和JAVA跨平台区别:
(a)Java的字节码文件是跟平台无关的,拿着这个字节码文件到不同的平台上去运行
(b)c语言不同的平台有不同的编译器,编译器与平台相关的,编译后的可执行文件也是跟平台相关
(2)C语言到底是不是跨平台的?
实际上我们所说跨平台指的是:编译后的文件是否跨平台 --- 》从这个角度来看,C语言不是跨平台的,而网上很多人说C语言是跨平台,因为不同平台有不同的解释器,它指的是源文件跨平台
(3)C语言的效率高还是Java语言的效率高?
C语言的效率高,因为它产生的可执行文件可以直接在平台上去运行
2,垃圾回收机制
(1)垃圾收集的目的:
去除不再使用的对象,当对象建立的时候,垃圾收集器就开始监控对象的动态情况,垃圾收集主要是对内存的释放。创建对象的时候申请一个空间
1.不再使用的内存空间应回收---》垃圾收集;
2.Java消除了程序员回收无用内存空间的职责;提供一种系统级线程跟踪存储空间的分配情况。在JVM的空闲时,检查并释放可被释放的存储器空间;相比c++,开发人员负责要自己收回无用内存。
3.垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和干预;
4.GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄露。
- 简述Java的垃圾回收机制
传统的C/C++语言,需要程序员负责回收已经分配内存。显式回收垃圾回收的缺点:
- 程序忘记及时回收,从而导致内存泄露,降低系统性能。
- 程序错误回收程序核心类库的内存,导致系统崩溃。
Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制。
- 可以提高编程效率。
- 保护程序的完整性。
- 其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的。
- 垃圾回收机制的特点
- 垃圾回收机制回收JVM堆内存里的对象空间,不负责回收栈内存数据。
- 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。
- 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
- 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
- 现在的JVM有多种垃圾回收实现算法,表现各异。
- 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。
- 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
- 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
五, JVM ,JDK , JRE
1,JVM
一个虚拟的用于执行bytecode字节码的”虚拟计算机”
定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。
不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。
JVM是Java Virtual Machine(Java虚拟机)的缩写,
它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
JVM是Java平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行时操作不同的内存区域。
JVM通过抽象操作系统和CPU结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关。
JVM的主要工作是解释自己的指令集(即字节码)到CPU的指令集或对应的系统调用,保护用户免被恶意程序骚扰。 JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(.class文件)。
语言跨平台是编译后的文件跨平台,而不是源程序跨平台。
两种方式的差异:
- C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关
- Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器.
2,JRE
JRE是java runtime environment(java运行环境)的缩写
运行Java程序的用户使用的软件
光有JVM还不能让class文件执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就称为jre。
所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写程序了(jre里有运行.class的java.exe)。
JRE是Sun公司发布的一个更大的系统,它里面就有一个JVM。JRE就与具体的CPU结构和操作系统有关,是运行Java程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
3,JDK
JDK是java development kit(java开发工具包)的缩写。
编写Java程序的程序员使用的软件
每个学java的人都会先在机器上装一个JDK,那 让我们看一下JDK的安装目录。在目录下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。
其中,真正在运行java时起作用的是以下四个文件夹:bin、include、lib、jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包含JVM。
bin:最主要的是编译器(javac.exe)
include:java和JVM交互用的头文件
lib:类库
jre:java运行环境
(注意:这里的bin、lib文件夹和jre里的bin、lib是不同的)总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。eclipse、idea等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选jre路径就ok了。
jdK 5、7、8.11 新增核心的技术.
5版本(Java 5,也称为J2SE 5.0):w
泛型(Generics):这是Java 5的重大革新之一,允许开发者编写类型安全的集合类,避免了类型转换带来的安全隐患。
枚举类型(Enum Types):引入了内置的数据类型枚举,用于替代一些冗长的switch-case结构,提高了代码组织性和安全性。
自动装箱/拆箱(Automatic Boxing and Unboxing):简化了基本类型和对应的包装类之间的转换。
7版本(Java 7,也称为JDK 7):Lambda表达式(Lambda Expressions):允许在函数式编程风格下更简洁地表示函数,极大地增强了Java的并发能力。
并行流(Parallel Streams):引入了Stream API的并行版本,使得处理大量数据时可以更好地利用多核处理器。
改进的垃圾回收机制(Garbage Collection Enhancements):如CMS收集器(Concurrent Mark Sweep)的优化,提升了内存管理效率。
8.11版本(实际不存在这样的版本,因为Java 8.11应该是混淆的说法,可能是指Java SE 8 Update 111,但这里还是按照您的描述继续):Java 8(确切地说,Java SE 8) 已经包含了上述Java 7的所有特性,所以在这个版本中并没有显著的新特性。然而,它延续了Java 8的重要特点,如方法引用(Method References)、接口的默认方法(Default Methods in Interfaces)以及模块化系统(Modular System,即Java Platform Module System,JPMS)等。
如果是指接近Java 9或后续版本,那么在Java 9开始,有Optional类的进一步完善、Stream API的增强、Pattern Matching with Labeled Bindings(条件匹配)等特性。
六,环境变量
1,安装 idk时.配置哪些环境变量
[ java_home] [ path] [ classpath]
2,path环境变量作用:
将命令所在的路径配置到path中去,就相当于在计算机中“注册”了一样,以后找这个命令,会直接去你配置的路径下寻找。
3,classpath作用:
针对java执行字节码文件而产生的环境变量,只要配置了字节码文件所在的路径以后,那么以后你在任意位置都可以执行对应的字节码文件
3.Java开发环境配置
具体配置步骤如下:
0)找到自己的jdk安装路径,如:C:\Java\jdk1.7.0_60\bin
1)右击桌面“我的电脑”,选择“属性”
2)选中“高级系统设置”-->高级-->环境变量设置
3)在系统变量中找到“path”并选中,点击“编辑”,
4)变量值栏按键盘“home”键,输入英文的“;”
5)将第0)步准备的路径复制过来就行。点一些列“确定”完成配置
4.Java开发运行过程 编写,编译,运行.
在安装好JDK并配置好path、classpath后开发运行步骤如下:
1、可以用任何文本编辑器创建并编辑Java源程序,Java源程序用“.java”作为文件扩展名
2、编译Java源程序编译器,使用命令“javac”编译“java源程序文件名.java”。最后编译成Java虚拟机能够明白的指令集合,且以字节码的形式保存在文件中。通常,字节码文件以“.class”作为扩展名。
3、执行java程序,使用“java”命令运行class(字节码)文件“java文件名”,Java解释器会读取字节码,取出指令并且翻译成计算机能执行的机器码,完成运行过程。
七,注释
1,单行注释
采用“//”方式.只能注释一行代码
2,多行注释
采用“/*...*/”方式,可注释多行代码,其中不允许出现嵌套
3,文档注释
采用“/**...*/”方式
【1】注释的作用:
(1)注释就起到了标注解释的作用,提高代码的可读性,方便自己,方便他人--》是一个非常良好,非常专业的习惯!!!
(2)方便代码的调试:
【2】注释不会参与编译,编译后产生的字节码文件中不会有注释的内容
【3】一般文档注释可以配合:jdk提供的工具javadoc.exe来一起使用,通过javadoc.exe可以对文档注释进行解析,生成一套以网页文件形式体现的该程序的说明文档。(自定义类对应的API)