安装java并配置环境变量
- 系统变量-新建名为
JAVA_HOME的环境变量,指向java安装目录 - 系统变量-PATH,编辑新建
%JAVA_HOME%\bin
tips : 注意点确定
目的: 使得我们在任何目录位置都可以执行 java 命令
卸载java
- 应用程序中卸载
- 删除安装目录
- 删除系统环境变量,及环境变量指向的安装目录
win+_r输入regedit找到HKEY_LOCAL_MACHINE -> SOFTWARE -> JavaSoft 点击删除
前置知识
-
java版本区别:从内容上看 EE > SE > ME ( Enterprise > Standard > Micro)
-
名词解释
- JRE : Java Runtime Environment
- JDK : Java Development Kit ( JRE + tools such as compiler , debugger)
-
java包命名规范
-
在不同的包名区分下,包里面可以有名称不同的类
-
包命名约定:
-
小写形式
-
公司使用反向域名 如
yikina w.com的包名为com.w yikina- 如果存在特殊字符- _ 关键字 数字等情况,为包名添加下划线_
-
java本身的包以
java.或javax开头
-
java基础
基本结构
java是面向对象的编程语言,以一个class作为主程序体,基本形式如下:
/**
* class描述注释
*/
public class Hello {
public static void main(String[] args) {
System.out.printIn("Helllo,world!");
//这里是注释
}
}
-
class名称大写 ,方法名称小写 eg: Hello main
-
有修饰符
public``static,有返回值类型void,有方法输入的参数类型String[] args -
main方法写法固定
public static void main(String[] args){...}tips:idea中可以使用
ctrl+alt+l快速格式化代码
变量和数据类型
java变量和数据类型分为:基本类型、引用类型
变量
基本变量
声明时使用类型修饰符,如int
int a; //不写声明值,指定默认值为0
int x = 100;
x = 200; //可以被反复赋值
int n = x; //可以声明变量为另一个变量
n = n + 100; //可以被自己反复赋值
原理: 和js基本数据类型差不多,在内存中有固定地址存储数据,绝对引用
数据类型
基本类型
- 整数类型:byte \ short \ int \ long
- 浮点数类型: float \ double
- 布尔类型: boolean
- 字符类型: char
区别:所占内存数量不同( 前置知识 :byte(字节)=8 bit(8位二进制数),1024byte = 1k ,1024 k =1M ,1024M = 1G , 1024G=1T)
具体而言:
整型
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
tips:
long类型定义的变量结尾要加L ,否则为int long n=80000L
小数值可赋值给大数值,反之不可
浮点型
- float: 3.4x10(38)
- double: 1.79x10(308)
tips: float类型要加上f后缀 ,如 float n=3.14f
布尔型
- boolean : true || false (4 byte)
字符型
-
char : 一个字符' ' (ASCII \ Unicode)
也可以使用
\u+Unicode编码来表示:\u0041
tips: 一个字符,‘ ’ 单引号,区分" "双引号字符串
引用类型
- String : 字符串 “ ”
原理 :类似js中的引用类型,内部存储指针,指向真正存在的位置,相对引用
详见下面字符串
作用域
和 js 一样的部分:{ } 为一个作用域
区分js : 没有闭包,尽可能将变量定义在小作用域,且不要重复使用变量名
demo.js
{
let a=5;
{
let a =3;
console.log(a); //a=3
}
console.log(a); //a=5
}
demo.java
{
int x=5;
{
int x=3 //编译时异常,上一个x作用域还没有结束
}
}
{
{
int x=5;
}
int x=3; //可以这样定义,因为上一个x作用域结束了,虽然这么是可以的但是最好好像不要用重复的变量名声明
}
常量
初始化后不可再次赋值(只读的),使用final修饰符,全部使用大写
final double PI=3.14
用法:类似于shell中的declare -r ,用于替换经常使用的数据or地址or名称
var关键字
类名太长的简略写法:
//普通
LongExample le = new LongExample();
//使用var
var lg - new LongExample;
运算
按照四则运算规律,可以使用小括号。
和js一样可以使用 +=``-=``++``--
tips:++n (先+1再引用n) n++ (先引用n再+1)
整数运算
-
整数运算的结果永远是整数
-
溢出:整数运算结果超出范围限制而产生的奇怪结果。解决:换更大范围的整数类型
-
移位运算 ( int,如使用byte\short会先转化为int )
-
原理:将数据换算为二进制左移或右移
int n=7; //00000111=7 int a=n<<1 //00001110=14 int b=n>>1 //00000011=3
-
-
位运算
-
&|(与js中一样,&两个同时为真才为真,| 任意一个为真就为真) -
~(0和1互换)int n= ~0 //1 int n= ~1 //0 -
^(比较两个数,相同为1,不同为0)n = 12 ^ 12 //1 n = 21 ^ 56 //0
-
-
类型自动提升、强制转型
-
结果前面加()强制转型,但超出范围的结果可能是错误的
int a=5; short b=(short)a; -
参与运算的数类型不同,结果为较大范围的
eg: int + long =long
-
浮点数运算
与整数相比,不能进行位运算、移位运算
-
浮点数计算会产生误差(原因:有些浮点数[0.1]十进制转换为二进制是无限循环小数 )
-
比较浮点数是否相等——两数绝对值<很小的数
double r=Math.abs(x-y); if(r<0.0001){ //基本可以认为是相等的} -
溢出:除数为0时会返回
NaNInfinity``-Infinity -
类型提升 、强制转化:
- 浮点数+整型 =浮点数
- 强制转化浮点数->整数时,小数部分会直接被丢掉,超过范围会返回最大值
布尔运算
和js一致可以使用 >``>=``==``!=``&&``||``!
- 短路运算 ( && || ) : 和js一致,&&(前面为真才执行后面),||(前面有一个为真就执行那个)
- 三元表达式:和js一致,但后面两个比较的类型要一致
字符串string
区分char,string使用“ ”,里面包含多个字符
-
转义:在引号中使用 \
String s ="qaz\"qwe"tips:
\表示一个``符 ,\n换行符 -
字符串连接 :和 js 一样,使用+连接,如其他类型会自动转换为字符串
-
多行字符串,使用三个引号表示
"""这里写多行数据不用加换行符""",会默认换行且以行首最短的空格为准 -
不可变特性(引用类型)
-
字符串本身是不变的,变的只是变量指向它的指针
public class Main { public static void main(String[] args) { String s = "hello";//内存开辟一个空间存储hello String t = s; s = "world"; System.out.println(s); //world,但这并不代表hello改变了,只是没有变量能指向它了,它仍然在内存中 System.out.println(t); // hello,设定变量时t指向s->hello } }
-
-
null表示该变量不指向任何对象,区分" "空字符串(指向一个字符串对象,内容为空)
数组
与js不同,
- java创建数组时就要确定数组容纳的数据类型及长度,且创建后不得改变
- 数组所有元素初始化都为默认值 (0/0.0/false)-》js es6 undefined
定义数组的方式:
int[] stu = new int[5]; //stu是int数据类型长度为5的数组
int[] stu = new int[] {34,66,78,99,54}; //不用写出数组长度
int[] stu={34,66,78,99,54} //最佳简化写法
System.out.println(stu.length); //5,获取数组长度用length,c#中是Length
- 引用类型特性(指针引用,和字符串那里一样去理解就行)记住基本数据类型存储的值,引用类型存储的是指针
public class Main {
public static void main(String[] args) {
String[] names = {"ABC", "XYZ", "zoo"};
String s = names[1];
names[1] = "cat";
System.out.println(s); // "XYZ"
}
}
流程控制
输入与输出
输出
//输出后不换行
System.out.print("huhuh")
//输出后换行->print line
System.out.printIn("jlkjlk")
- 格式化输出
System.out.printf(print formatter)
double d = 3.1415926
System.out.printf("%.2f\n",d)//显示两位小数
常见占位符:
%d格式化输出整数、%f格式化输出浮点数、%s格式化输出字符串
输入
引入Scanner对象,有点类似c#
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Input your last grade:");
int lastG = sc.nextLine();
}}
其他语句
-
if else : 基本用法一致
- ==判断引用类型也会和js一样根据是否指向同一个对象判断,如需判断引用类型变量的内容是否相等,使用equals
s1.equals(s2)
- ==判断引用类型也会和js一样根据是否指向同一个对象判断,如需判断引用类型变量的内容是否相等,使用equals
-
switch : 经典写法注意case,break,default
-
java12后写法(不需要break,可以直接赋值)
swith(color){ case "red" -> System.out.println("select red"); case "yellow" -> System.out.println("select yellow"); default -> { System.out.println("no choice"); System.out.println("have a good luck"); } } //用switch给变量赋值 int num=swith(color){ case "red" -> 1; case "yellow" -> 2; default -> { int a=0; yield a; //{}中使用yield作为返回值 }; } }
-
-
while (先判断条件,在执行循环) do...while(先执行一次循环,再判断条件)
-
for循环:1和js一致(把let改为数据类型int就可以了...)
- java中的foreach循环
for( int n : array)->可以用于所有可迭代的数据类型
- java中的foreach循环
int[] ns={1,2,3,4,5}
for (int n :ns){
System.out.println(n);
}
- break :跳出当前这一层循环 contiune: 提前结束这一次的循环,下一次循环继续进行
数组
遍历数组
-
for循环遍历
for(int i=0;i<nums.length;i++) -
foreach遍历
for(int n : nums) -
Arrays.toString(arrayname) :字符串形式打印
int[] nums={1,2,3,4} System.out.println(Arrays.toString(nums)) // [1,2,3,4]
数组排序
-
Arrays.sort(arrayname)
(注意排序后的数组是否改变要看其是基本类型还是引用类型)
二维数组
int[][] nums={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
}
-
打印二维数组
- 二层循环
for(int[] n:scores){ for(int s:n){ ... } }- Arrays.deepToString()
命令行参数
需求:命令行输入参数-version,程序输出对应结果
实现:通过main方法接受命令行参数args
public class Main{
public static void main(String[] args){
for(String arg:args){
if("-version".equals(args)){
System.out.println("v 1.0");
break;}
}
}
}