Java编程入门
Java语言简介
Java发展简介
Java发展方向:
- Java标准开发(J2SE,JAVA SE):提供的是底层支持,实现了桌面程序的开发
- Java嵌入式开发(J2ME,JAVA ME)(Android开发)
- Java企业开发(J2EE,JAVA EE):主要开发互联网平台
Java语言特点
Java语言的优点
- Java半开源
- 面向对象,有不同的JDK版本
- 提供有方便的内存回收处理机制
- 避免了复杂的指针问题,而使用更简单的引用代替
- 支持多线程开发,提高单位时间内的处理性能
- 有较高的网络处理能力,可以基于NIO实现高效的数据处理能力
- 有良好的可移植性
Java可移植性
可移植性:同一个程序在不同的操作系统之间可以进行任意的部署
操作系统:Windows操作系统,Unix操作系统,类Unix操作系统(Linux,macOS)
Java实现可移植性主要依靠JVM(Java虚拟机:由软件和硬件模拟出的计算机)
计算机高级编程语言:编译型(c……),解释型(html……)
Java既是编译型又是解释型,Java所有的解释放在Java虚拟机当中
Java编译器针对Java虚拟机产生class文件,独立于平台>>JVM读取并处理经编译过的平台无关的字节码class文件>>Java解释器负责将Java虚拟机的代码在特定的平台上运行
*.java经编译后才可以使用,编译后的代码是独立于平台的,可被JVM读取。
所有的程序不是直接运行在操作系统上,而是通过JVM执行,所以执行速度较慢;但硬件技术发展,好一点
搭建Java开发环境
JDK简介
JDK:Java的开发包
JDK的获取通过官网获得,在本机配置
JDK下载:www.orcale.com
进行实际项目的生产环境的部署,现阶段以JDK1.8为主
JDK1.9与JDK1.10的差别不大
JRE:Java运行时环境只提供程序的解释功能,不提供程序的开发功能
本机配置好JDK之后会自动进行JRE更新处理
JDK安装与配置
在JDK之中默认支持有JRE
安装后进行JDK的配置处理
主要使用java.exe和javac.exe两个指令(并不属于Windows本身,在命令行中使用需要进行配置)
多个路径用;分割
检测:命令行javac
初识Java开发
Java编程起步
Java程序是需要经过两次处理后才可以正常执行的:
- 对源代码程序进行编译:javac xxx.java,会出现一个xxx.class的字节码文件
- 利用JVM进行编译,编译出一套与平台无关的字节码文件(.class)
- 在JVM上进行 程序的解释执行:java xxx
- 解释的就是字节码文件,字节码文件的后缀是不需要编写的
public class Hello {
public static void main(String args[]) {
System.out.println("Hello World !") ;
}
}
-
在Java程序开发之中最基础的单元是类,所有的程序都必须封装在类在中执行
类的基本形式:[public] class 类名称{}
- “public class 类名称{}”:类名称必须与文件名保持一致,一个*.java文件里只能有一个public class的定义
- “class 类名称{}”:类名称可以与文件名可以不一致,但经解析后会文件名会与类名称一致;在一个*.java文件里可以有多个class定义,并编译后会形成不同的 *.class文件
提示:
- 在程序开发时,很少会出现一个*.java源代码里定义有多个class的情况
- Java语言有明确要求,定义类名称的时候要求每一个单词的首字母必须大写
-
主方法:是程序执行的起点,并且一定要定义在类之中
public static void main(String [] args){}
主方法所在的类都成为主类,所有的主类都用public class定义
-
屏幕打印(系统输出)可以直接在命令行的方式下进行内容的显示,有两类语法形式:
- 输出后追加换行:
System.out.println(输出内容);
- 输出后不追加换行:
System.out.print(输出内容);
- 输出后追加换行:
JShell工具
Shell是脚本程序的含义,为了方便使用者的编程开发,都会有Shell的交互式环境。为了进行简单程序的验证。
方法:命令行jshell指令,直接运行
处理可以在jshell命令之进行程序的编写之外,也可以将一些内容直接交由一些文件进行保存。jshell指令”/open 路径“即可。不使用时,可以使用“/exit”进行交互式的界面的退出。
可以只编写核心结构的代码,减少对于结构化的需求。
CLASSPATH环境属性
命令行编译后脱离当前目录,再加载字节码文件,会出现如下的错误提示:
错误:找不到或无法加载主类 *
原因:java.lang.ClassNotFoundException:*
(因为在当前目录中没有字节码文件)
定义CLASSPATH环境属性:SET CLASSPATH=路径
当设置了CLASSPATH之后,在Java程序解释的时候会自动通过CLASSPATH所设置的路径进行加载
所以JVM解释程序的时候需要得到CLASSPATH的支持
但默认情况下,所有解释的类都是从当前所在的目录中加载的,所以CLASSPATH的默认设置为当前所在目录加载类文件。
对于CLASSPATH应采取默认设置方式:SET CLASSPATH=.
在一些安装了Java开发的程序软件时,可能会更改默认配置,所以需要自己用命令行改过来。但现在的CLASSPATH是一个命令行下的配置,关闭则消失。所以最好的方法就是将其定义为全局属性,就可在系统中追加有一个属性信息。(计算机>高级属性设置>环境设置)
PATH和CLASSPATH的区别
- PATH:是操作系统提供的路径配置,定义所有可执行程序的路径
- CLASSPATH:是由JRE提供的,用于定义Java程序解释是类加载路径,默认设置的未当前所在目录加载,可以通过
SET CLASSPATH=路径
的命令形式进行定义 - JVM>CLASSPATH定义的路径>加载字节码文件
Java基本概念
注释
注释是程序开发之中一项重要组成技术
注释的本质在于,编译器在进行程序编译时,如果发现有注释的内容将不对此部分进行编译
形式
- 单行注释://;
- 多行注释:/* …… */;
- 文档注释:/** …… */;文档注释里面还主要有很多的选项,一般建议通过开发工具控制
如果在以后开发工具,单行注释比较方便;但对于一些比较重要的类或是方法,建议使用文档注释
标识符与关键字
在任何一个程序之中实际上都是一个结构的整合体,在Java语言里面有不同的结构;对于不同的结构一定要有不同的说明实际上就是标识符。
对于结构的说明实际上是有命名要求的,一般要求有意义的单词组成,同时对于标识符的组成,在Java之中的定义如下:由字母,数字,下划线和$组成,其中不能数字开头,不能使用Java保留字(关键字)
关键字是系统对于一些结构的描述处理,有着特殊的含义。
- assert,用于异常处理
- enum,用于枚举
- 未使用到的关键字,goto,const
- 有一些属于特殊含义的单词,true,false,null
Java数据类型划分
Java数据类型简介
程序是一套数字处理的游戏框架
Java数据分类:
- 基本数据类型:描述的是一些具体的数字单元
- 数值型:
- 整型:byte,short,int,long>>默认值:0
- 浮点型:float,double>>默认值:0.0
- 布尔型:boolean>>默认值:false
- 字符型:char>>默认值:‘\u0000’
- 数值型:
- 引用数据类型:牵扯到内存关系的使用
- 数组,类,接口>>默认值:null
*每一种基本数据类型都有其保存的数据范围
对于数据类型的选择上的参考原则:
- 描述数字的首选,一定是int(整数),double(小数)
- 进行数据传输或进行文字编码转换使用byte类型(二进制处理操作)
- 处理中文的时候,最方便的操作时使用char来操作(可选概念)
- 描述内存或文件的大小,描述表的主键列(自动增长)可以使用long
整型数据类型
共四种,按保存范围由小到大:byte,short,int,long
在Java里只要是整数都是int类型的数据
定义:int 变量名称=常量(int型);
任何的数据类型都是有其可以保存的数据范围的
int max=Integer.MAX_VALUE; //获取int的最大值(2147483647)
int min=Integer.MIN_VALUE; //获取int的最小值(-2147483648)
最大值+1=最小值,最小值-1=最大值
这些数字在进行处理时,如果超过了其最大的保存范围会产生循环现象,这种问题在Java中被称为数据溢出;解决这种数据溢出,可以继续扩大其使用范围。
- 在操作的时候预估数据范围,如果发现范围不够就使用更大的范围
- 可以直接在常量上进行处理:在常量后追加L、l,或(long)数据转换
数据类型之间是可以进行转换的,范围小的数据类型可以自动转换为范围大的数据类型;范围大的数据类型要转为范围小的数据类型,必须才用强制性的处理模式,同时还要考虑数据溢出问题
long num=2147483649; //error:出现较大的整数->2147483649L
程序支持有数据转换处理,但是如果不是必须的情况下,不建议这种转换。
在进行整型处理时,byte类型:-128~127,其范围是一个字节的大小
Java中,如果没超过byte范围的常量可以自动由int变为byte,如果超过了会进行强制类型转换。对于常量可以进行自动适配转换,但是对于变量需要强制类型转换
浮点型数据
主要描述小数,Java中任意一个小数常量对应的类型为double
所有的数据类型进行自动转型的时候都是从小类型向大类型进行自动转换处理
定义float类型的数据:float f=(float)10.2; or float f=10.2F;
整型是不含有小数点的,浮点型是包含小数点的
字符型
在Java中使用‘’的数据为字符型
在任何的编程语言之中,字符都可以与int进行互相转换,即所有的字符中都可以用int获得其对应的系统编码
几个重要的范围:
- 大写字母范围:A(65)~Z(90)
- 小写字母的范围:a(97)~z(122)
- 大小写字母之间差了32个数字的长度
- 数字范围:0(48)~(57)
Java中的char类型可以保存中文数据,因为Java使用的是Unicode这种16进制的编码,可以包括任意的文字内容,使得程序的开发十分简单。
布尔型
主要描述一种逻辑的处理结果
取值范围只有两个数据:true和false
一些编程语言中,0为false,非0为true,这种方式在Java中不存在
String字符串
在任何语言中都没有所谓的字符串这种基本数据,但为了方便有字符串的相应描述
Java中,可以像普通变量那样采用直接赋值的方式进行字符串的描述,“str”为字符型
定义:String str="Hello World!";
字符串的连接:str1+str2
在Java语言中,数据范围大的数据类型与数据范围小的数据类型进行计算时,所有的数据类型会自动转换为数据类型大的。在与字符串进行加减的时候全部转为字符串类型。
在描述字符串的时候也可以使用转义字符进行一些处理
Java运算符
运算符简介
所有的程序开发都是一种数字的处理游戏,对于数字的处理一定会有所谓的操作模式,而这些操作模式就称为运算符。
对于运算符而言是存在先后关系的。
对于程序开发而言,里面提供有大量的基础运算符,有其优先顺序。不建议编写很复杂的运算。
数学运算符
在Java中数学运算都提供有标准支持。
在进行变量计算时,编程语言提供有简化运算符的操作处理(+=,-=,*=,/=,%=)
++,–
- ++变量,–变量:先进行变量的自增或者自减,而后再进行数字的计算
- 变量++,变量–:先使用变量进行计算,而后再进行自增或自减
关系运算符
关系运算的主要特征是进行大小的比较处理:>,<,>=,<=,==
所有的关系运算返回的结果都是布尔类型
在进行关系判断时,需要注意相等的判断问题。在Java里面,=是赋值,==是判断
在进行关系判断时,除了可以针对所有的基本类型,也可以处理字符类型。数据类型会进行自动转型,字符型转换为数字进行比较。
逻辑运算符
三目(赋值)运算符需要设置一个逻辑关系的判断之后才可以进行的赋值操作
定义:关系运算?关系满足时的内容:关系不满足时的内容;
三目运算本身可以进行嵌套处理,但是可读性很差,根据实际情况判断是否使用
位运算
位运算指的是可以直接进行二进制数据的计算处理,主要有:与(&),或(|),异或(^),反码(~),移位处理
十进制与二进制之间的转换处理逻辑:数字除2取余,逆序(Java中的二进制是32位的)
- 与操作:两位都是1,结果为1
- 或运算:有一位是1,结果为1
- 移位计算
请解释&和&&,|和||的区别
- &和|两个运算符可以进行位运算与逻辑运算:
- 在进行逻辑运算的时候所有的判断条件都要执行
- 在进行位运算的时候知识针对当前的数据进行与和或处理
- 在逻辑运算上还可以使用&&、||
- &&:在若干个条件判断的时候,如果前面的条件返回了false,后续所有的条件不再执行,最终为false
- ||:在若干个条件判断的时候,如果前面的条件返回了true,后续条件不再执行,最终为true
Java程序逻辑控制
在一个程序开发中一共会存在三种程序逻辑:顺序结构,分支结构,循环结构。之前程序大多为顺序结构,即所有的程序将按照定义的代码顺序依次执行
IF分支结构
if分支结构主要是针对于关系表达式进行判断处理的分支操作。对于分支语句主要有三类使用形式,关键字为if,else
- if判断:
if(布尔表达式){条件满足时执行;}
- if……else判断:
if(布尔表达式){条件满足时执行;} [else{条件不满足时执行;}]
- 多条件判断:
if(布尔表达式){条件满足时执行;}
else if(布尔表达式){条件满足时执行;}
[else{条件不满足时执行;}]
if的特点是可以使用多个条件的判断,在进行多条件判断时,可以不写else语句
SWITCH开关语句
switch是一个开关语句,主要是根据内容来进行的判断,需要注意的是switch中可以判断的只能够是数据(int,char,枚举,String),而不能够使用逻辑运算.
switch(数值){
case 数值:{
数值满足时执行;
[break;]
}
case 数值:{
数值满足时执行;
[break;]
}
[default:
所有数值都不满足时执行;
[break;]
]
}
switch语句在进行设计时,如果没有在case后追加break,则会在满足第一数值后,执行后续所有的case语句或直到遇到break
while循环
所谓的循环结构指的是某一段代码被重复执行的处理操作,在程序之中提供有while语句,关键词有do,while,共有两种形式
- while循环:
while(布尔表达式){条件满足时执行;修改循环条件;}
- do……while循环:
do{条件满足时执行;修改循环条件;}while(布尔表达式)
- 区别:while先判断后执行,do……while先执行后判断
for循环
for(定义循环的初始化数值;循环判断;修改循环数据){循环语句的执行;}
对于while和for循环的选择只有一个参考标准:
- 在明确确定循环次数的情况下优先选择for循环
- 在不知道循环次数但是知道循环结束条件的情况下使用while循环
循环控制
循环控制语句:break,continue
- break:退出整个循环结构
- continue:只是结束当前的调用(当前循环)。当执行到continue时表示在当前的语句之中的后续代码不再执行,而直接进行后续的循环
C语言中有goto指令,会造成代码混乱,一般不用。Java中可以利用continue执行类似goto的部分功能,也很混乱。
循环嵌套
在一个循环语句中嵌套其他的循环语句。嵌套层次越多,时间复杂度越高。
方法的定义及使用
方法定义
在程序之中很多情况下是有可能需要重复执行一些代码的。本次在进行方法定义时有一个前提:方法在主类中定义,且由主方法直接调用。
方法的基本定义:
public static 返回值类型 方法名称([参数类型 变量,……]){ [return [返回值];]}
对于返回值而言,可以使用Java中的数据类型(基本数据类型,引用数据类型),在方法中可以进行放回数据的处理,如果要返回数据可以使用return来描述,return所返回的数据类型与方法的返回数据类型应相同,如果不返回可以使用void进行声明。
关于方法名称与变量的定义命名要求:第一个单词的字母小写,而后每个单词的首字母大写
方法的本质就是方便使用者进行重复的调用,并且程序一定是从主方法开始执行的
在定义方法的时候,如果方法的返回值类型为void,那么可以利用return来结束调用
方法重载
当方法名称相同,参数的类型或个数不同的时候就称为方法重载
方法的重载与返回值类型没有任何关系,它只跟参数有关系。但在实际开发中,建议方法重载建议其返回值类型相同
所有的输出操作支持各种数据类型,即System.out.println()本身是重载的
方法递归调用
一个方法自己调用自己的情况。
在进行方法递归调用时需考虑如下几点问题:
- 一定要设置方法递归调用的结束条件
- 每次调用的过程之中一定要修改传递的参数条件
少使用递归的原因:容易造成栈溢出
在进行阶乘计算时,采用的数据类型至少是double+