关于程序语言
- 是什么
程序语言是一门特殊的语言,不像英语,汉语是用于人与人之间交流的,程序语言是人类与计算机交互的媒介。
- 为什么
类比一下,如果你想和动物交流,就得知道动物的各种叫声代表着什么。同理,如果要和计算机交流,就必须得知道计算机的交流方式。但是由于计算机所能理解的01过于复杂,先驱们发明各种各样的程序语言,使得编程的门槛降低。计算机是不能理解程序语言的,但通过编译器解释器的转换,最终程序代码以01的形式传递给计算机。随着计算机的发展人们通过设计规范来使得控制计算机变得更加容易,这些规范就是程序语言。
程序语言被编译执行后本质上传输给计算机的还是01,但相对于直接向计算机传输01指令,使用程序语言无疑是更好的选择。
1,JDK环境配置
1.1,win10安装JDK8
【安装步骤】
- jdk8下载地址:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
【下载的安装包主要包含JDK,JRE,JavaFx包】(JavaFX主要用于桌面端开发)
- 设置jdk安装路径
- 设置jre安装路径
-
设置环境变量
- 找到jdk安装的bin目录,复制安装路径
-
右键电脑选择属性
添加刚刚复制的路径到path里:
点击三个确定。
-
查看是否安装成功
java -version
java
javac
1.2,运行HelloWorld
【命令行运行Java程序】
-
新建文件,命名为HelloWorld.java
用记事本打开,输入
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
-
打开命令行,定位到HelloWorld.java所在位置
javac HelloWorld.java //编译
java HelloWorld //运行
【使用IDEA 运行Java程序】
-
安装IDEA
-
配置JDK
-
创建Java程序
-
输出HelloWorld
package com.company;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
-
运行程序
1.3,CentOS 7.6 安装JRE
rpm -qa | grep java //查看是否安装过jdk
yum search jdk //查询可安装包
yum install java-latest-openjdk.x86_64 //选择可安装包其中版本安装
yum install java-latest-openjdk-devel.x86_64 //同时安装开发环境(javac)
java -version //查看是否安装成功
java,javac 测试
关于服务器上安装JDK还是JRE的问题?
在JSP已经被逐渐淘汰的年代,不需要JDK对JSP文件进行编译,如果部署的项目都是按照编译完成后部署,可以安装JRE,毕竟JRE省空间。
2,数据类型和变量
2.1,定义
变量和数据类型不可分割,结合在一起更好定义:
变量是内存中的一个存储区域。而数据类型的定义决定了这块存储区域的大小。【变量与数据类型的关系】
比如 int x ;其中x变量在内存中占有一定空间,而int决定这个空间是4个字节。
【关于变量的描述】
-
变量是内存中的一个存储区域。【程序运行的时候,变量是放在内存条里的】
-
存储区域的数据可以在同一类型范围里不断变化【所以叫变量,就是能变嘛】
-
变量包括:【int x = 3】== 变量类型int 变量名x = 变量的值3
-
变量必须先声明后使用
int x = 10; (Yes)
x = 10; (No)
简单来说,变量必须得先指定具体的数据类型才能使用。
在谈各种各样的数据类型之前,先来看下面一个问题:
2.2,定义变量存储区域大小的目的
换句话说,为什么需要分开不同的数据类型,全用一个变量表示不就完了吗?
以结果为导向来分析:
Java的整数类型分为4种:byte,short,int,long。
四种的区别在于占用的存储空间不一样。
byte占用1个字节,short占用2个字节,int占用4个字节,而long占用8个字节。
什么是字节?
字节是一种存储单位的度量。1个字节等于8位。
什么是位呢?
位可以理解为计算机的最小单位:0或者是1。也就是是说1个字节是8个0和1的排列组合:
比如说:00000000,00000001,00000011,......11111111。
那么在这种情况下1个字节可以表示多大的数呢?
00000000转换为十进制依然是0,11111111转换为十进制是255。
转换工具:https://tool.lu/hexconvert/
也就是说,一个字节最大可以表示255而最小1可以表示0。
这是无符号位的情况,如果8位表示正数和负数,那么8位可以表示的范围是多大呢?
通常情况下,用第一位来表示正负【0为正,1为负】,这样算下来8位可以表示的范围是-127到+127。
历史长河中,补码登场
上述引入符号位的8位二进制数可以理解为原码。对于正数来说,原码就是补码,而对于负数来说,保留符号位,其他原码按位取反加1所得即为补码。
为什么需要补码?
补码的出现使得加减法只有加法,简化了计算结构,提高运算速度。
那么8位的情况下,用补码来衡量,可以表达的范围是-128--127。
为什么是-128???(按照补码计算)
10000001到11111111表示的范围是1到127,01111110到00000001表示的范围是-1到-127。
而00000000属于负数,按位取反加1的结果是10000000表示的数值是-128,但是00000000是负数。
所以8位二进制数在计算机里存储的范围是-128--127。
回到刚刚字节的问题,1字节等于8位而八位可以表示-128--127。这是byte类型的表示范围。
那如果我想用计算机计算1000加上1000,byte明显是不可用的。因为byte表示不了1000这个数值。
而short类型的存储空间为2个字节,也就是16位。对于short数据类型来说,能表示多大的数呢?
根据8位的表示范围推算:- 2的15次方到2的15次方-1=={-32768--32767}
以此类推,int为4个字节,long为8个字节,能表示的数更大。
Java通过定义变量的类型来规定变量的内存空间大小,通过阶梯式的定义,既有满足小数值运行的byte类型,也有支持大数值运算的long类型。这样不仅满足运算的最大支持(long),同时也能节省系统内存资源(byte)。
【总结】
数据类型的区分是一种系统资源分配优化的方案。
2.3,数据类型分类
数据类型分为基本数据类型和引用数据类型。
基本数据类型:4 类 8 种基本数据类型。4 整数型,2 浮点型,1 布尔型,1 字符型
引用数据类型:字符串
【基本数据类型】
- 整数型
byte | 1字节 |
---|---|
short | 2字节 |
int | 4字节 |
long | 8字节 |
- 浮点型
float | 4字节 |
---|---|
double | 8字节 |
- 字符型
char | 2字节 |
- 布尔类型Boolean
boolean | 4字节 |
-
boolean类型数据只允许取值true和false,无null。
-
不可以使用0或非 0 的整数替代false和true。(C语言可以)
关于Boolean占用字节问题:
- 1/8个字节:理论上来说,Boolean表示true或false,只需要一个字节
- 1个字节:计算机最小执行单位
- 4个字节:
- Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替
- boolean数组将会被编码成Java虚拟机的byte数组,占用1个字节
为什么使用int代替boolean而不是byte?
对于当下32位的处理器(CPU)来说,一次处理数据是32位,32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 也是占用 4 个字节。因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。
【**基本数据类型的相关特性**】
自动类型转换:由表示范围小的自动转换为表示范围大的。
为什么long 8字节可以自动转换为float 4字节的?
long存储按照常规存储,float采用指数方式存储。
指数爆炸.....
顺便看看float和double的精度:7位和16位。
强制类型转换:
反向自动转换。
short to byte:
字符串转为基本类型:(通过包装类转换)
【关于包装类】
包装类是Java设计之初提出的,主要解决基本数据类型无法面对对象编程的问题。
基本数据类型是存放在栈中的,只有数据。而引用类型的值存放在栈中,而引用对象存放在堆中。
装箱:基本数据类型--->包装类
拆箱:包装类--->基本数据类型
//装箱
Integer t = new Integer(500);
//float to Float
Float f = new Float(“4.56”);
//拆箱
Integer x = 3;
int i = x.intValue();
//int to String
String str = String.valueOf(1);
//String to int
int x = Integer.parseInt(str1) ;
//包装类 to String
Integer x = 8;
String str = x.toString();
or
String str = Integer.toString(3);
【引用数据类型】
- 字符串String(引用数据类型)
存放多个字符;String word = “hello,world”;
3,运算符
3.1,算术运算符
假设整数变量A的值为20,变量B的值50:
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | |
- | 减法 - 左操作数减去右操作数 | |
* | 乘法 - 相乘操作符两侧的值 | |
/ | 除法 - 左操作数除以右操作数 | |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于10 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 51 |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 49 |
B++和++B的区别。
如果是单独一条语句的话两者没有区别,但如果放在表达式中会有所不同。
int a = 10;
int b = 10;
int c = a++; ----3
int d = ++b; ----4
第三步等同于:
c=a=10;
a=11;
第四步等同于:
b=11;
d=b=11;
++的位置决定了是先输出值还是先进行自增或者自减运算。
3.2,比较运算符
假设整数变量A的值为20,变量B的值50:
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假。 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A> B)为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A <B)为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A> = B)为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真。 |
3.3,位运算符(针对二进制)
假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011
操作符 | 描述 | 例子 |
---|---|---|
& | 与,全为1则为1,否则为0 | |
| | 或,有一个为1则为1,否则为0 | (A | B)得到61,即 0011 1101 |
^ | 异或,相同为0,不同为1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反,翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左边减零,右边加零 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。右边减0,左边加0 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。右边减0,左边加0 | A>>>2得到15即0000 1111 |
3.4,逻辑运算符
假设布尔变量A为真,变量B为假:
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
3.5,赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
3.6,三元运算符
条件表达式?表达式1:表达式2
条件表达式为true,执行表达式1;为false,执行表达式2
3.7,运算符的优先级
类别 | 操作符 | 关联性 | |
---|---|---|---|
后缀 | () [] . (点操作符) | 左到右 | 高 |
一元 | + + - !〜 | 从右到左 | |
乘性 | * /% | 左到右 | |
加性 | + - | 左到右 | |
移位 | >> >>> << | 左到右 | |
关系 | >> = << = | 左到右 | |
相等 | == != | 左到右 | |
按位与 | & | 左到右 | |
按位异或 | ^ | 左到右 | |
按位或 | | | 左到右 | |
逻辑与 | && | 左到右 | |
逻辑或 | | | | 左到右 | |
条件 | ?: | 从右到左 | |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 | |
逗号 | , | 左到右 | 低 |
4,程序流程控制
4.1,if ...else...结构
if(布尔表达式)
{
//如果布尔表达式为true将执行的语句
}
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
if(布尔表达式 1){
////如果布尔表达式 1的值为true执行代码
if(布尔表达式 2){
////如果布尔表达式 2的值为true执行代码
}
}
4.2,switch结构
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
- switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型。
- case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
- switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
4.3,for循环
for(初始化; 布尔表达式; 更新) {
//代码语句
}
for(int x = 10; x < 20; x = x+1) {
System.out.print("value of x : " + x );
System.out.print("
");
}
4.4,增强for循环
for(声明语句 : 表达式)
{
//代码句子
}
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("
");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
4.5,while循环(先判断)
while( 布尔表达式 ) {
//循环内容
}
int x = 10;
while( x < 20 ) {
System.out.print("value of x : " + x );
x++;
System.out.print("
");
}
4.6,do...while循环(先执行循环体)
do {
//代码语句
}while(布尔表达式);
int x = 10;
do{
System.out.print("value of x : " + x );
x++;
System.out.print("
");
}while( x < 20 );
4.7,break与continue
break:跳出当前循环
continue:结束当次循环,继续执行下一次循环
5,数组
5.1,一维数组
//动态初始化
int a[] = new int[3];
a[0]=1;
a[1]=2;
a[2]=3;
//静态初始化
int b[] = new int[]{1,2,3};
//输出数组长度
System.out.println(b.length);
5.2,二维数组
int[][] arr = new int[3][4];
for(int i =0;i<3;i++)
{
for(int j=0;j<4;j++)
{
arr[i][j]=i+j;
}
}
for(int i =0;i<3;i++)
{
for(int j=0;j<4;j++)
{
System.out.print(arr[i][j]+" ");
if(j==3)
{
System.out.println();
}
}
}