第一章:
1
认识Java:
我个人感觉啊,在学习的过程中肯定多多少少像一些理论性的东西是比较枯燥的,然而第一章讲的是Java的起源和发展,这种故事性的东西了解一下的话我觉得会为以后学习Java增添很多兴趣。下面进入正题
Java、C、C++都是传统的编程语言
1995 OAK诞生(Java的前身)
课堂上还提到了联众的创始人——鲍岳桥(我记得我小的时候还在旁边看老爸用电脑在打牌,用的就是联众世界这个平台)
Sun用OAK平台改进得到HotJava浏览器
1995 OAK更名为Java
Sun其实是一家硬件技术公司,而非软件
Sun 2006年收购Mysql
2007年价格没谈拢Oracle总裁艾莉森直接收购,于是Sun归属Oracle
java不擅长的领域:1、简化编程
2、服务器的自动化管理
2
Java的特点:
1、Java拥有良好的可移植性,说到可移植性就是指同样的程序更换到不同操作系统后
也可以正常使用。(Java最早提出此概念)
2、垃圾回收:自动释放内存空间、垃圾。
3、引用传递:避免了C、C++语言那样的指针操作困难。
4、多线程编程支持:并发编程实现。(多线程这个东西啊我感觉还是比较抽象的,只是大概知道
它是一种代码分成多个分块一并执行最后再返回主菜单,具体还是了解的不太清楚。)
5、适合分布式计算:Java的本质上是为了网络开发准备,因此更多时候不是应用在单机环境
而是在网络通讯下应用。
6、安全性比较高:所有的程序不是使用源代码形式给出,而是给了一个字节码文件。如下图:
其中.class文件表示的是二进制字节码文件
.java文件表示的是源代码文件
3
Java的可移植性:
良好的可移植性就是同样的程序更换到不同操作系统之后都可以正常使用。
可移植性的实现核心依据:Java虚拟机
计算机语言类型分为两类:
1、编译型语言:源代码文件经过编译才可使用。例如:C
2、解释型语言:源代码编写完成后可以直接放在服务器上执行。例如:HTML
Java是两类语言的集合,所有的Java源程序都需要进行编译,编译形成二进制字节码后才可以放在JVM(Java虚拟机)上进行执行。
虚拟机的意义:操作系统是有资源调度的后面会提供一系列的系统函数,系统函数是和我们写的程序代码直接联系的,然而有了虚拟机的存在就可以在这之间进行过渡,进行资源匹配的工作,一般的控制都是虚拟机完成,一般用厂商来作虚拟机这个角色。(还是怪抽象的,毕竟没学过操作系统,我所理解的系统函数指令就是你在电脑上要关闭网页的窗口的话如果没有系统函数你是关不掉的。)
虚拟机的设计思想已经广泛应用于许多编程语言,只要是基于虚拟机开发的程序都具有可移植性(python也有虚拟机)。
第二章
4
JDK简介:
JDK(Java Development Kit),一组实现Java程序开发与运行的本地环境,在实际的项目开发与运行过程之中,往往都会选择一些比较好用的桌面系统进行开发,而后在一些稳定的服务器系统上进行项目的部署。
Java项目的开发里面实际上分为三个开发方向:
1、Java单机程序(Java SE):包括一些类库、系统支持
2、Java嵌入式开发(Java ME):在移动设备上植入了一个JVM;后被Android开发所替代,再后来
Google开发了Kotlin平台代替了Android开发;
3、Java企业级开发(Java EE):构建分布式的企业系统平台,基于Java SE实现更高级的应用;
所有的三个开发分支的发展,都离不开JDK的支持。
5
JDK的配置:
这就不用多说了,登录oracle网站官网,我今天中午登了一下发现跟以前的界面完全不一样了,
不过还好能找到JDK下载目录,因为教程上让安装JDK11版本的,最新版本是JDK13,于是一个奇怪的事情又发生了,我下载JDK13的时候是不需要登录Oracle的,但是下载JDK11还得登录,所以我又注册了一个Oracle账号,他就让我下载了,结果又一个烦人的事情发生了,他的下载速度竟然是10几kb一秒,没办法一中午啥也没干就一直在下载这个11版本的JDK。下完之后安装就行,只是安装的时候要记住目录,为之后配置环境变量作准备。没什么难的。
6
Java编程起步
1、创建一个程序的保存目录
2、创建一个Hello.java文件
3、编译:javac Hello.java
执行class文件:java Hello(这后面是没有任何后缀的,执行的是*.class文件,这里是Hello.class文件)如下图:
执行效果:如图:
第一个程序执行完毕,那么此时就需要对此程序的结构进行详细说明。
程序类:Java拥有最为完善的程序语法结构,所以所有的程序都必须使用类的形式来
进行定义,而对于类的定义有如下两种总做法:
1、public class 类名称{}
①它要求文件名与类名称保持一致。如果不一致呢?
②一个*.java源程序之中只允许有一个public class定义;2、class 类名称{}
①文件名称可以与类名称不一致,但是生成后的*.class的名称就是类名称的定义。
②一个*.java源程序可以定义有多个class类,并且编译之后会形成不同的*.class文件
主方法:
主方法表示的是一切的起点,所有的程序都要通过主方法才可以正常执行。也称之为“客户端”
public static void main(String args[])信息输出:是在屏幕上进行信息的打印
打印之后不换行:System.out.print(输出内容);
打印之后换行:System.out.println(输出内容);对比如下图
第三章
7
JShell工具:
JShell里面可以直接编写程序的主体代码
其中$1表示第一个结果,$3表示第三个结果。
如果在JShell里打出System.out.println();是不会在前面显示$的但是也会算在结果里。
JShell提供文件数据的加载功能。
8
CLASSPATH环境属性:
如果说要现在执行一个程序类,当前所在目录下一定是有该*.class文件的,如果改变了程序目录。再一次执行程序就会报出以下的错误:
因为我把目录设在了D:\mldnjava
所以在C盘要找到该class文件是找不到的就会报这个错误。为了解决这个类加载的问题,Java就提供了一个CLASSPATH环境属性,通过此指派加载路径。
其中操作语法是:
SET CLASSPATH=路径;
我这里是
SET CLASSPATH=D:\mldnjava;
设置完了以后你就可以在别的盘,比如在C盘也可以执行类。得到输出结果。
但是需要注意的是,在实际项目开发如果到处指派CLASSPATH实际上就有可能造成项目的混乱,
最稳妥的做法还是从当前所在目录进行加载。(这个也是可以理解的,你一会儿指派C盘什么什么,一会儿在E盘指派什么什么目录,肯定在项目的实际开发中就乱套了)
设置方法如下:
SET CLASSPATH=.(别忘了后面那个点点)
这种加载的路径也是默认的路径,很多开发时候,有可能一些软件安装上之后会自动修改
CLASSPATH的配置,所以此时必须手工将其进行纠正,但是以上设置方式不标准,因为当前设置只
针对于命令行窗口,窗口关了配置即刻消失。(意思就是你把cmd命令提示符窗口关了,你就白设了)
最稳妥的做法就是将其定义为一个系统变量
第四章
9
注释:
Java支持三类注释:
1、单行注释://
2、多行注释:/注释内容/
3、文档注释:/** 相关的注释标记以及注释内容**/
如果代码上出现注释,则编译器在编译的时候回自动空出此部分的内容不再进行处理,
同时可以让后来的开发者知道本程序的意义(注释部分就是爱写啥就写啥,不会出现啥语法上的错误之类的,为得就是解释代码在做什么,让看源代码的人一目了然,这就是注释的作用)
因为以后大量程序代码都是用开发工具完成,在进行开发工具使用的时候,
往往都会进行代码的格式化处理,多行注释的格式化效果比较“惨”(格式混乱)
(这个我也体会过,我在用Eclipse的时候有一回用到了//多行注释,一点source format,全乱了,我以后就很少用//了)
10
标识符与关键字:
标识符:在定义类名称时都是由用户自定义的名称,定义时需要符合标识符的定义要求。
标识符是指一些特定的结构声明,例:类名称、方法名称、属性名称、变量名称等等,在
Java中的标识符的定义要求为:
由字母、数字、_、$所组成,其中不能够以数字开头,不能是Java中的保留字(关键字)
合法标识符:mldn、LiXinghua、bo_xin;
非法标识符:110bobo(数字开头)、hello(非法字符^出现)、class(关键字)
(关键字是什么呢,就是一些特定的名词,你在用ultraedit或者是editplus的时候写一些名词他是会变颜色的,这些就是关键字,比如public static void 你在主方法敲这些个单词的时候他都自动变色了)
从标准上说,标识符的组成有$,但是一般这个符号不会直接出现在项目代码中,定义的时候不要写(我也不知道为啥,在这里画个问号?)
最常见的就是字母、下划线、数字,且要求有意义,中文作为一种神奇的特殊标记,也允许作为标识符(说明中国真强大)
(但是还是尽量少用吧。)
第五章
11
数据类型简介:
数据分类:
Java开发中数据类型分为两大类:基本数据类型(数值传递)、引用数据类型(内存传递)
基本数据类型:
1、数值型:
①整型:byte、short、int、long;
②浮点型(小数):float、double;
2、字符型:char;
3、布尔型:boolean;
引用数据类型:数组、类、接口,
数据类型关键字 变量标识符 = 常量;(这就是定义)
例int num = 10;(一 一 对 应 不用多说了吧)
数据类型使用总结:
1、在描述整数的时候(例如:年龄),一般都会使用int类型;
2、在描述小数的时候一般都会使用double;
3、在描述日期时间或者是内存文件大小(字节)的时候使用long;
4、在进行数据二进制传输或者进行编码转换的时候使用byte;
5、在进行中文处理的时候可以通过char来完成。
所有变量定义时都必须有一个明确的数据类型
var关键字很鸡肋,为什么呢?
如图所示你var num = 10;输出其乘2的结果,如下
没毛病吧,10*2=20,再往下看
此时我把这个num的值改成了true,大家都知道这是布尔型(boolean)的数据类型,结果呢?
报错说boolean无法转化为int,这就是这个var鸡肋的地方,不如JavaScript、Python
灵活。
12
整型:
整型有哪几个,这个上面我已经说了,这边就不重复
在Java中规定的任何一个整数其对应的默认类型就是int。
在正常的操作情况下,数据类型都会在统一的一种形式下才可以实现正常的数学计算,
所以以上的操作都是针对于int完成的。实际上每种数据类型都有其保存的范围定义,
那么如果说现在超过了这个范围会如何呢?
此时我们取Integer.MAX_VALUE函数和Integer.MIN_VALUE函数得到了两个值
2147483647和-2147483648
我们再把这个最大值+1,最小值-1,最大值+2,结果发现
第一个结果是取两个最大最小值
第二个结果是两个最大最小值和最大值+1,最大值+2
第三个结果是两个最大最小值和最大值+1,最大值+2,最小值-1
得出的结论就是越界了,正数的最大值,加了1变成了负数最小值,而负数最小值减了1
变成正数最大值,如何解决数据溢出问题?
:在于要扩大使用的数据范围,以获得更大的数据保存空间,而且可以发现保存范围小的数据类型会自动向大范围的数据类型转换,而后开始计算。比如
将1个long型与1个int型相加结果为long型。
这个也是如此,long型+int型=long型
这时要注意1和l的区别,一定要睁大眼睛仔细看清楚,其实敲多了一眼就能看出来区别
不过为了保险起见用大写的L来代替小写的l吧。
如果我们将int型的最大值加上long型的1会发生什么样的结果呢,
我们发现他真的变成long型结果了,而且超过了最大值2147483647结果为2147483648
最小值也是如此。
我们如果直接把这个超大数赋值给Long型变量结果会是什么样呢
他说整数太大,因为我们默认一般的整数是int型的而int型无法保存这么大的数,所以
必须强制类型转换,
在很多时候会存在大数据范围向小数据范围的情况,此时采用强制的转换操作。
超大数后面加个L就可以转换了。我们再试试把long型数强制类型转换为int数
显然,数据溢出,越界。
下面我们来说说byte变量,它的范围是很小的只有-128到127
Java由于考虑到了byte的情况,就把在这之间范围的数设置成为直接可以赋值,比如
把100直接赋值给一个byte变量是可以的。
如果是变量就不可以了
如果超出了范围也不可以
当然它和100这个Int型数相加结果当然是int结果了,也就是200
如果我们把b+100赋值给了这个byte变量b会怎么样呢
显然这是需要强制类型转换的(大范围数据类型向小范围数据类型),我们来给它转换一下。
结果显然,数据溢出。没什么好解释的
对此我作出以下总结:
如果直接进行byte变量赋值时,赋予内容在-128到127之间可以自动进行转换,如果超出了范围就必须明确转换。(一定会数据溢出)