JavaSE基础
Java发展和环境搭建
Java发展史
-
91年sun公司开发OAK项目,开发Java跨平台的语言
("write once,run anywhere")
-
95年 互联网爆发 Java语言诞生
-
09年左右 Oracle公司收购SUN公司(74亿元)
-
目前为止,Java语言也是市场占用率较高的语言(Web开发BS架构)
JAVA之父:詹姆斯高斯林
Java版本
-
JavaSE: Java基础开发方向,Java的核心
-
JavaEE: 企业开发应用
-
JavaME: 移动设备,嵌入式设备
- 2004年,J2SE 5.0 (1.5.0) Tiger老虎 引入泛型;增强循环,可以使用迭代方式;自动装箱与自动拆箱;类型安全的枚举;可变参数;
- 2011年,J2SE 7 Dolphin海豚 switch语句块中允许以字符串作为分支条件;在创建泛型对象时应用类型推断;在一个语句块中捕获多种异常;
- Java 8=JDK1.8(2014)
5的新特性
1、泛型 Generics:**
2、枚举类型 Enumeration:
3、自动装箱拆箱(自动类型包装和解包)autoboxing & unboxing:
4、可变参数varargs(varargs number of arguments)
5、Annotations 它是Java中的metadata(注释)
6、新的迭代语句(for(int n:numbers))
7、静态导入(import static )
8、新的格式化方法(java.util.Formatter)**
7的新特性
1,switch中可以使用字串2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断3.语法上支持集合,而不一定是数组4.新增一些取环境信息的工具方(IO临时文件夹,JRE安装目录)5.Boolean类型反转,空指针安全,参与位运算6.两个char间的equals 7.安全的加减乘除
8新特性举例
Lambda 表达式
函数式接口
Stream 接口
特性和优势
- 简单性
- 面向对象
- 可移植性
“一次编写,随处运行”:“write once, run anywhere”
- 高性能
- 动态性
- 多线程
- 安全性
- 健壮性
Java软件的基本组成
JDK
JDK(Java SE Development Kit),Java标准开发平台,它提供了编译、运行Java程序所需的各种工具和资源 .java文件
JRE
JRE( Java Runtime Environment) 、Java运行环境,用于解释执行Java的字节码文件。 .class
JVM
JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。
它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。
所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。
跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。
程序执行过程:软件开发中没有啥业务需求不是通过增加一层不能解决的,如果一层不够,加两层
Java环境安装
- 前置知识点
安装:建议安装目录不要使中文,单独选址安装,检查版本
安装前
安装后
打开dos窗口(Disk Operation System)
打开DOS命令行
唤醒运行窗口win + r
输入cmd
.进入
[
测试是否安装成功
java - version
==注意:如果没有环境变量,只能在JDK的安装目录使用命令
打开环境变量
添加path
的环境变量
新建-设置JAVA_HOME
配置Path
搞定收工
补充知识点:
命令主要分为:
- 内部命令:操作系统内置的
- 外部命令:通过安装之后
- 批处理命令: .bat
⭐环境变量的配置核心目标是:就是将安装的可执行程序,变成对应的外部命令,让其可以通过命令行进行操作
环境变量的配置:
目的:为了能够在任意路径下使用javac.java等命令;path:%JAVA_HOME%\bin
目的:1为了不频繁操作path 2未来安装tomcat内容时默认查找本地JAVA_HOME
寻址过程:
常用的DOS命令
1.内部命令(系统自带的,可以使用命令)
2.外部命令(安装应用程序时,自动设置到系统环境中的命令)
3.批指令 (批量处理一些操作的指令)
>help
# 查看系统中所有的内部命令
>help 命令名
#查看制定命令的使用方式
>help dir
#查看dir的使用方式
>dir
#显示当前路径下的目录
>dir [/A:h /O:s]
#/A属性,表示隐藏文件;/O排序方式,s表示文件大小排序
#查看当前路径下所有的隐藏文件夹,并按大小排序
#dir[/属性1:属性值1][/属性2:属性值2]
>cd
#查看当前目录或更改目录
>cd.
#查看当前目录
>cd..
#查看当前目录的上一级目录(父目录)
>cd [path]
#更改目录到指定路径
>md 文件夹名
#创建文件夹
>md a\b
#在当前目录下创建a文件下,并在a文件夹下创建b文件夹
rd[path]文件夹名
#删除当前路径/制定路径下的文件夹
>rd a
#如果a文件夹下有子目录,则不能删除
>rd /s a
#删除a文件夹及其子目录(需手动确认)
>rd /s /q a
#删除a文件夹及其子目录(不需要确认)
>md a\b
>cd a\b
>copy con wb.txt(加回车键然后换行输入文本内容)
#在a文件夹里b文件中创建一个txt文件并输入内容,最后用Ctrl + c退出
Tab自动填充
↑↓再次寻找使用过的命令,↑向前找,↓向后找
cls 清空屏幕
exit 退出
☆第一个Java程序
-
新建一个文件,修改文件后缀名为
.java
,文件名任意(千万记得显示文件扩展名)注意:不建议使用中文,每个单词的首字母大写,其他小写,比如HelloWorld
-
编写程序java文件的内容
注:String[] args 与String args[]都可以执行,但推荐使用前者,可避免歧义与误读
public class HelloWorld{ public static void main(String[] args){ System.out.println("HelloWorld!!!"); } }
-
编译
.java
文件javac HelloWorld.java
-
>javac HelloWorld.java
注意:编译时,当前所在目录要与.java文件同级,否则需要设置文件的全路径
比如:
-
解释
.class
字节码文件 -
>java HelloWorld
注意:编译时,当前所在目录要与.class文件同级,否则需要通过
-cp
设置文件的全路径
如果遇到编码问题,用-encoding UTF-8
选项设置来编译
常见问题
-pulic 一个修饰符,表示公共的,共有的,被public修饰的class称为主类
-Class 表示java语言中的类 `public class 类名{}`
-public static void main(String[] args)是每一个Java程序的入口
-args 可以看出它是一个数组,args[0]传入的第一个参数
-public 公共的
-static 静态的
-void 无返回值
-main 主方法
-String[] args 从控制台接收参数
代码解释
public class HelloWorld{ //此时的类名必须与文件名一致
public static void main(String[] args){ //程序的入口
System.out.println("HelloWorld!") //以分号结尾
}
}
- 拓展:dll文件的作用
- DLL 是 Dynamic Link Library 的缩写, 意为动态链接库。
- DLL 是一个包含可由多个程序同时使用的代码和数据的库。通过使用 DLL, 程序可以实现模块化, 由相对独立的组件组成。可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。 dII 文件在程序中的最大作用是加速程序运行。
- 1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。
- 动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
JavaSE基础语法
标识符
-
3个规则
- 标识符 标识符以字母/下划线/美元符号开头,后面可以是字母/下划线/美元符号/数字组成.不能以数字开头
- 标识符不能是关键字
- 标识符严格区分大小写
-
2个规范
- 见名知意
- 驼峰规则
-
1个注意
- JAVA不采用通常语言使用的ASCⅡ字符集,而是采用unicode这样的标准国际字符集.因此,这里的字母的含义:英文/汉字等等
abstract | Assert | boolean | break | byte | case |
---|---|---|---|---|---|
catch | char(character) | class | const | continue | default |
do | Double | else | extends | final | finally |
float | For | goto | if | implements | import |
instanceof | Int | interface | long | native | new |
null | Package | private | protected | public | return |
short | Static | strictfp | super | switch | synchronized |
this | Throw | throws | transient | try | void |
volatile | While |
不能使用关键字作为变量名或方法名,Java关键字是Java语言保留供内部使用的
注释
注释是对书写内容的解释和说明。是程序员为读者作的说明,是提高程序可读性的一种手段。我们写的代码是给机器执行的,也是给人看的,在很多时候需要添加一些必要的说明,提示读者,这些说明并不会对代码产生任何影响,也不需要执行。则使用程序中的注释来实现。
变量
程序运行期间,其值可以发生改变的容量,称为变量.
我们通过变量来操纵存储空间中的数据,变量就是指代这个存储空间!空间位置是确定的,但是里面放置什么值不确定
变量的声明和使用
变量三要素:数据类型,变量名,生命周期(作用范围);
- 变量一定要先声明再初始化,然后才能使用,声明和初始化可以分开也可以写在一行;
- Java 中,同一个作用域内,不能定义重名变量;
- 变量的值是可以随便修改的;
数据类型
数据类型 | 占用空间 | 表数范围 | tips |
---|---|---|---|
byte字节型 | 1字节B | [-128,127] | 存储范围有限,小心赋值,一般用来表状态 |
short短整型 | 2字节2B | [-32768,32767] | Java中没有无符号类型 |
int整形 | 4字节4B | ±21亿 | |
long长整型 | 8字节8B | 很大很大63次方 | 字面值默认为int,如果强赋值,需加L或l |
double双精度 | 8字节 | 15-16位 | 如果运算,扩大倍数,缩小倍数;BigDecimal |
float单精度 | 4字节 | 6-7位 | 小数默认double型,强赋值需要加F或f |
boolean布尔 | B?b?4B? | false true | |
char字符型 | 2B | 单引号的单个字符 | 正整数,unicode代码点赋值,可四则运算 |
转义字符:
- \b 退格
- \n 换行
- \t 制表符位
- \r 行头
类型转换:
- 小变大,自动转:四则运算,自动向大类型转换;boolean类型不能参与四则运算,且boolean类型
无法进行类型转换。 - char
↓
byte->short->int->long->float->double - 强制类型转换:大变小,需强转
- 强转有风险,但是可控(已知风险),数据可能损失
- byte short char在赋值时,如果字面没超过对应数据类型范围,可正常赋值,
- 四则运算中出现变量,一定会出现类型转换,如果都是字面值,编译器会进行
常量折叠
计算字面值
小数在计算机中的存储方式
常量
程序运行期间,其值不可以发生改变.通过final修饰的变量,为常量.
class test11{
public static void main(String[] args){
final double PI = 3.14;
System.out.println(PI);
}
}
命名规则
所有变量、方法、类名:见名知意
类成员变量:首字母小写和驼峰原则 : monthSalary
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线:MAX_VALUE
类名:首字母大写和驼峰原则: Man, GoodMan
方法名:首字母小写和驼峰原则: run(), runRun()
运算符
Java 语言支持如下运算符:
算术运算符: +,-,*,/,%,++,–
赋值运算符 =
关系运算符: >,<,>=,<=,==,!=, instanceof
逻辑运算符: &&,||,!
位运算符: &,|,^,& , >>,<<,>>> (了解!!!)
条件运算符 ?:
扩展赋值运算符:+=,-=,=,/=
一元运算符
++(自增),–(自减),了解一个,另一个含义相同
++ 基本含义:在整型变量原来值的基础上增加 1,然后赋值给当前变量
++i(前导自增): 先将变量的值增加 1 , 赋值给自己,再进行其他运算
i++ (后导自增):先取出变量的值使用,然后再将变量的值增加 1, 赋值给自己
int a = 5;
int b = a++; //先给b赋值,再自增,执行完b=5,a=6
int c = ++a; //先自增再给c赋值,执行完c=7,a=7
注意:java中的乘幂处理
//int a = 3 ^2; //java不可以,^是异或符号
double b = Math.pow(3,2);
Math类提供了很多科学和工程计算需要的方法和常数。
逻辑运算符
位预算符
~ : 按位取反
& : 按位与
| : 按位或
^ : 按位异或
<< :左移运算符
…>>右移运算符
:>>>无符号移位运算符
右移一位相当于除2取商。
左移一位相当于乘2
扩展运算符
条件运算符
三目条件运算符
int score = 80;
int xy = -100;
String type = score < 60 ? "不及格":"及格";
int fl = xy > 0? 1 :(xy == 0 ? 0 : -1);
System.out.println("type=" +type);
System.out.println("fl=" +fl);
//type=及格
//fl=-1
运算符优先级
单目乘除位运算,逻辑三目后赋值
大家不需要去刻意的记住他,表达式里面优先使用 小括号来组织!!
类型转换
自动类型转换
- 自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。在图中,黑色的实线表示无数据丢失的自动类型转换,而红色的虚线表示在转换时可能会精度的损失。
- 特例: 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围
强制类型转换
- 强制类型转换(Cast): 强制类型转换,又被称为造型,用于显式的转换一个数值的类型. 在有可
能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。 - 强制类型转换的语法格式: (type)var ,运算符“()”中的type表示将值var想要转换成的目标数据类
型。
两个工具
随机生成
Math 类提供了一个名叫 random 的方法, 可以随机生成 [0,1) 之间的任意double类型的数据。
-
通过扩大和平移可以生成任意区间的数据
-
通过强转可将小数取整
键盘录入
键盘录入可以允许用户在程序运行过程中向程序输入数据,达到人机交互的效果,提高用户体验度。
但是需要进行一些额外的操作,后面会具体解释
- 导包 ( import java.util.Scanner; ) 告诉程序这个工具在何处
- 创建对象( Scanner sc = new Scanner(System.in); ) 创建工具
- 获取数据 ( int num = sc.nextInt(); ) 使用工具获取数据
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入年龄");
int age = sc.nextInt();
System.out.println(age);
}
}
package com.sh.utils02;
import java.util.Scanner;
/*
基本数据类型 :
基本数据类型 变量名 = 数据值;
引用数据类型 :
1.导包
作用 : 指明要使用的引用数据类型的位置
语法 : 通过import导包
写法 : import 权限定名(包名.类名);
位置 : 类class的上面 包信息package的下面
2.创建引用数据类型的引用(对象)
引用数据类型 变量名|引用 = new 引用数据类型();
3.使用功能
引用.功能名字();
Scanner : 接收用户键盘输入的内容
1.导包
import java.util.Scanner;
2.创建Scanner类型的引用
Scanner sc = new Scanner(System.in);
3.使用功能
sc.nextByte()
sc.nextShort()
sc.nextInt() 接收用户键盘输入int类型数据,从有效字符开始,遇到enter键结束功能
sc.nextLong()
sc.nextFloat()
sc.nextDouble()
sc.next() 接收用户输入的字符串数据,从有效字符开始接收,遇到enter键结束功能,如果在接收的过程中一旦遇到空格,tab...就停止接收
sc.nextLine() 接收用户输入的一整行内容,可以接收空格,直到遇到enter结束功能
4.关闭
sc.close() 当前类中使用完毕Scanner最好关闭使用资源
*/
public class Class001_Scanner {
public static void main(String[] args) {
//1)导包
//2)创建Scanner类型的引用
Scanner sc = new Scanner(System.in);
//3)使用功能
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println(age);
System.out.println("请输入你的月薪:");
double sal = sc.nextDouble();
System.out.println(sal);
System.out.println("请输入你的姓名:");
String name = sc.next();
System.out.println(name);
//处理之前next功能遗留的数据+enter
sc.nextLine();
System.out.println("请输入你的用户名:");
String username = sc.nextLine();
System.out.println(username);
//关闭
sc.close();
}
}
控制语句
控制语句就是掌握程序的流向,使程序按业务逻辑目的运行的代码。即用来实现对程序流程的选择、循环、转向和返回等进行控制。
从结构化程序设计角度出发,程序有三种结构: 顺序结构 , 选择结构 , 循环结构
switch选择
switch :定值判断
语法 :
switch(表达式|变量){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n;
break;
}
执行流程 :
1.执行()中的表达式,拿结果值|变量的值,
2.与case后面定值进行判断是否相等,如果存在多个case从上到下依次判断
3.如果相等,执行对应的语句体,如果不相等继续往下判断
4.执行完毕语句体值,如果遇到break结束switch语句结果
5.如果以上所有的case都不满足,如果存在default,执行语句体n
详解 :
1.switch语句中()中的内容,表达式的结果类型|变量的类型只能为 : byte,short,int,char,String(jdk1.7),枚举(jdk1.5)
2.break 终止结束switch语句
如果没有添加break,会发生case穿透
case穿透 : 当找到值相等case,执行对应的语句体,语句体执行完毕,没有遇到break,会继续向下穿透,下面的case不在判断,继续执行语句体,直到遇到下一个break或者switch语句的结束而结束
3.default : 所有的case后面的值与()中结果都不相等时,执行default后的内容-->相等else可以定义在switch语句任意位置一般在最后定义的default后面的break可以省略,但是在其他位置定义default后面break不能省略;
2.与case后面定值进行判断是否相等,如果存在多个case从上到下依次判断
3.如果相等,执行对应的语句体,如果不相等继续往下判断
4.执行完毕语句体值,如果遇到break结束switch语句结果
5.如果以上所有的case都不满足,如果存在default,执行语句体n
详解 :
1.switch语句中()中的内容,表达式的结果类型|变量的类型只能为 :
byte,short,int,char,String(jdk1.7),枚举(jdk1.5)
2.break 终止结束switch语句
如果没有添加break,会发生case穿透
case穿透 : 当找到值相等case,执行对应的语句体,语句体执行完毕,没有遇到break,会继续向下穿透,下面的case不在判断,继续执行语句体,直到遇到下一个break或者switch语句的结束而结束
3.default : 所有的case后面的值与()中结果都不相等时,执行default后的内容-->相等else可以定义在switch语句任意位置一般在最后定义的default后面的break可以省略,但是在其他位置定义default后面break不能省略;