一、Java特性
Java:静态面向对象编程语言
1)简单性:没有结构,不需要指针
2)面向对象
3)分布性:分布式语言。既支持各种层次的网络连接,又以Socket类支持可靠的流*(stream)*网络连接,所以用户可以产生分布式的客户机和服务器。
4)编译和解释性
java编译程序生成字节码(byte-code),而不是常用的机器码
5)稳健性
6)安全性
7)可移植性
8)高性能:Java是一种先编译后解释的语言
9)多线程性
10)动态性
二、数据类型与变量
(一)数据类型
基本数据类型(简单数据类型)
1、整型:byte、short、int、long
1)byte:-128~127(-2的7次方到2的7次方-1)
2)short:-32768~32767(-2的15次方到2的15次方-1)
3)int:-2147483648~2147483647(-2的31次方到2的31次方-1)
4)long:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
2)浮点型:float、double
1)float单精度浮点型:取值范围:3.402823e+38~1.401298e-45
2)double(双精度浮点型)(浮点型默认):取值范围:1.797693e+308~4.9000000e-324
3)字符型:char(可存储任何字符)
单一的16位Unicode字符
最小值: \u0000(十进制等效值为 0)
最大值: \uffff(即为 65535);
4)布尔型:boolean
true、false(默认)
引用数据类型
1)数组 []
(二)变量
Java属于强类型语言,强类型语言必须为每一个变量声明一种类型。
1、变量类型
public class var{
static int lei_var; //类变量
String str="hello world"; //实例变量
public void test(){
int local_var=0; //局部变量
}
}
1)类变量(静态变量):独立于方法之外的变量,用 static 修饰,必须在方法之外。生命周期与类一致。
2)实例变量(类成员变量):独立于方法之外的变量,声明在类中,无static 修饰。生命周期与对象一致。
3)局部变量:类的方法中的变量,在成员方法中定义一个变量(类成员变量和成员方法可以统称为类成员)。局部变量在方法实行时被创建,在方法执行结束的时候被销毁。局部变量在使用时必须进行赋值操作或被初始化。
2、类型转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低--------------------------------------------->高
byte,short,char-> int -> long -> float -> double
3、常量
常量在程序运行时不能被修改。
通常用final关键字修饰常量,通常用大写字母表示常量。
final double PI = 3.1415927;
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制;
(三) 枚举类型
变量取值在有限集合内
三、运算符和表达式
(一)运算符
算数运算符 | 说明 | 示例 |
---|---|---|
+ | 加 | - |
- | 减 | - |
* | 乘 | - |
/ | 除,两个操作数都是整数时表整除,否则表示浮点除法 | 15/2=7、15.0/2=7.5 |
% | 取余 | 15%2=1 |
(二)数学函数与常量
Math类,包含各种数学函数;
1、计算数值平方根:Math.sqrt(x)
2、幂运算:Math.pow(x,a) x的a次幂
3、常用三角函数:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
4、指数函数及其反函数,自然对数及以10为底的对数:
Math.exp
Math.log
Math.log10
5、用于表示
π
和
e
\pi和e
π和e常量的近似值:
Math.PI
Math.E
* 如不想在数学方法名和常量名前添加前缀"Math",只需要在源文件的顶部添加代码:
import static java.lang.Math.*;
(三)结合赋值和运算符
x +=4;
//等价于
x = x+4
(四)自增与自减运算符
运算符只会改变变量的值,他们的操作数不能是数值,例如4++是非法语句
int n = 12;
n++; //自增后,n=13
n--; //自减后,n=11
// ++n/--n 先+1/-1再使用,n++/n-- 先使用再+1/-1
int m = 7;
int n = 7;
int a = 2* ++m; //m=8,a=16
int b = 2* n--; //n=6,b=14
(五)关系和boolean运算符
1、相等性:==
2、不相等:!=
3、! 非
4、&& 与
5、|| 或
e1 || e2
若e1返回true则不计算e2,整个表达式结果返回为true
若e1返回false,e2返回true,整个表达式返回true
若e1返回false,e2返回false,曾哥表达式返回false
6、三目运算符
x?y:z,当x返回结果为true时就返回y,当x返回结果为false时就返回z
x < y ? x : y
// 返回x和y中较小的一个
(六)位运算符
处理整数类型时,可以直接对组成整型数值的各个位完成操作
位运算符包括:
& and
| or
^ xor 异或 exclusive OR
~ not
>> 位模型右移
<< 位模型左移
(七) 括号与运算符级别
一般而言,单目运算符优先级较高,赋值运算符优先级较低。
算术运算符优先级较高,关系和逻辑运算符优先级较低。
多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级最低。在同一个表达式中运算符优先级高的先执行。
Java运算符优先级 http://c.biancheng.net/view/794.html
四、控制流程
(一)块作用域
块是指由一对{}括起来的若干条简单的Java语句,块确定了变量的作用域。一个块可以嵌套在另一个块中,但是不能在嵌套的两个快中声明同名的变量
(二)条件语句
if(condition)
{
statement
}
if (condition)
{
statement1
}esle{
statement2
}
if(condition1){
if (condition2){
statement21
}else{
statement22
}
}
if (c1){
s1
}else if (c2){
s2
}else if (c3){
s3
}else{
s4
}
(三)循环语句
1、while循环:
while (condition1){
statment1
}
2、do-while循环:
do{
statment1
}while(c1)
// 循环体至少执行一次
(四)确定循环
for循环
for(int i =1;i<=10;i++){
System.out.println(i); //i 只能作用于这块作用域
}
// 如果要在循环体外使用i,则需要在循环体语句前声明变量
int i;
for (i = 1,i <=10,i++){
System.out.println(i);
}
// 可在独立的不同for循环中定义同名变量
// for循环是while循环的一种简化形式
(五)中断控制流程语句
1、break 语句
while(c1){
s1;
if(c2) break;
s2;
}
//如c1或在循环体中c2,就退出循环
2、continue语句,中断正常的控制流程,语句将控制转义到最内层循环的首部
while(c1){
s1;
if (c2) continue;
s2;
}
//如果c2,则continue语句越过剩余部分(s2),例可跳到循环首部s1
//如果将continue语句用于for循环中,就可以跳到for循环的“更新”部分
for(int i=1;i<=100;i++){
n = in.nextInt();
if(n<0) continue;
sum += n ;
}
//如果n<0,则continue语句跳到count++语句
(六)多重选择:switch语句
在处理多个选项时,使用if-else结构会显得有些笨拙,Java中可使用switch语句
switch语句将从与选项值相匹配的case标签处开始执行,直到遇到break语句,或执行到switch语句的结束处位置。
如果没有匹配的case标签,有default子句则执行default子句;
如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句(词是不管条件是否成立都会执行)。
switch(choice)
{
case 1:
s1;
break;
case 2:
s2;
break;
case 3:
s3;
break;
default:
...;
break;
}
五、数组
(一)数组概念
容器,一组连续的存储空间,存储多个相同数据类型的值。
特点:类型相同,长度固定,创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。可以自动给数组中的元素从0开始编号,方便操作这些元素。
(二)数组创建
声明数组变量:必须在程序中声明数组,并指定数据类型
//格式一:
//元素类型[] 数组名 = new 元素类型[元素个数或数组长度]
// 关键词new用来在内存中产生一个容器容体。数据要存储时需要有空间的,存储很多数据的空间用new操作符来开辟;
int[] arr1 = new int[5]; //5是元素个数
float[] arr2 = new float[5]
// int x[]也是一种创建数组的格式,推荐使用int[]
//格式二:
// 元素类型[] 数组名=new 元素类型[]{元素1,元素2,....};
int[] arr1 = new int[]{1,2,3,4};
float[] arr2 = {1.3,1.4,1.7,1.1}
(三)数组的初始化
初始化数组,必须将声明,创建,初始化都放在一条语句中
int[] arr = new int[2]
a[0] = 10;
a[1] = 20;
//直接明确数组长度及数组中元素的内容
int[] arr = new int[]{20,30,40};
int[] arr = {20,30,40};
(四)数组下标的有效范围及常见异常
1、索引值越界异常(ArrayIndexOutOfBoundsException)
有效下标范围:0~数组长度-1
public class Test {
public static void main(String[] args){
int[] arr =new int[3]; //创建数组
arr[0] = 1; //依次赋值
arr[1] = 3;
arr[2] = 5;
System.out.println(arr[0]); //依次取值
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]); //报错
}
}
2、空指针异常(NullPointerException)
引用类型变量没有指向任何对象,而访问了对象的属性或是调用了对象的方法
(五)数组内存分析
1、栈内存:存储局部变量,变量一旦出了自己的作用域,那么就会马上从内存的消失,释放内存空间。
2、堆内存:存储对象内存,对象一旦被使用完,并不会马上从内存中消失,而是等待垃圾回收器不定时的把垃圾对象回收,这时候该对象才会消失,释放内存。
- 以new关键字创建的对象,JVM都会在堆内存中开辟一个新的空间,创建一个新的对象。
- 对象如果没有变量引用了,那么该对象是一个垃圾对象
(六)二维数组
1、创建二维数组
声明方式:
//1、数组元素类型 数组名字[][];
//2、数组元素类型[][] 数组名字;
int arr1[][];
char[][] arr2;
2、为二维数组分配内存
二维数组在声明时没有分配内存空间,需要关键字new来分配内存,然后才可以访问每个元素。
int a[][];
a = new int[2][4];//直接分配类
int b[][];
b = new int[2][]; //先分配行,再分配列
b[0] = new int[2]; //给第一行分配列
b[1] = new int[2]; //给第二行分配列
//创建二位数组时,可以只声明行的长度,不声明列的长度
~~int a[][] = new int[][]; //省略列的长度~~
3、二位数组的赋值
二维数组有两个索引(即下标),构成由行和列组成的一个矩阵
//1
int tdarr1[][] = {{1,3,5},{5,9,10}};
//2
int tdarr2[][] = new int [][] {{1,3,5},{5,9,10}};
//3
int tdarr3[][] = new int[2][3]; //先给数组分配内存空间
tdarr3[0] = new int[] {6,54,71}; //给第一行分配一个一维数组
tdarr3[1][0] = 63; //第二行第一列赋值63
tdarr3[1][1] = 10; //第二行第二列赋值10
tdarr3[1][2] = 7; //第二行第三列赋值7
4、多维数组
创建方法与创建二位数组类似
- 因结构过于复杂,不推荐使用比二位数组更高维的数组,可使用集合类或自定义类集合类包括List、Map等
5、通过二维数组输出不同版式的古诗
待补充
(七) 不规则数组
如:不同行的元素个数不同
(八)数组的基本操作
1、数组遍历
通常用for循环实现;
遍历二位数组需使用双层for循环,通过数组的length属性可获得数组的长度
2、使用fill()方法填充数组元素,最后将数组中的各个元素输出