alt+enter:代码提示/导包
ctrl+d—复制行
ctrl+x—删除行
ctrl+shift+/:添加多行注释或取消多行注释
ctrl+/:添加单行注释或在去取消单行注释
shift+f6:修改类名,包名等
ctrl加左键:打开源码或者方法
ctrl+z:撤销
ctrl+shift+z:前进
if(表达式){
if(表达式1){
}else{
}
}
else{
if(表达式2){
}else{
}
}
例如:比较三个数最大数
if(a>b){
if(a>c){
a}else{
c}
}
else(a<b){
if(b>c){
b}else{
c}
}
1)分别录入两个int类型,输出
2)分别录入两个String类型(字符串类型),输出
3)先录入String,在录入int类型
4)先录入int类型,在录入String类型,存在的问题:字符串数据会被漏掉
原因:先录入int-按回车符号-字符串-直接录入(回车符号问题)
解决办法:
方案1:public String next();
:通用方法:录入字符串
方案2:在录入下一个String类型之前,重写创建一个新的键盘录入对象
Scanner x = new Scanner(System.in) ;
String b = x.nextLine() ;
switch(表达式){
case 值1:语句1;
break ;
case 值2:语句2;
break ;
....
default:语句n+1;
break ; }
1)最基本的:byte,short,int,char
2)JDK5以后可以是枚举类型
3)JDK7以后可以是String类型 (引用类型)
1)case语句的后面只能是常量,不能是变量
2)break的意思: 结束,中断
3)switch语句的结束条件:
4)default语句可以放在switch语句中的任何位置,不影响程序的流程,但是如果在语句中,break不能省略的,如果在末尾,break 可以省略
5)case穿透现象:没有遇见break,不会和case进行比较,直接依次执行
6)switch首先会和case依次比较,之后无匹配再执行default
for(初始化语句;条件判断语句;控制体语句)
{
循环体语句;}
初始化语句;
while(条件判断语句)
{
循环体语句;
控制体语句; }
1)格式不同
2)从内存角度考虑:
for循环:在for循环语句外面是不能够访问变量的,因为它随着for循环执行完毕,main方法结束之后,变量就会被GC(垃圾回收器)回收掉这些变量
while循环:循环结束,依然可以从外部访问变量,因此在内存中占用资源空间大于for 循环
3)如果明确循环次数,优先使用for,不明确循环次数,使用while循环
for(;;){
语句;}
while(true){
语句;}
初始化语句;
do{
循环体语句;控制体语句;}
while(条件表达式) ;
for(初始化语句;条件表达式;控制体语句)
{
for(初始化语句;条件表达式;步长语句){
循环体语句;}
循环体语句;}
int a=(int)(math.random()*100+1)
1)break :中断,结束;单独不能使用,在循环中和switch中用
循环中使用:单层循环中或for循环嵌套中使用
2)continue : 继续(循环中使用,结束当前循环,立即进入下一次循环)
使用:循环中使用
3)return :结束方法(和方法相关)或者返回值
使用:结合方法使用,很少单独使用
标签名:外层循环/内层循环
例如:
wc:for(){
nc:for(){
}
}
例如:break wc;
方法有两种格式:
1)第一种:有具体返回值(数据类型)的方法:
权限修饰符 + 静态修饰符 + 返回值类型 + 方法名(数据类型1 变量名1 ,数据类 型2 变量名2 ,…){业务逻辑;return结果; }
单独调用:(没有输出)没有意义;例如:sum(a,b) ;
输出调用:输出写死了,不利于值的进一步操作;例如:System.out.println(sum(a,b)) ;
赋值调用(推荐):例如:int result =sum(a,b) ;
2)第二种:没有具体返回值类型的方法
权限修饰符+静态修饰符+返回值类型(void)+方法名(形参列表){输出操作}
Java语法规定:当一个方法没有具体返回值类型的时候,使用void 代替
单独调用(推荐);例如:printstar(a,b) ;
1)明确返回值类型
2)明确参数类型以及参数个数
1)方法与方法是平级关系 ,不能在一个方法中定义另一个方法
2)Java是强类型语言,定义形式参数时必须携带数据类型
3)调用方法的时候,实际参数如果定义数据类型了,传递参数不需要携带数据类型
4)目前我们定义的方法都是有方法体的 (有左大括号"{ 的地方不能有分号; 有分号;的地方不能有左大括号"{" )
其中参数列表不同有两种情况:
1)参数个数不同
2)参数类型不同
格式:
数据类型[] 变量名称
例如:int[] arr
数据类型 变量名称[]
例如;int arr[]
数组缺点:长度固定,不满足长度的变化的需求
1)第一种初始化:动态初始化:给定数组的长度,元素由系统默认初始化
数据类型[] 数组名称= new 数据类型[长度]
例如:int[] arr=new int[3]
数据类型 数组名称[]= new 数据类型[长度]
例如:int arr[]=new int[3]
其中[]:表示一维数组
基本数据类型:整数类型:默认int,默认值0
浮点类型:默认double,默认值0.0
字符类型:char,默认值’\u0000’
布尔类型:boolean,默认值:false
引用数据类型:数组.类.接口:默认值:null
2)第二种初始化:静态初始化:指定具体元素的内容,系统默认分配长度
数据类型[] 数组名称=new 数据类型[]{元素1,元素2,元素3…}
数据类型 数组名称[]=new 数据类型[]{元素1,元素2,元素3…}
简写格式:
数据类型[] 数组名称={元素1,元素2,元素3…}
数据类型 数组名称[]={元素1,元素2,元素3…}
数组名称.lenght
:获取数组长度1)栈内存:存储局部变量,在方法声明上或者方法定义中的变量
进出方式:先进后出(与之相对的队列进出方式为:先进先出)
进栈方式:压栈
出栈方式:弹栈
2)堆内存:存储new(创建对象)出来的东西
3)方法区:字节码文件区域,静态区域,字符串常量区域
1)NullPointerException
:空指针异常:
某个对象已经null了,我们还试图去访问这个对象中的方法或者它里面的属性,就会 产生这个问题
例如:
Scanner sc = new Scanner(System.in) ;
sc = null ;
sc.nextInt() ;
//程序一运行,当前行代码产生一个异常
解决方案:针对某个对象进行非空判断.
2)ArrayIndexOutBoundsException
:数组角标越界异常,属于IndexOutBoundsException
子类
出现的原因:访问了不存在索引值或者程序运行的时候,角标值已经超出了范围
例如:
int[] arr = {
1,3,4} ;
System.out.println(arr[3]) ;
for(int x = 0 ; x <= arr.length ; x ++){
} :
//取不到数组的长度
解决方案:检查角标值,更改代码
1)基本数据类型:
基本类型作为形式参数传递,形式参数的改变不会影响实际参数
2)引用数据类型:
引用类型(数组,类,接口) 作为形式参数传递时会改变实际参数
类
事物的属性(成员变量):在类中,方法外
事物的行为(成员方法):方法分两种
1)public 有返回值类型 方法名(形式参数列表){业务逻辑;return 结果;}
2)public void 方法名(形式参数列表){输出操作}
创建对象的格式:类名 对象名=new 类名() ;
例如:Student baiCai = new Student() ;
修改成员变量:对象名.成员变量=赋值;
访问成员方法:对象名.方法名() ;
1)更符合生活中的思想行为习惯
2)将复杂的事情简单化
3)让我们从执行者变成指挥者(角色发送变化了)
封装.多态.继承
可以不断的创建对象,使用对象,然后指挥对象做事情
1)在类中书写的位置不同:
局部变量:方法定义中或方法声明上
成员变量:类中,方法外
2)内存中的位置位置不同:
局部变量:在栈内存中
成员变量:在堆内存中
3)生命周期不同:
局部变量: 随着方法调用而存在,随着方法调用完而消失
成员变量: 随着对象的创建而存在,对象创建完毕后,要等待垃圾回收器回收(空闲 的时候)
4) 初始化不同:
局部变量:必须要在使用之前赋值
成员变量:系统会默认初始化
new 类名() ;
在移动端使用居多,Android :基于Java (大部分都是使用匿名对象,以节省内存)
特点:
1)匿名对象:使用完毕,会立即被垃圾回收器回收,节省内存空间
2)开发中,匿名对象使用一次即可,不要使用多次
3)匿名对象可以作为参数传递