JavaSE学习
idea快捷键
alt+enter:自动补全
ctrl+d:复制当前内容到下一行
ctrl+f5:程序再运行一次
100.for:自动生成循环一百次的for循环语句
fori+tab键:自动生成for循环
注释
Java中有三种注释:
- 单行注释://,快捷键Ctrl+/
- 多行注释:/* */,快捷键Ctrl+shift+/
- 文档注释:/**
*@Description Hello
*@Author ***
*/
其中@是描述符
Java数据类型
Java是一门强类型语言,即变量的使用要严格符合规定,所有变量要先定义后才能使用
Java数据类型分为两大类,基本类型和引用类型
1. 基本类型
-
整数类型
- byte:一字节,-128–127
- short:两字节,-32768–32767
- int:四字节
- long:八字节
long a=30L;//long类型后面要加个L
整数类型拓展:
二进制0b;八进制0;十六进制0x
//不同进制赋值 int i = 10; int i1 = 010;//八进制 int i2 = 0x10;//十六进制赋值
-
浮点类型
- float:四个字节
float a=50.1F;//float类型后面要加个F
- double:八个字节
浮点数拓展:
//float和double类型的两个值相同的数,他们的比较结果的布尔值是false float a = 0.1; double b = 1.0/10; //变量a和b的比较结果是false //因此银行业务中,表示钱不用float或者double,而是用BigDecimal(数学工具类)表示
-
字符类型
- char:两个字节
字符拓展:
//字符在内存中存放的都是相应字符的数值,ASCII码或者Unicode码(表示方式:"u0061")
-
boolean类型:占一位,只有true和false两种
2. 引用类型
类、接口、数组
类型转换
低————————————————————————>高
byte,short,char->int->long->float->double
-
自动类型转换:优先级由低到高会自动转换
-
强制类型转换:优先级从高到低需要前置类型转换
double a = 1.5; int b = (int)a;//此时b为1
注意:
- 不能对布尔值进行转换
- 不能把对象类型转换成不相干的类型
- 转换后可能会丢失精度或者溢出
- JDK7新特性:数字之间可以用下划线分割,即10_0000_0000
变量
Java变量是程序中最基本的存储单元,包括变量名,变量类型和作用域。
type varname [=value][{,varname[=value]}];
//数据类型 变量名 = 值;可以用逗号隔开来声明多个同类型变量
变量命名要满足命名规则:字母、下划线、$开头,不能用标识符命名
变量作用域
- 类变量
- 实例变量
- 局部变量
public class Variable{
static int allClicks=0; //类变量
int age;
String name;
//如果不进行初始化会有默认值,int的默认值为0,String的默认值为null
String str = "hello world";
public void method(){
int i = 0; //局部变量
}
}
常量
常量:初始化之后就不能再改变的值
final 常量名 = 值;(常量名一般为大写字符)
final PI = 3.1415926;
变量的命名规范
运算符
- 自增、自减运算符
int a = 1;
int b = a++;//表示先把a的值赋给b,然后a再加一
/* 等同于
int b =a;
a = a+1;
*/
int c = ++a;//表示的a的值先加1,然后再把a的值赋给c
/* 等同于
a = a+1;
int c = a;
*/
- 逻辑运算符
注:该类运算符中存在一种短路现象,即如果运算符左边的值就已经能决定该表达式的值了,那么就不再计算该运算符右边的表达式了。
int c = 5;
boolean d = (c<4)&&(c++<4);
System.out.println(d);//输出false
System.out.println(c);
//输出5,表示并没有执行(c++<4)这个表达式,因为逻辑运算符左边的表达式已经可以决定整个表达式的值了
- 位运算符
-
^为异或
-
移位运算符的效率很高,因此有时可以通过以为操作来实现乘方运算,左移一位相当于乘2,右移一位相当于除2
- 三元运算符
-
表达式1?表达式2 :表达式3
表示如果表达式1的值为真,那么整个表达式的值为表达式2的值,否则为表达式3的值
包机制
//语法格式
package pkg1.[pkg2[.pkg3..];//必须写在程序的最开头
/*包的命名格式一般是公司域名倒置
如:com.baidu
*/
//导入要使用的包
import package pkg1.[pkg2[.pkg3..];
JavaDoc
javadoc是用来生成api文档的,需要在程序中写好文档注释
在命令行执行:javac 参数 程序文件名称
javadoc -encoding UTF-8 -charset UTF-8 Doc.java
#-encoding UTF-8 -charset UTF-8为参数,使中文字体可以展示出来
/**
*@author xxx
*version 1.0
*since 1.5
*/
public class Doc{
String name;
/**
*@author xxx
*@param name
*@return
*/
public String test(String name){
return name;
}
}
在idea中生成api文档的方法:
- 点击IntelliJIDEA顶部的Tools菜单,选择GenerateJavaDoc选项
- 接下来在底部的Locale输入框配置语言和编码集,语言用zh_CN,代表中文,其他的输出和控制塔一致
-
接下来在底部的Locale输入框配置语言和编码集,语言用zh_CN,代表中文,其他的输出和控制塔一致
-
注意:生成的文档里面会有很多 .html 文件 正常
用户交互Scanner
Java提供了一个工具类,用来获取用户的输入。java.util.Scanner
基本语法:
Scanner s = new Scanner(System.in);
s.close(); //用完关闭
通过Scanner类的next()和nextline()方法获取输入的字符串,在读取钱一般要使用hasNext()与hasNextline()判断是否还有输入的数据。
next():
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符前遇到的空白,next()方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
nextline():
- 以Enter作为结束符,即返回输入回车前的所有字符
- 可以获得空白
类似还有输入整数或者其他类型的方法,如
nextInt()、nextFloat()
顺序结构
程序按顺序依次执行
选择结构
if语句:
if(表达式){
//如果表达式为true要执行的语句
}else if(){
//反之执行的语句
}.....
switch语句:
switch case语句判断一个变量与一系列值中某个值是否相等,每个值为一个分支
switch(expression){
case value:
//语句
break;//可选,用来表示结束
case value:
//语句
break;//可选
//可以有任意数量的case语句
default://可选,都不满足时执行的语句
//语句
}//括号也表示结束
switch语句中的变量类型可以是:
- byte、short、int、char、String(通过转换成哈希值实现的)
- case标签必须为字符串常量或者字面量
注:
在switch结构中的case分支下要写break语句,如果表达式与case分支的标签相匹配,但是该case分支里没有break语句,那么程序会顺序执行后面的case分支,直到遇到break语句或者到达default分支,或者遇到“}”才结束。
循环结构
while循环:
while(表达式){
//循环语句
}
//表达式为真时一直循环下去
do while循环:
do{
//循环语句
}while(布尔表达式)
while和do while的区别:
- while先判断后执行,do while先执行后判断
- do while至少被执行一次
for循环:
for(初始化;布尔表达式;更新){
//循环语句
}
//不写布尔表达式,默认为真,也就是死循环
增强for循环:
主要用于数组或集合的遍历
for(声明语句 : 表达式){
//代码语句
}
//例
int[] nums = {1,2,3,4,5};
for(int x:nums){
System.out.println(x);
}
注:
声明语句:声明新的局部变量,该变量的类型必须和数组类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值维数组的方法。
break continue
break用于强行退出循环,不执行循环中剩余的语句
continue语句,用于终止本次循环,接着执行下一次循环
带标签的break continue
break outer:中断当前循环并跳出标签所指的循环
continue outer:重新跳到标签的位置,并开始标签之后声明的循环
使用带标签的 break / continue 的原因是:为了跳出或重新开始多层嵌套循环。
方法
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
方法的定义和调用
方法包含一个方法头和方法体:
- 修饰符:可选,告诉编译器如何调用该方法,定义该方法的访问类型
- 返回值类型:方法可能会返回值,用来说明返回值的类型,没有返回值用void修饰
- 方法名:方法的实际名称,和形参列表共同决定一个方法
- 参数类型:参数列表中的每个参数的类型
- 形参:方法定义时说明的,用来接收方法调用时传递的实参值
- 实参:调用方法时实际传给方法的数据
- 方法体:方法体包含具体的语句,定义该方法的功能
修饰符 返回值类型 方法名(参数类型 参数名,参数类型 参数名,...,...){
...
方法体
...
return 返回值;
}
方法调用:
-
调用方法:对象名.方法名(实参列表)
-
Java支持两种调用方法的方式,根据方法是否返回值来选择
- 当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int a = max(30,40);
- 如果方法返回值是void,方法调用一定是一条语句
System.out.println("Hello World");
注:Java中都是值传递,没有引用传递
方法的重载
- 重载就是在一个类中,有相同的函数名称,但形参不同的函数
- 方法重载的规则:
- 方法名必须相同
- 参数列表必须不同(个数不同、或类型不同、或参数排列顺序不同等)
- 方法的返回类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
- 实现理论:
- 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等逐个去匹配,如果匹配失败,则编译器报错。
命令行传递参数
如果希望在运行程序时给程序传递消息,需要考传递命令行参数给main()函数实现。
public class Demo{
public static void main(String[] args){
for(int i = 0; i < 10; i++){
System.out.println("args["+ i +"]:" + args[i] );
}
}
}
可变参数
- JDK1.5开始,Java支持传递同类型的可变参数给一个方法
- 在方法声明中,在指定参数类型后加三个点(…)
- 一个方法中只能指定一个可变参数,他必须是方法的最后一个参数。任何普通参数必须在它之前声明。
public static void printMax(double... numbers){
if(numbers.length == 0){
System.out.println("No argument passed!")
rutrun;
}
double result = numbers[0];
for(int i=1; i<numbers.length; i++){
if(numbers[i]>result){
result = numbers[i];
}
}
System.out.println("This max value is " + result);
}
数组
数组的定义
- 数组是想同类型数据的有序组合
- 可以通过数组的下标来访问数组中的每个元素
数组声明创建
声明数组的语法
dataType[] arrayRefVar;//首选的方式
dataType arrayRefVar[];//效果相同,但不是首选方式
用new操作符来创建数组:
dataType[] arrayRefVar = new dataType[arraySize];
数组元素是通过索引访问的,数组索引从0开始
获取数组长度:arrays.length
声明在栈区,实例在堆区
数组的初始化
- 静态初始化
int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)};
- 动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
- 默认初始化
数组是引用类型,他的元素相当于累的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量的方式被隐式初始化
数组的四个基本特点
- 其长度是确定的。数组一旦被创建,他的大小就是不可以被改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属于引用类型,数组可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
数组边界
数组的大小是固定的,因此超过数组的大小会报错
- 数组下标的合法区间:[0,length-1],如果越界就会报错
ArrayIndexOutOfBoundsException:数组下标越界异常
数组的使用
- For-Each循环的方式来便利数组
- 数组当作方法的形参
- 数组作为方法的返回值类型
多维数组
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其中的每个元素都是一个一维数组
int a[][] = new int[2][5];//数组a可以看成是一个2行5列的矩阵
Arrays类
-
数组工具类java.util.Arrays,可以用其中的方法来操作数组
-
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,从而可以不用使用对象来调用
-
常用的功能:
- 给数组赋值:fill()方法
- 给数组排序:sort()方法
- 比较数组中的元素是否相等:equals()方法
- 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找
未完待续。。。。。