基础内容及语法
1.java基础
由硬件和软件组成
应用领域:
1)科学计算
2)人工智能(数据分析)
3)数据的处理
4)辅助设计
5)计算机网络…
软件的划分:
1)系统软件:dos,windows,Linux(centos7.8,红帽,deepin:国产),Mac
移动端:android,ios, 鸿蒙(华为)
2)应用软件: 客户端软件必须更新才能使用服务器高版本的功能!
QQ客户端
office办公软件
vnc-view(客户端)
vnc-service(服务端)
软件结构的划分:
C/S结构 :Client/Server 客户端和服务端
举例:QQ客户端
特点:客户端软件必须升级才能使用服务器高版本的功能
B/S架构:Browser/Server:浏览器和服务器端的交互 (以后的方向)
服务器:开源的服务器:tomcat web容器 理论并发访问量:500个;http服务器:nginx(负载均衡,反向代理):5万个
特点:只要能够满足计算机中有浏览器即可
(IE,firfox,谷歌,浏览器端不需要特定的升级,就能够访问服务器中的一些内容!
软件开发:
notepad++ 高级记事本
idea(2019/2020) :联想很精确(不适合前两周用)
DOS命令:
命令 | 用法 |
---|---|
exit | 退出当前DOS命令窗口 |
DOS复制: | 窗口中任意位置点击鼠标右键 |
dir | 列出当前目录下的所有子文件/子目录 |
cd | (change directory【改变目录】) |
cd … | 回到上级目录 |
cd \ | 直接回到根部路径 |
c:回车 d:回车 e:回车 f:回车 | 切换盘符 |
Ipconfig | 查看IP地址 |
Xxx -version | 查看版本 |
Del * | 删除 |
md | 创造一个文件夹 |
rd | 删除文件夹(必须为空) |
rd /s /q | 强制删除 |
rd /s | 带内容的目录(文件夹):询问是否删除这个目录 |
java的基本含义:
JDK:(Java Development Kit)java开发工具包
JRE:(Java Runtime Envirment)java运行环境
JVM:(Java Virtual Machine)java虚拟机
下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
安装jdk完成之后:进入dos,输入java -version:查看当前本地的jdk的版本信息
安装好jdk之后:需要在安装目录的bin目录去使用的编译命令和执行命令
javac.exe 编译命令
java.exe 运行命令
path环境(系统配置):
配置path环境变量的原因:
我们需要在任何目录下使用javac和java对Java源文件进行编译和运行
方式1:(存在弊端)
win10/win8---->此电脑---->右键属性---->高级系统设置---->环境变量---->系统变量 找到path将jdk安装目录的bin路径复制到path里面即可!
path: jdk\bin的路径
弊端:
1)当jdk版本升级了,开发者需要手动更改path:可能造成的path其他变量更改了,所以不好!
2)二阶段使用tomcat服务器(使用java编写的),启动的时候会寻找计算机中系统变量中的path是否存在
JAVA_HOME,如果找不到,服务器启动时候出现"闪屏";
使用方式2:(推荐):
win10/win8---->此电脑---->右键属性---->高级系统设置---->环境变量---->系统变量
新建变量名:
JAVA_HOME
变量值:
jdk路径
优点:
1)不需要手动更改path
2)tomcat服务器启动的时候,找到JAVA_HOME变量,就不会出现闪屏
path环境变量的执行流程:
写好了java文件,对java文件进行编译和运行;
1)首先需要在dos中找到java文件的目录,如果找不到
2)就会在path环境变量中找%JAVA_HOME%\bin
3)如果path中都没有这个文件,那么久会提示 找不到文件…
classpath:临时环境变量(了解):
classpath执行流程:先在系统变量中寻找是否存在classpath的路径
如果存在优先的是这里面的xxx.class文件
2.注释
单行注释:
//只注释当前行
多行注释:
/*
注释内容
注释内容
...
*/
javadoc注释:
(这种注释是比较专业的注释,该注释信息会被javadoc.exe工具解析提取并生成帮助文档)
/**
\* javadoc注释
\* javadoc注释
\* javadoc注释
\* javadoc注释
\* javadoc注释
*/
3.关键字和标识符
3.1关键字
什么是关键字:
被Java语言赋予特定含义的单词!
而且在高级记事本以及开发工具中,针对"关键字"有一种特殊颜色标记!
notepad++ eclipse/idea
editplus
注意事项:
goto和const这两个作为保留字使用,不是关键字!
关键字:
class :表示创建一个类(是Java最基本的单元)
public :权限修饰符的一种 :公共的,公开的,访问权限足够大
static :后面面向对象部分讲: 静态修饰符号
void :和Java中的方法有关系 (讲Java方法的时候去说)
3.2标识符
什么是标识符
在Java原程序当中凡是程序员有权利自己命名的单词都是标识符(黑色字体)
可以标识的元素:类名、方法名(main)、变量名、接口名、常量名(srgs)…
标识符的组成:
一个合法的标识符只能由“数字、字母、下划线_、$”组成,不能含有其他符号
开头不能是数字
严格区分大小写
关键字(蓝色的)不能做标识符
理论上无长度限制,最好不要太长
如果是单个单词:
字母全部小写
举例:
main()
int price = 100 ;
如果是多个单词:
第一个单词字母全部小写,从第二个单词开始每个单词首字母大写,其余小写(小驼峰命名法)
举例:
checkUserName()
int applePrice = 100 ;
给常量命名的规则:
如果是单个单词:字母全部大写(推荐多个单词)
举例:
HELLO=100;
如果是多个单词:每个单词字母大写,单词和单词使用下划线隔开
举例:
HELLO_WORLD=100;
后期学习:Thread:线程类
public final static int MIN_PRIORITY = 1; 最小优先级
public final static int NORM_PRIORITY = 5; 默认优先级
public final static int MAX_PRIORITY = 10;最多优先级
4.常量
在程序的执行过程中,其值不发生改变的量!
1)字面值常量
**字符串常量:**使用双引号包裹起来的内容:称为"字符串常量"
举例:
“我爱高圆圆”
“HelloWorld”
**字符常量:**使用单引号包裹起来的内容
举例:
‘a’,‘A’,‘0’
‘我’
‘abc’ 非法数据(只能单引号括起来的单个内容)
整数常量:
100 包含"进制" 整数----默认十进制
64
…
小数常量:
3.14
12.56
布尔常量:true false
空常量:null
引用数据类型默认值null
2)自定义常量
(面向对象后面讲:关键字:final:状态修饰符)
public final static int MIN_PRIORITY = 1; 最小优先级
5.变量
什么是变量?
变量本质上来说是内存中的一块空间,这块空间数据类型、有名字、有字面值
变量包括:数据类型、名称、字面值
变量是内存中存储数据的最基本的单元
变量要求:
变量存储的具体的“数据”,必须和变量的“数据类型”一致,当不一致的时候,编译报错。
变量的声明/定义变量的语法格式:
数据类型 变量名(合法标识符);
变量的赋值:
语法格式:变量名 = 字面值(“=”是赋值运算符)
PS.字面值的数据类型必须和变量名的数据类型一致
eg.
Int i=10;//声明和赋值可以放在一起完成
/*
变量赋值之后,可以重新赋值(变量值可变)
有了变量的概念之后,内存空间得到后可重复使用
*/
int i=10;
System.out.println(i);//10
int i=100;
System.out.println(i);//100
...
...
System.out.println(i)
访问变量的访问方法:
1.读取变量中保存的具体数据 get/获取
2.修改变量中保存的具体数据 set/设置
eg.
i=20;//set
System.out.println(i);//get
//变量在一行上可以声明多个。先声明,再赋值,才能访问。
int a,b,c;
int a=1;
int b=2;
int c=3;
Java代码是遵循自上而下的顺序依次执行的,前一行的代码必须完整的结束之后,下一行的程序才能执行
在同一个“作用域”当中,变量名不能重名,但是变量可以重新赋值
变量的作用域:
作用域:变量的有效范围,在什么范围之内是可以被访问的,只要出了这个范围,变量就不会被访问了。出了{}就不认识了。
变量的分类:
根据变量声明的位置来分类:
局部变量:在方法体中声明的变量
成员变量:在方法体外,类体之内声明的变量
(不同作用域中,变量名可以重名;同一作用域中,变量名不能重名)
6.数据类型
数据类型的作用?
不同的数据有不同的类型,不同的数据类型底层会分配不同的空间
数据类型是指导程序在运行阶段应该分配多大的内存空间
6.1基本数据类型
基本数据类型 | 取值范围 | 默认值 | 占用空间大小(字节) |
---|---|---|---|
byte | -128~127 | 0 | 1 |
short | -32768~32767 | 0 | 2 |
int | -231~2……231-1 | 0 | 4 |
long | -263~263-1 | 0 | 8 |
float | 0.0f | 4 | |
double | 0.0d | 8 | |
char | 0~2^16-1(65535) | false(0) | 2 |
boolean | true/flase | /u0000 | 1 |
字节
1 byte = 8 bit(1bit表示一个二进制位)
1 KB = 1024 byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
整数型当中的byte类型,占用1个字节,所以byte类型的数据占用8个比特位。
byte类型的取值范围是多少呢?
关于java中的数字类型,数字都是由正负之分的,所以在数字的二进制当中有一个二进制位被称为“符号位”,并且这个“符号位”在所有二进制位的最左边,0表示正数,1表示负数。
max:01111111(10000000(二进制)-1=127) min:11111111(-127)
具体的二进制表示还包括:原码、补码、反码
进制转换
二换十 十换二…
计算机只认识二进制,那么计算机是如何表示现实世界当中的文字呢?
八种基本数据类型中char类型表示的是现实生活中的文字,文字和计算机二进制之间默认情况下是不存在任何转换关系的。
为了让计算机可以也表示先生世界当中的文字,我们需要进行人为的干涉,需要人负责提前制定好“文字”和“二进制”之间的对照关系。这种对照关系被称为:字符编码。
计算机最初只支持英文,最先出现的字符编码是:ASCII码
‘a’=97【01100001】
‘A’=65
‘0’=48
编码和解码时采用同一套对照表,不会出现乱码。
当解码和编码时采用的部室同一套对照表时,会出现乱码
数据类型转换
public class 练习{
public static void main(String[] args){
/*
100L是long类型字面值
x是long类型变量
不存在类型转换,直接赋值
*/
long x=100L;
/*
x是long类型,8个字节
y是int类型,4个字节
编译报错,大容量不能直接变一个小容量
int y=x;
大容量转换小容量,需要进行强制类型转换
强制类型转换需要加“强制类型转换符”
加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度
随意强制类型转换谨慎使用,因为损失精度之后损失很严重
强制转换原理
原始数据 00000000 000000000 00000000 00000000 0000000 0000000 00000000 01100000
强制转换之后:00000000 0000000 00000000 01100100
将左边的二进制砍掉!
*/
int y=(int)x;
System.out.println(y);
/*
原始数据:00000000 000000000 00000000 00000000 10000000 00000000 00000000 000000000
强制转换之后的数据:10000000 00000000 00000000 00000000(补码形式)
以上补码转换到原码就是最终结果
*/
long k=2147483648L;
int e=(int)k;
System.out.println(e);//损失精度非常严重,结果是负数【-2147483648】
/*
依据目前内容,以下程序无法编译
理由:50是int类型的字面值,b是byte类型的变量
显然是大容量int转换成的小容量byte
大容量转换成小容量是需要添加强制转换符的,一下程序没有添加强制转换符号,所以编译报错
但是,实际编译时,以下代码通过了,盖子面值可以直接赋值给byte类型的变量
*/
byte b=50;//可以
byte c=127;//可以
//编译报错,128这个int类型的字面值超出了byte类型的取值范围,不能直接赋值给byte类型的变量
//byte b1=128;
byte b1=(byte)128;//-125
/*
纠正错误,需要使用强制类型转换符,但是一定会损失精度
原始数据:00000000 00000000 00000000 10000000
强制转换之后10000000【这是储存在计算机内部的,这是一个补码,】
System.out.println(b1);
*/
}
}
补码:
正数:与原码相同
负数:0变1,1变0,后加1
当一个整数字面值没有超出byte、short、char的取值范围,这个字面值可以直接赋值给byte、short、char类型的变量。(为了方便程序员的编程)
6.2引用数据类型
数组、类、接口
7.运算符
7.1算术运算符
运算符有优先级,一个表达式当中有过多个运算符,不确定的加(),优先级得到提升。
没有必要专门去记忆运算符优先级
++出现在变量后,先做赋值运算,在对变量中保存的值进行自加1
++出现在变量前,先进性自加1,在进行赋值
7.2关系运算符
关系运算符的运算结果一定是布尔类型:true/false
7.3逻辑运算符
& 逻辑与 (两边的算子都是真,结果才为真)
| 逻辑或 (两边算子只有一个是真,结果就是真)
! 逻辑非 (取反)
^ 逻辑异或 (两边算子不一样(真假/假真),结果就是真)
&& 短路与 (与逻辑与运算结果相同,不过短路与存在短路现象)
前半被判为false,整句便是false,后半便不再执行(比逻辑与更智能)
|| 短路或 (与逻辑或运算结果相同,不过短路或存在短路现象)
前半为真,整句为真,后半不再执行
逻辑运算符要求两边的算子都是布尔类型,并且逻辑运算符最终的运算结果也是一个布尔类型
7.4赋值类运算符
基本的赋值运算符:
=
扩展的赋值运算符:
+= -= *= /= %=
eg.
byte b=10;
b=b+5;//报错
纠正:
b = (byte)(b+5);
b + = 5;//b+=5等同于b=(byte)(b+5)
扩展类的赋值运算符,不改变运算结果的数据类型(假设最初是byte,无论怎么追加、追减,最终结果还是byte类型)
7.5字符串连接运算符
关于java中的“+”运算符
1加法运算(数字+数字)
2字符串的连接运算(字符串+字符串)
3在一个表达式当中可以出现多个“+”,在没有添加小括号的前提下,遵循自左向右依次运算。
eg.
int a=1;
int b=2;
System.out.println(a+“+”+b+“=”+(a+b));//1+2=3
7.6三元(三目/条件)运算符
语法规则:
布尔表达式?表达式1:表达式2
执行原理:
当布尔表达式结果为真时,选择表达式1作为整个表达式的执行结果
当布尔表达式结果为假时,选择表达式2作为整个表达式的执行结果
eg1.
boolean sex=true;
Char c =sex ? ‘男’:‘女’;//男
eg2.
Sex=true;
System.out.println(sex ?‘男’:“女”);
7.7位运算符
位运算符 | |
---|---|
<< | 乘2的n次幂 |
>> | 除2的n次幂 |
>>> | 被移位二进制最高位无论是0还是1,空缺位都用0补。 |
流程控制语句
8.流程控制语句
1.顺序结构语句
2.选择结构语句
2.1 if语句
if语句的语法结构:四种编写方式
/*PS.对于java中的if语句来说,只要有一个分支执行,整个if语句全部结束。*/
//第一种:
if(布尔表达式){
/*
java语句;
java语句;
java语句;
java语句;
...
*/
}
//第二种:
if(布尔表达式){
/*java语句;
java语句;
...
*/
}else{
/*
java语句;
java语句;
...
*/
}
//第三种:
if(布尔表达式){
/*
java语句;
java语句;
...
*/
}else if(布尔表达式){
/*
java语句;
java语句;
...
*/
}else if(布尔表达式){
/*
java语句;
java语句;
...
*/
}.....
//第四种:
if(布尔表达式){
/*
ava语句;
java语句;
...
*/
}else if(布尔表达式){
/**
java语句;
java语句;
...
*/
}else if(布尔表达式){
/*
java语句;
java语句;
*/
...
}else{
/*
java语句;
java语句;
...
*/
}
第二种编写方式和第四种编写方式都带有else分支,这两种方式可以保证100%会有分支执行。
所有的控制语句是可以相互嵌套使用的。只要河里嵌套就行。
嵌套使用时,代码格式保持完美。【该缩进时,必须缩进】
if语句的分支中只有一条java语句时,大括号可以不写。
eg.
import java.util.Sacnner;
public class 天气问题 {
public static void main(String[] args) {
System.out.println("闲的没事干的寒假编程练习");
System.out.println("天气分为“sun”和“rain”两种");
System.out.println("性别分为“man”和“rain”两种");
java.util.Scanner s = new java.util.Scanner(System.in);
//接收天气状况
System.out.print("请输入当前天气状况:");
String weather = s.next();
System.out.print("请输入性别:");
String sex =s.next();
if("sun".equals(weather)){
System.out.print("请输入今天的温度:");
int wendu =s.nextInt();
System.out.println("大晴天");
if(wendu>30){
if("man".equals(sex)){
System.out.println("戴墨镜");
}else if("woman".equals(sex)){
System.out.println("撒防晒霜");
}else{
System.out.println("看清楚再输入!");
}
}else{
System.out.println("不出门了");
}
}else if ("rain".equals(weather)){
System.out.println("大雨天");
if("man".equals(sex)){
System.out.println("大黑伞");
}else if("woman".equals(sex)){
System.out.println("小花伞");
}else{
System.out.println("看清楚再输入!");
}
}else {
System.out.println("看清楚再输入!");
}
}
}
2.2swtich语句
switch语句的语法结构:
switch(int或String类型的字面值或变量){
case int或string类型的字面值或变量:
java语句;
...
break;
case int或string类型的字面值或变量:
java语句;
...
break;
case int或string类型的字面值或变量:
java语句;
...
break;
Default:
java语句;
....
}
执行原理:
1 switch后面小括号当中的“数据”和case后面的“数据”进行一一匹配,匹配成功的分支执行。
2 按照自上而下的顺序依次匹配。
3 匹配成功的分支执行,分支当中最后有“break”语句的话,整个switch语句终止。
4 匹配成功的分支执行,分支当中没“break”语句的话,直接进入下一个分支执行(不进行匹配),这种现象被称为case穿透现象(提供break语句可以避免穿透现象)
5 所有分支都没有匹配成功的话,当有default语句时,会执行default语句中的
6 switch后面和case后面只能是int或string类型的数据,不能是其他类型
当然byte short char也可以直接写到switch和case后面,因为他们可以进行自动类型转换转换成int类型。
7 case可以合并:
int i=10; switch(i){ case1:case2:case3: System.out.println(“test code!”); }
eg.
import java.util.Sacnner;
public class Switch今天星期几 {
public static void main(String[] args) {
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("猜猜今天星期几:");
int num = s.nextInt();
switch(num){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期天");
break;
default:
System.out.println("请输入一到七中的数字");
}
}
}
3.循环结构语句
3.1 for语句
switch语句的语法结构:
for(初始化表达式;布尔表达式;更新表达式){
//是需要重复执行的代码片段【循环体:由java语句构成】
}
eg.1
public class JavaApplication5 {
public static void main(String[] args) {
for(int i=1;i<=10;i+=2 ){
System.out.println("i="+i);
}
for(int j=2;j<=10;j+=2 ){
System.out.println("j="+j);
}
for(int k=10;k>0;k-- ){
System.out.println("k="+k);
}
for(int z=100;z>0; ){
System.out.println("z="+z);
z-=10;
}
}
}
循环语句和条件判断语句嵌套使用
最好不要想太多,即使循环体当中是一个for循环,不要将这个for特殊化,
【for和if的嵌套】
eg.2
//100以内的所有质数
public class ForFor嵌套求质数 {
public static void main(String[] args) {
//给范围
for(int i=2;i<=100;i++){
//求素数
boolean sushu = true;
for(int j=2;j<i;j++){
if(i%j==0){
sushu = false;
break;
}
}
//输出
if(sushu){
System.out.print(i+"\t");
}
}
}
}
eg.3
//10000以内的所有质数,每八个数字换一行
//方法①
public class ForFor嵌套求质数 {
public static void main(String[] args) {
int count=0;
//给范围
for(int i=2;i<=10000;i++){
//求素数
boolean sushu = true;
for(int j=2;j<i;j++){
if(i%j==0){
sushu = false;
break;
}
}
//输出
if(sushu){
count++;
System.out.print(i+"\t");
if(count%8==0){
System.out.println();
}
}
}
}
}
//方法②
public class 求质数升级版 {
public static void main(String[] args){
int count=0;
for(int i=1;i<10000;i++){
boolean sushu = true;
for(int j=2;j<i;j++){
if(i%j==0){
sushu = false;
break;
}
}
//输出
if(sushu){
count++;
System.out.print(i+"\t");
if(count==8){
System.out.println();
count=0;
}
}
}
}
}
3.2 while语句
while循环的语法结构:
while(布尔表达式){
循环体;
}//表达式为true时,执行循环体
while循环的循环次数:
0到N次,while循环的循环体可能一次都不执行
eg.
//输出0-10:
public class ArrayOutPut {
public static void main(String[] args){
int i=0;
while (i<10){
System.out.print(i+"\t");
i++;
}
}
}
3.3 da-while语句
\\do...while循环的语法结构:
do{
循环体;
}while(布尔表达式);
do…whlie循环体代码片段执行次数是:1-N次(至少一次)
do…while循环的注意事项:do…while循环语句最终有一个分号
4.跳转语句
4.1break
break是Java语句中的关键字,翻译为“中断/折断”
break+“;”可以成为以单独的完整java语句:break;
break语句使用在switch语句当中,用来终止switch的语句执行。
break语句同样可以使用在循环语句当中,用来终止循环的执行
break语句使用在for、while、do…while循环语句当中用来跳出循环,终止玄幻的执行。因为当程序循环到某个条件的时候,后续循环没必要执行,在执行也是耗费资源,所以可以终止循环,这样可以提高程序的执行效率。
在默认情况下,break终止的是离他最近的循环语句:
4.2continue
continue表示是:继续/下一个
continue的java语句:continue;
break和continue的区别:
break:跳出循环
continue:进入下一循环