1.标识符和关键字
定义常量、变量、方法、类和包等的名称。
Java 标识符有如下命名规则:(A) (1)标识符必须以字母、下划线_ 、美元符$开头。 (2)标识符其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。 (3)Java 标识符大小写敏感,且长度无限制(但是不建议太长,建议不要超过15个字符) (4)不可以是Java的关键字或保留字. (5)标示符的命名一般要有意义(见名知意)
自定义标识符的规范: 1. 类名和接口名单词的首字母大写,其他单词小写。 比如: RunTime. 2. 变量名与方法名首单词全部小写,其他单词首字母大写,其他小写。(驼峰式命名法)比如:doCook(); 3. 包名全部单词小写。 4. 常量全部单词大写,单词与单词之间使用下划线分隔。 比如: UP_DIRECTION
关键字和保留字
关键字:Java中有一些赋予了特定的含义,有专门用途的字符串称为关键字(keyword)。全部为小写。
保留字:没有定义用途,但保留备用。goto、const
2.二进制及转换
进制:进制是一种记数方式,可以用有限的数字符号代表无限的数值,由特定的数值组成。
十进制整数,如:99, -500, 0
八进制整数,要求以 0 开头,如:015 0 - 7
十六进制数,要求 0x 或 0X 开头,如:0x15 0 - 9 - a b c d e f
二进制数,要求 0b开头 0 - 1
如何转换:
十进制转二进制:
用十进制整数除2求余数,直到商小于2为止,然后由下往上取余数,得出对应的二进制数。如果没有8位,前面补0。
二进制转十进制:
从最低位开始,算出每一位对应的数字乘以2的n-1次方的结果, n为该数字的位置(位置从1开始)。然后把所有的结果相加的和,就是对应的二进制的十进制的数。
十进制负数转二进制:
先求出十进制负数对应的十进制正数,然后求出十进制正数对应的二进制数,然后对二进制结果取反加1,得出对应的十进制负数的二进制数。
进制补充:
八进制与二进制的转换
方式1:先把二进制转换成十进制,然后再使用十进制转换成八进制。
方式2:利用八进制与二进制之间的关系进行转换。(三个二进制位就是一个八进制的数据)
十六进制与二进制的转换(四个二进制位就是一个十六进制的数据)
类似 八进制与二进制的转换
3.常量和变量
常量的类别:
整型常量:123 、100、200、250、500
浮点数常量(小数) :3.14 float ...
字符常量:’a’ char
布尔(逻辑)常量:true、false
字符串(String)常量:"a"、"abc"、"hello world", ""
null常量:表示的引用为空对象
整数常量的表现形式:整数的表现形式主要是以不同的进制表现出来。(各进制之间的转化)
常量的使用:程序中运行固定不变的数据
1 整型常量:10 20 30 100 200
2 浮点数常量: 3.5 2.87 3.14
3 字符常量: a b c 1 2 3
4 布尔常量: true false
5 字符串(String)常量 : “hello world” “你好世界”
6 null常量: null
变量声明、初始化
- 先声明,再赋值(初始化)
数据类型 变量名;
变量名 = 变量值;
举例:int i;
i=100;
i=200;
- 声明同时赋值
数据类型 变量名 = 变量值;
int j=20;
声明变量方式一: int a; int b=3;
声明变量方式二: int age,height;(不推荐)
注意:
(1)变量是必须先声明再使用。
(2)在同一个作用域中,不能声明同名的变量。
局部变量和成员变量
局部变量:在方法中定义的变量称为 局部变量
成员变量:在方法外,类的内部定义的变量称为 成员变量
静态变量:暂时不讲 指静态的成员变量
成员变量和局部变量的区别:
(1)定义的范围不一样
局部变量在方法体内,属于方法内部的变量
成员变量在类中、方法外部,属于类的变量
(2)成员变量的默认值要依据成员变量的类型来(int = 0,boolean=false ,float = 0.0F ,double =0.0 char=’’ )
(3)局部变量没有默认值,必须赋值或初始化。
(4)作用范围:
局部变量只能在它所属的方法体内被使用
成员变量的作用范围在整个类中任何方法中都可以调用。
(5)局部变量和成员变量如果同名,他们其实是不同的变量,符合各自的运行规则。(就近原则)
4.数据类型
基本数据类型和引用数据类型
基本数据类型和 引用数据类型 的区别
注意:基本数据类型和 引用数据类型 的区别?
基本数据类型:在栈中可以直接分配内存的数据是基本数据类型。
引用数据类型:是数据的引用在栈中,但是他的对象在堆中。
基本数据类型
基本数据类型分为:强类型语言 弱类型语言 var a = “abc”;
三大类(8种):
数值型:整数类型(byte 1、short 2、int 4、long 8)
浮点类型(float 4、double 8)
字符型(char 2)
布尔型(boolean)
基本数据类型的转换
*自动类型转换
* byte —> short—>int—>long
float —>double
* char—> int
* byte,short,char三者在计算时会转换成int类型 (了解)
* int整型常量和字符常量在合理范围内可以直接赋值给 byte、short、int、char (了解)
*强制类型转换
特殊:boolean 类型不能转换成任何其它基本数据类型。
long l = 100L;
int i = (int)l;
但有可能造成精度降低或数据溢出,使用时要小心。
记住:小可转大(直接转换),大转小会失去精度!!!大转小必须进行强制转换!
引用数据类型
引用数据类型:类、接口、数组、枚举、注解
注意:引用数据类型的大小统一为4个字节,记录的是其引用对象的地址。
String 表示一个字符串,它是引用数据类型。使用””表达。
5.运算符
1.算术运算符:+ 、 - 、 * 、 / 、 % 、 ++ 、 --
2.赋值运算符:= 、 += 、 -= 、 *= 、 /= 、 %=
3.关系运算符:> 、 < 、 >= 、 <= 、 == 、 !=
4.逻辑运算符:! 、 & 、 | 、 ^ 、 && 、 ||
5.位运算符:& 、 | 、 ^ 、 ~ 、 >> 、 << 、 >>>(了解)
6.字符串连接运算符:+
7.三目运算符 ?:
逻辑运算符与布尔操作数一起使用
逻辑表达式的结果是布尔值
“&”和“&&”的区别在于:
“&”:那么无论任何情况,“&”两边的表达式都会参与计算。
“&&”: 当“&&”的左边为false,则将不会计算其右边的表达式。即左false则false
“|”和“||”的区别与“&”和“&&”的区别类似。
“||”: 当“||”的左边为true,则将不会计算其右边的表达式。即左true则true
认识逻辑运算符
1.逻辑运算符有哪些 &与 |或 ^异或 !非
2.逻辑运算符的运算规则
逻辑运算符的操作数和操作结果都是boolean值
| & ^ 既是逻辑运算符,也是位运算符,如何区分,根据操作数的类型进行区分
!只是逻辑运算符,不是位运算符。位运算符中的取反是 ~
|| && 只是逻辑运算符,不是位运算符。
^异或 两个值不同为真,相同为假
&&和&的联系和区别
联系:都是与运算符,只有两个操作数都是true,结果才是true
区别:& 逻辑与运算符 && 短路与运算符
如果&&与运算的第一个操作数是false,第二个操作数是否进行运算,对最终的结果没有影响,结果肯定是false
如果使用&,会计算第二个操作数,如果使用&&,不计算第二个操作数。
注意:采用&&效率高一些,对最终的逻辑运算的结果是没有影响的!
位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。
如果操作的对象是char、byte、short,位移动作发生前其值会自动晋升为int,运算结果也为int。
位运算符(原码、反码、补码)
注意:位运算符是对操作数以二进制比特位为单位进行 逻辑运算操作 ,操作数和结果都是整型数。
注意:>>> 无符号右移 不能对负数操作,因为负数是有符号位的,没有意义。
右移一位相当于除2取商。
左移一位相当于乘2。
运算符的优先级别 赋值 < 三目 < 逻辑 < 关系 < 算术 < 单目 //优先级别 单目运算符 ++ -- ! ~ //算术运算符 (++ --) > (* / %) > (+ -) //关系运算符 (> < >= <=) > ( == !=) //逻辑运算符 (! > & >^ >|) //算术>关系>逻辑>赋值= 运算符的优先级别 赋值运算符的优先级别最低 使用 小括号() 不会改变运算符的优先级别,可以改变表达式的计算顺序 因为()也是一种运算符,并且级别最高。
三目条件运算符
三目条件运算符,语法格式:x ? y : z
其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个三目运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。
注意:经常用来代替简单的if-else判断!
6.Scanner的简单使用
Scanner的作用:实现键盘输入数据。
Scanner的使用
(1)先导入Scanner import java.util.Scanner;
(2)创建对象 Scanner input=new Scanner(System.in);
(3)接收键盘录入的数据
import java.util.Scanner;
public class Demo1{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
//3.1接收字符串类型数据 next(),遇到空格截断 nextLine(); 遇到换行结束
//String s=input.next();
String s=input.nextLine();
System.out.println(s);
//3.2接收整型数据 nextInt();
int num=input.nextInt();
System.out.println(num);
//3.3接收浮点数
double d=input.nextDouble();
System.out.println(d);
}
}
7.选择结构
1、if语句对条件表达式进行一次测试,若测试为真,则执行{}里面的语句,否则跳过该语句、
2、当条件表达式为真时,执行语句块1,否则,执行语句块2。也就是else部分。
逐条if语句进行判断,条件匹配,进入语句体,否则对if语句继续匹配。
3、switch只适合做等值判断。
(1)如果表达式的值和case 相等,就执行case中的代码,如果所有的 case 都不满足需求的时候,执行default中的内容。
(2)break 帮助跳出switch 语句, 如果执行过程中 没有遇到break 继续向下执行直到遇到break为止。
(3)switch特殊用法:case穿透
case穿透: 产生这种现象的原因:由于某个case语句中缺少或者漏写break语句所导致的结果。
语法格式: switch(表达式expr){ case const1: statement1; break; case const2: statement2; break; … … case constN: statementN; break; default: statement_dafault; break; }
1.肯定是多分支结构 2.只能是等值判断,不能做区间判断 3.执行过程:进行条件的计算,结果和case逐个判断,遇到相等的值,执行后续的语句,直到执行完所有后续case的语句停止,或者遇到break停止。 4.不允许出现重复的case。 5.switch 开关 转换 / case 情况 事情 / default 默认的 / break 退出switch语句 6.switch条件表达式的类型: 不可以是double、long、boolean, 可以是int\byte\short\char\ String<jdk1.7才支持> 7.if多分支和switch多分支有什么区别 switch只能是等值判断,if可以是等值判断和区间判断,所以if的使用范围更大 8. default 可以不写,一般放在最后,也可以放在最开始的位置,但是要加上break,建议放在最后,这样可以省略一个break。
- if、 if else 、 if -- else if--else if--else if-else - switch
8.循环结构
循环结构都由如下四个结构组成:
初始化、条件判断、循环体、迭代
- while
特点:先判断,后执行。语法:
while(布尔表达式){
循环体;
}
- do-while
特点:先执行,后判断。语法:
do{
循环体;
}while(布尔表达式);
- for
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。语法:
for (初始表达式1;布尔表达式2;步进4) {
3循环体;
}
9.跳转
- break
在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句还可用于多分支语句switch中)
- continue
continue 语句用在循环语句体中,用于终止某一次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
continue的作用:不是结束整个循环,而是结束本次循环。
- return
return语句从当前方法退出,返回到调用该方法的语句处,并从该语句的下条语句处继续执行程序。
返回语句的两种格式:
1、return expression
返回一个值给调用该方法的语句。
返回值的数据类型必须和方法声明中的返回值类型一致或是(精度低于声明的数据类型-不正确)。补充:返回值的数据类型可以比声明的数据类型精度低,但是要保证能自动转换。
2、return
当方法声明中用void声明返回类型为空时,应使用这种返回类型,它不返回任何值。
10.多重循环
三种循环方式
while / do-while / for
一个循环体内又包含另一个完整的循环结构
任何两种循环都可以相互嵌套
可以任意层次循环,但是一般不超过3层。
多重循环执行过程 外层循环变量变化一次,内层循环变量要变化一遍
11.方法
1、概念:实现特定功能的一段代码,可以反复使用。 2、语法 public void 方法名称(参数){ 方法体; }
12.递归方法
什么是递归
程序调用自身的编程技巧称为 递归。
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
递归问题的特点
(1)一个问题可被分解为若干层简单的子问题。
(2)子问题和其上层问题的解决方案一致。
(3)外层问题的解决依赖于子问题的解决。
递归结构包括两个部分:
递归结束条件。解答:什么时候不调用自身方法。如果没有条件,将陷入死循环。
递归体。解答:什么时候需要调用自身方法。
/** 功能:not 1+2+3....+100=? but 1*2*3*4*5......*n=? 技能:递归 解决方式1:采用循环 6!=1*2*3*4*5*6 解决方式2:采用递归 6!=6*5! 5!=5*4! 4!=4*3! 3!= 3*2! 2!=2*1! 1!=1 总结 1.什么是递归:自己调用自己 2.递归的调用过程 3.递归的优点和缺点 缺点:会占用大量的内存空间,也会浪费时间,时空效率低下 优点:代码简单 */ public class TestRecursion1{ public static void main(String [] args){ //方式1:循环 long result = 1; int n = 6; for(int i=1;i<=n;i++){ result = result * i; } System.out.println(n+"!="+result); //方式2:递归 long result2 = fac(n); System.out.println(n+"!="+result2); } /* 求阶乘 n: 返回值:阶乘的结果 */ public static long fac(int n){ //定义结果变量 long result; //计算结果 if(n==1){ return 1; }else{ result = n * fac(n-1); } //返回结果 return result; } }
递归总结
递归的优点
复杂的代码逻辑,可以简单实现。
递归的缺点
递归调用会占用大量的系统堆栈,内存耗用多,
在递归调用层次多时速度要比循环慢的多
递归的使用场合
任何可用递归解决的问题也能使用迭代解决。
当递归方法可以更加自然地反映问题,并且易于理解和调试,并且不强调效率问题时,可以采用递归;
在要求高性能的情况下尽量避免使用递归,递归既花时间又耗内存。