java学习
idea快捷键
- 注释:ctrl+/
- 快速new一个对象:先写右边new的内容,然后在把鼠标放在new前面,按ctrl+alt+v
- for循环快捷键:比如要循环100次:100.for+回车
java基础
1、JDK 、JRE、JVM的异同
- JDK 用于开发, JRE 用于运行 java 程序 ;如果只是运行 Java 程序,可以只安装 JRE ,无序安装 JDK 。
- JDk 包含 JRE , JDK 和 JRE 中都包含 JVM 。
- JVM 是相当于模拟了一个cpu,让其可以在不同的操作系统上运行。
2、配置java环境
-
在系统变量中点击“新建”,变量名:JAVA_HOME,变量值为jdk的安装位置;
-
配置path变量,在系统变量的path中添加:%JAVA_HOME%\bin(即引用JAVA_HOME里的bin目录);%JAVA_HOME%\jre\bin(即引用JAVA_HOME里的jre里的bin目录)
-
测试是否安装成功,打开cmd,输入java -version(注意java后有空格)
3、编译型和解释型
主要区别在于,前者源程序编译后即可在该平台运行,后者是在运行期间才编译。所以前者运行速度快,后者跨平台性好。
1、编译型语言
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。
2、解释型语言
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。
关于java
Java和其他的语言不太一样。因为java针对不同的平台有不同的JVM,实现了跨平台。所以Java语言有一次编译到处运行的说法。
1.**你可以说它是编译型的:**因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。
2.**你可以说它是解释型的:**因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。
3.但是,现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。
编译型的语言包括:C、C++、Delphi、Pascal、Fortran
解释型的语言包括:Java、Basic、javascript、python
4、注释
-
单行 //
-
多行 /* */
-
文档注释
IDEA可以使用快捷键添加行注释Ctrl+/、块注释Ctrl+Shift+/,再次使用即取消注释
5、标识符和关键字

6、数据类型
强弱类型语言
一、强类型语言
强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、Python、C++等语言。
举个例子:定义了一个整数,如果不进行强制的类型转换,则不可以将该整数转化为字符串。还有就是声明一个变量之后,一定要赋值(赋值必须与变量类型统一),否则不能输出。
二、弱类型语言
弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言。
举个例子:
var A =5;
var B = "5";
SumResult = A +B;
MinResult = A -B;
输入SumResult的答案不是10,而是55,再次是将A的类型转化为了字符串,然后进行拼接。输入MinResult的答案是0,是将B的类型转化为了数字,然后进行减法。
三、强类型语言和弱类型语言区别
无论是强类型语言还是弱类型语言,判别的根本是是否会隐性的进行语言类型转变。强类型语言在速度上略逊于弱类型语言,但是强类型定义语言带来的严谨性又能避免不必要的错误。
数据类型
最常用的是int;long类型的要在数字后面加个L:long num = 30L,float 类型也要在数字后面加个F(f的大小写无所谓,但最好用大写,防止和数字弄混);
char是字符类型,即一个单个字符,char name = ‘a’; 字符串用String(注意S大写);
注:string是引用类型,不是基本数据类型;
进制
二进制0b,八进制0,十六进制0x
拓展
这两个if中的条件是一样的,老手会用后者。
类型转换
强制转换: (类型)变量名
高—>低,强制转换; 低—>高,自动转换;
eg1: int i = 128;
double b = i; 这是从低到高,自动转换的;
eg2: double b = 128;
int i = (int )b;
注意点:
- 不能对布尔值进行转换;
- 不能把对象类型转换为不相干的类型;
- 在把高——>低是,强制转换;
- 注意转换的时候可能存在内存溢出,或者精度问题;
7、变量、常量、作用域
变量
变量作用域
-
局部变量是在方法中的,必须声明和初始化值;
方法和函数的区别
面向对象的语言叫方法
面向过程的语言叫函数
在java中没有函数这么一说,只有方法一说。实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。
-
实例变量,从属于对象,若不赋值,则基本类型的默认值为 0 或0.0,布尔类型的默认值为false,除了基本类型其余类型的默认值都为null; 使用的时候需要new一下对象才能用“.”使用。
-
类变量:有static关键词,不用new就能直接调用;(static可以放在前边或者中间)
常量
注意:怎么理解常量是特殊的变量,即声明时加上static,就可以直接调用,不加static的实例常量,则还需要new一下;
命名规范
注意:即变量和方法名都是首字母小写和驼峰,类名是首字母大写和驼峰;**
8、运算符
注意:
-
除运算符需要考虑有没有小数,所以强制转换一下成double;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBtTudzn-1648915928369)(C:\Users\11422\Desktop\javastudy\文档图片\image-20220226145154743.png)]
-
类型的自动转换:很神奇
当有long类型是,自动变为long;当没有long时,无论有没有int,都自动变为int型!
-
a++:先用a,再把a+1; ++a:先a+1,再用加过的a;
-
有一些运算(比如幂运算)没有运算符,则可以用math工具类。
-
**“+”运算符,当先运算的一方为string类型的,则全部都按照字符串进行拼接,**★
eg:int a=10,b=20;
println(“”+a+b)
println(a+b+“”)
结果为:1020
30(特别注意)
短路运算
此时c的结果为5,因为在运行到c<4时,就已经停止运算短路了。
位运算
- &,|,^(异或) , ~ (取反)
- << 表示左移,不分正负数,低位补0(意义为*2)
- >> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1(意义为/2)
- >>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
三元运算符
a+=b:a=a+b
x ? y : z 如果x==true,则结果为y,否则为z
9、包机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qAS0arnR-1648915928371)(C:\Users\11422\Desktop\javastudy\文档图片\image-20220226172534664.png)]
10、JavaDoc生成文档
javadoc命令是用来生成自己的API文档的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53JSeRNb-1648915928371)(C:\Users\11422\Desktop\javastudy\文档图片\image-20220226192330140.png)]
在类和方法前面可以用文档注释,然后再用一行代码就可以生成html的文档
用idea生成Javadoc的方法见网址:[使用IDEA生成JavaDoc文档 - 石宏建 - 博客园 (cnblogs.com)](https://www.cnblogs.com/orint/p/14452218.html#:~:text=如何使用IDEA生成javadoc文档. 首先新建一个文件夹,用于存放要生成的javadoc文档. 接下来点击IntelliJ IDEA顶部的Tools菜单,选择Generate JavaDoc 选项. 然后在弹出的界面中我们点击Output directory输入框后面的按钮.,-encoding utf-8 -charset utf-8. 然后点击确认以后我们就可以等待Intellij IDEA 给我们生成的 JavaDoc文档即可.)
java流程控制
1、Scanner
概念:获取用户输入的工具类;
基本语法:Scanner s = new Scanner(System.in);
注意:通过Scanner 类的next()与nextLine()方法获取输入的字符串,在读取之前我一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有无输入,不需要这一句判断也可以输入,只是更严谨
if (scanner.hasNext()){
//使用next方式接受
String str = scanner.next();
System.out.println("输出的内容为:"+ str);
scanner.close();//用完IO流后要关闭,否则会一直占用资源
}
//nxetLine()方法接收更常用!
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
//判断用户有无输入
if (scanner.hasNextLine()){
//使用nextLine方式接受
String str = scanner.nextLine();
System.out.println("输出的内容为:"+ str);
scanner.close();//用完IO流后要关闭,否则会一直占用资源
}
next()和**nextLine()**这两种接收方法有何不同?
- nxet()的结束符为空格,即不能输入带空格的字符串;
- nxetLine()的结束符为回车,中间可以输入带空格的字符串;
注意:
if (scanner.hasNextLine()){}
这一句里的scanner.hasNextLine(),并不是固定写法,Line说明是判断是否输入了带空格的字符串,所以当只能输入带空格的数字是,用的是scanner.hasNextInt();
2、选择结构
if多选择结构
注意:如果同时满足,则取先满足的那个if,eg:
System.out.println("请输入数据:");
int a = scanner.nextInt();
if (a > 5) {
System.out.println("a>5");
} else if (a > 6) {
System.out.println("a>6");
} else if (a > 7) {
System.out.println("a>7");
} else {
System.out.println("a<5");
}
结果为:
请输入数据:
100
a>5
switch
switch里的参数可以是String
continue和break
不仅用于switch,for也可以
continue时,跳出本次循环,继续执行下次循环。
For(int i = 0;i<=5;i++){
If(i = =3)continue;
System.out.println("The number is:"+i);
}
结果为:
The number is:0
The number is:1
The number is:2
The number is:4
The number is:5
Break时,跳出循环(结束循环),执行下面的语句。
For(int i = 0;i<=6;i++){
If(i = =3)break;
System.out.println("The number is:"+i);
}
结果为:
The number is:0
The number is:1
The number is:2
3、do… while 和while

4、for
print和println的区别
//用while或for输出1-1000之间能被5整除的数,并且每行输出3个
for (int i = 0; i < 1000; i++) {
if(i%5==0){
System.out.print(i+"\t");// \t为tab键
}
if (i%(5*3)==0){
System.out.println();//换行
//或者是 System.out.print(""\n);
}
}
注意:print 输出完不换行
println 输出完换行,所以想换行操作时,可以System.out.println();//换行。
增强for,遍历数组或集合用的

int[] num = {1,2,3,4,5,6};//声明数组
for (int x:num){
System.out.println(x);
}
题目:打印三角形
for (int i = 1; i <= 5; i++) {
for (int j = 5;j>=i;j--)
{ System.out.print(" ");}//打印左边倒三角空白
for (int j = 1;j<=i;j++)//打印左边半边三角
{ System.out.print("*");}
for (int j = 1;j<i;j++)//打印右边半边三角
{ System.out.print("*");}
System.out.println();
}
*
***
*****
*******
*********
java方法
1、什么是方法
System.out.print();
类 对象 方法
方法和函数的区别
面向对象的语言叫方法
面向过程的语言叫函数
在java中没有函数这么一说,只有方法一说。实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。
2、方法的定义和调用
注意:return 0;可以做到类似于break终止方法的作用
就是如果返回值是void,那么直接把这个方法当作一句话来用就好了,上面println()就是个方法。
3、方法的重载
public static double max(double num1,double num2){
double res = 0;
if(num1==num2){
return 0;
}
if (num1>num2){
res= num1;
}else {
res =num2;
}
return res;
}
public static int max(int num1,int num2){
int res = 0;
if(num1==num2){
return 0;
}
if (num1>num2){
res= num1;
}else {
res =num2;
}
return res;
}
//根据max实参的类型不同或者数量不同或排列顺序不同,自动选择不同的重载方法
public static void main(String[] args) {
double max = max(10,20);
System.out.println(max);
}
4、可变参数(类似于数组)
public static void printMax(double... numbers){}//double... numbers,这里的number就是个可变参数,通过number[i]调用其中的值;
5、递归
递归就是自己调用自己。
数组
1、声明与使用数组
int[] nums;//首选,java风格
int nums[];//C,C++风格的声明
//两种声明方法都可以,但是首选第一种。
nums = new int[10];//new一个数组去使用,即分配空间,默认都为0,可用nums[0~9]
nums.length为数组长度
2、数组特点
3、三种初始化
- 静态初始化不用new,直接赋值;
- new之后不初始化,则默认初始化为0;
4、下标越界及小结
5、数组的使用
1.for-each循环(增强型for()遍历数组)
可以直接用arrays.for,就类似于100.for,可以自动生成数组的循环,直接生成:
for(int arrays : arrays){
}//没有下标,比较适合打印输出
2.数组作方法入参
即用数组作为方法(函数)的参数
调用时直接用 printArrays(arrays);即可使用这个方法进行打印;
3. 数组作为返回值
最后return的就是数组
6、多维数组
也即是说多维数组就是数组嵌套数组
这是arr【2】【2】