main不是关键字,但被JVM所识别的名称。
关键字的定义和特点 | ||||
定义:被Java语言赋予了特殊含义的单词。 特点:关键字中所有字母都为小写。 |
||||
用于定义数据类型的关键字 | ||||
class | interface | byte | short | int |
long | float | double | char | boolean |
void | ||||
用于定义数据类型值的关键字 | ||||
ture | false | null | ||
用于定义流程控制的关键字 | ||||
if | else | switch | case | default |
while | do | for | break | continue |
return |
用于定义访问权限修饰符的关键字 | ||||
private | protected | public | ||
用于定义类,函数,变量修饰符的关键字 | ||||
abstract | final | static | synchronized | |
用于定义类与类之间的关键字 | ||||
extends | implement | |||
用于定义建立实例及引用实例,判断实例的关键字 | ||||
new | this | super | instance of | |
用于异常处理的关键字 | ||||
try | catch | finally | throw | throws |
用于包的关键字 | ||||
package | import | |||
其他修饰符关键字 | ||||
native | strictfp | transient | volatilo | assert |
Java中的名称规范:
1)单行注释 格式://注释文字
2)多行注释 格式:/* 注释文字 */
3)文档注释 格式:/** 注释文字 */
1 /** 2 这是我的Hello World程序。 3 @author 小强 4 */ 5 class Demo 6 { 7 /* 8 这是主函数,程序的入口。 9 他的出现可以保证程序的独立运行。 10 */ 11 public static void main(String[] args) 12 { 13 //这是输出语句用于将括号内的数据打印到控制台。 14 System.out.println("Hello World") 15 } 16 17 18 }
进制的由来:任何数据在计算机中都是以二进制的形式存在的。二进制早起由电信号开关演变而来。
由八个开关来表示一个最小的单位,叫字节。即八个二进制代表一个字节。
ascii编码表:用0和1不同的排列组合把生活中数据一一对应的表现出来。
进制转换:
十进制--->二进制 原理:对十进制数进行除2运算。
二进制--->十进制 原理:二进制乘以2的n次幂的过程。(从右开始乘)
十进制--->十六进制 原理:四个二进制位代表一个十六进制位。
十进制--->八进制 原理:三个二进制位代表一个八进制位。
2的 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1次幂 | |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | =255(1字节) |
负数的二进制表现形式:正数二进制取反加1.
取反:将二进制的1变成0,0变成1。
负数的二进制最高位都是1,正数的最高位为0。
数据类型 | 基本数据类型(3) | 数值型 |
整数类型: | byte(1) | short(2) | int(4) | long(8) |
字节 (-128~127) | 短整型(-32768~32767) | 整型 | 长整型 | ||||
浮点型(小数): | float(4) | double(8) | |||||
单精度 | 双精度 | ||||||
字符型 | char(2) | 0~6535 | |||||
布尔型 | boolean | true/false | |||||
引用数据类型 |
|||||||
类: | class | ||||||
接口: | interface | ||||||
数组: | [] |
整数默认:int 小数默认:double
long l=4l float f=2.3f
运算符 | 运算 | 范例 | 结果 |
+ | 正号 | +3 | 3 |
- | 负号 | b=4,-b | -3 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模 | 5%5 | 0 |
++ | 自增(前) | a-2,b=++a | a=3,b=3 |
++ | 自增(后) | a=2,b=a++ | a=3,b=2 |
-- | 自减(前) | a=2,b=--a | a=1,b=1 |
-- | 自减(后) | a=2,b=a-- | a=1,b=2 |
+ | 字符串相加 | “He”+"llo" | "Hello" |
运算符 | 运算 | 范例 | 结果 |
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4<=3 | false |
instance of | 检查是否是类的对象 | ”Hello“instance of string | true |
注意:
运算符 | 运算 | 范例 | 结果 |
& | AND(与) | false&true | false |
| | OR(或) | false|true | true |
^ | XOR(异或) | true^fales | true |
! | Not(非) | !true | false |
&& | AND(短路) | false&&true | false |
|| | OR(短路) | false||true | true |
&:只要两边的boolean表达式结果,有一个为false,那么结果为false。只有两边都为true,结果为true。(有假它就假,主要看false)
true&true=true |
true&false=false |
false&true=false |
false&true=false |
|:两边只要有一个为true,结果为true。只有两边都有false,结果为false.(有真它就真,主要看true)
true|true=true |
true|false=true |
false|true=true |
false|false=false |
^异或:就是和|有点不一样,当true^true=false
^:两边相同结果是false,两边不同结果是true。
true^true=false |
true^false=true |
false^true=true |
false^false=false |
"!":!true 非真。
&和&&的特点:
&:无论左边是true是false,右边都运算。
&&:当左边为false时,右边不运算。(效率更高)
|和||的特点:
|:两边都参与运算。
||:当左边为true,右边不运算。
位(二进制)运算符 | ||
运算符 | 运算 | 范例 |
<< | 左移 | 3<<2=12——>3*2*2=12 |
>> | 右移 | 3>>1=1——>3/2=1 |
>>> | 无符号右移 | 3>>>1=1——>3/2=1 |
& | 与运算 | 6&3=2 |
| | 或运算 | 6|3=7 |
^ | 异或运算 | 6^3=5 |
~ | 反码 | ~6=-7 |
细节:
位运算练习:
1、最有效率的方式算出2乘以8等于几? 2<<3(8相当于23,乘以就是向左移3位)
2、对两个整数变量的值进行互换(不需要第三方变量)
int n=3,m=8
(1)通过第三方变量:
1 int n=3,m=8 2 //1,通过第三方变量 3 int temp; 4 temp=n; 5 n=m; 6 m=-temp; 7 //2,不用第三方变量(求和的方式) 8 n=m+n;//11=3+8 如果n和m的值非常大,容易超出int 范围,损伤精度。 9 m=n-m;//3=11-8 10 n=n-m;//8=11-3 11 //3,异或的方式 12 n=n^m; 13 m=n^m;//即m=(n^m)^m 14 n=n^m;//即n=n^(n^m)
1 class OperateDemo3 2 { 3 public.static.void.main(String[] args) 4 { 5 int num=60; 6 //获取60的最低4位,通过&15 7 int n1=num&15//=12; 8 System.out.println(n1>9?(char)(n1-10+'A'):n1);//得到67,不是字符,后期会学到! 9 //要获取下一组四位,将60右移4位 10 int temp=60>>>4;//>>>:目的要把原有数值移光 11 //对temp的值进行最低四位的获取 12 int n2=temp&15//=3; 13 System.out.println(n2>9?(char)(n1-10+'A'):n2); 14 //0-9 'A' 'B' 'C' 'D' 'E' 'F' 15 // 10 11 12 13 14 15 16 } 17 }
1、if(条件表达式)
{
执行语句;
}
2、if(条件表达式)//if else结构简写格式:变量=(条件表达式)?表达式1:表达式2;
{ //三元运算符 好处:可以简化if else代码。弊端:因为是一个运算符,所以运算完必须有一个结果。
执行语句;
}
else
{
执行语句;
}
3、if(条件表达式)
{
执行语句;
}
else if
{
执行语句;
}
……
else
{
执行语句;
}
switch 语句格式:
switch(表达式)
{
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
……
default:
执行语句;
break;
}
switch语句特点:
if和switch语句很像,
具体什么场景下,应用哪个语句呢?
1.如果判断的具体数值不多,而是符合byte,short,int,char,这四种类型。
虽然两个语句都可以使用,建议使用switch语句,效率稍高。
2.其他情况:对区间判断,对结果为Boolean类型判断,使用if,if的使用范围更广。
代表语句:while,do while,for
1)while语句格式:(先判断条件,只有条件满足才执行循环体)
while(条件表达式)
{
执行语句:
}
2)do while语句格式:(先执行循环体,再判断条件,条件满足,再执行循环体。)
简单一句:do while特点是条件无论是否满足,循环体至少被执行一次。
do
{
执行语句;
}
while(条件表达式)
3)for 格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
注:1.for里面连个表达式运行的顺序,初始化表达式只读一次。判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复这个过程,直到条件不满足为止。
2.while和for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放,而while使用的变量在循环结束后海可以继续使用。
3.最简单无限循环格式:while(true),for(;;)【条件表达式默认为true】,无限循环存在的原因是并不知道循环多少次,而是根据某些条件来控制循环。
4.变量有自己的作用域。对于for来讲,如果将用于控制循环的增量,定义在for语句中。那么该变量只在for语句内有效。for语句执行完毕,该变量在内存中被释放。
5.for和while可以进行互换,如果需要定义循环增量,用for更为合适。
总结:什么时候使用循环结构?
当要对某些语句执行很多次时,就使用循环结构。
for语句练习(累加&计数器)
(1)累加思想:原理:通过变量记录住循环操作后的结果。通过循环的形式,进行累加的动作。
(2)计数器思想:通过一个变量记录住数据的状态变化,也许通过循环完成。
语句嵌套形式:语句中还有语句。
循环嵌套:循环中还有循环。(毕老师形象说法:大圈套小圈。)
System.out.println(); //只有一个功能就是换行。
对于打印长方形:外循环控制行数。内循环控制的是每一行的列数。也就是一行中元素的个数。
不是规律的规律:图形尖朝上,可以改变条件。让条件随着外循环变化。
图形尖朝下,可以改变初始化值,让初始化值随着外循环变化。
九九乘法表:空格用\t(制表符)
break(跳出),continue(继续)
break语句应用范围:选择结构和循环结构。
continue语句:应用于循环结构。
注:
{
执行语句;
return返回值;
}
int getSun(int x,int y)
{
return x+y;
}
在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数和参数类型不同即可。
与返回值无关,只看参数列表。 注意参数是有顺序的。
方便与阅读,优化了程序设计。
1、返回两个整数的和:int add(int x,int y){return x+y;}
2、返回三个整数的和:int add(int x,int y,int z){return x+y+z;}
3、返回两个小数的和:double add(bouble x,double y){return x+y;}
什么时候用重载?
当定义的功能相同,但参与运算的未知内容不同,那么这是就定义一个函数名称以表示其功能,而通过参数列表的不同区分多个同名函数。
例如:加法运算,99乘法表。
概念:同一种类型数据的集合。其实数组就是一个容器。
数组的好处:可以自动给数组中元素从0开始编号,方便操作这些元素。
格式1:元素类型 [] 数组名 = new 元素类型[元素个数或数组长度]
示例:int [] arr = new int[5] //arr不是int类型,为数组类型(引用数据类型)
格式2:元素类型 [] 数组名 = new 元素类型{元素,元素,元素,……}
示例:int [] arr = new int[]{3,5,1,7,……}
int [] arr = new int{3,5,1,7,……}
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,有对空间进行不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:数组和对象,通过new出来的实例都存放在堆内存中。
每一个实体都有内存地址值
实体中的变量都有默认初始化值
实体不再被使用,会在不确定的时间内被垃圾回收器回收。
方法区,本地方法区,寄存器。
格式3:int arr [] = new int[5] //是对的!
arrayindexoutofboundsexception:数组角标越界异常。操作数组时,访问到了数组中不存在的角标。注:编译只检查语法。运行时异常就要修改程序了。
arr =null :nullpointerexception:空指针异常。当引用没有任何指向,值为空的情况,该引用还在操作该实体。
数组的操作:获取数组中的元素,通常会用到遍历。
数组中有一个属性可以直接获取数组中的元素个数。length. 使用方式:数组名称.length =
1,打印数组中的元素
2,获取数组中的最值(可以初始数组中的元素或者角标)
3,对给定数组进行排序(选择排序和冒泡排序)
选择排序:内循环结束一次,最值出现头角标位置上。(x+1:前后比,arr.length-1:少取最后一个元素角标的值,少比较一次)
冒泡排序:相邻的两个元素进行比较,如果符合条件换位。第一圈,最值出现在最后一位。(-X:让每一次比较的元素减少,-1:表面角标越界。)
array.sort(arr):Java中已经定义好的一种排序方式。开发中对数组进行排序,要使用该句代码。
4,位置置换功能抽取
发现无论什么排序,都需要对满足条件的元素进行位置置换,所以把相同的代码提取出来,封装成一个函数。
5,折半查找
return -1:数组角标都是从0开始,-1代表这个角标不存在,没有找到的这种情况。
定义功能,获取key第一次出现在数组中的位置。如果返回时-1,呢么该key代表在数组中不存在。
折半查找:提高效率,但是必须要保证该数组是有序的数组。
6.进制转换
十进制转换成二进制
StrimgBuffer sb = new StringBuffer//存储数据的容器,是一个对象
sb.append(num%2)//对象的存储数据方法
sb.reverse()//反转数据的功能
十进制转换成十六进制
sb.append((char)(temp-10+'A'))
num>>>4
查表法:
定义二进制的表:char [] chs = {'0','1'……};
定义一个临时储存器:char [] arr = new char[32];
定义一个操作数组的指针(与、查表、右移),再打印。
格式1:int [] [] arr = new int [3] [2];
格式2:int [] [] arr = new int [3] [];
arr [0] = new int [3];
arr [1] = new int [1];
arr [2] = new int [2];
格式3:int [] [] arr = {{3,5,1,7},{2,3,5,8},{6,1,8,2}};
System.out.println(arr.length);//打印的是二维数组的长度。
System.out.println(arr[0].length);//打印二维数组中第一个一维数组长度。
1 int sum = 0; 2 for (int x = 0;x<arr.length;x++) 3 { 4 for(int y = o:y<arr[x].length;y++) 5 { 6 sum = sum + arr[x][y]; 7 8 } 9 } 10 System.out.println("sum="+sum);