一、java介绍:
java语言的特性:
- 面向对象性
- 健壮性
- 跨平台性(write onece,run anywhere)-–JVM
JDK JRE JVM
河床好比操作底层,jdk好比是河水,java应用程序好比是船
注意事项
- 源文件以.java结尾
- 源文件中可以有多个class声明的类
- 类中可以有主方法(即main()方法),其格式是固定的:public static void main(String[] args ){}
- main()方法是程序的入口,方法内是程序的执行部分
- 一个源文件中只能有一个声明为public的类,同时要求此类的类名与源文件名一致
- 每个语句都已”;“结束
- 执行程序:编译:javac.exe 编译完:生成诸多个.class字节码文件;运行:java.exe
注释
单行://
多行:/* 注释文字 */,多行注释不能嵌套
文档注释【java特有】:可以被javadoc解析
/**
*@author:NXF
*@version:V1.0
*@param:XX
*/
javadoc -d 文件名 -author -version Helloworld.java
二、关键字、标识符、变量、运算符、流程控制、数组
1.关键字
特点:所有字母都为小写
2.标识符
凡自己可以命名的地方都叫标识符
规则:26个英文字母大小写,0-9,_或$组成;数字不可以开头;不可以使用关键字和保留字,但能包含关键字和保留字;严格区分大小写,长度无限制;标识符不能包含空格
java名称命名规范:
- 包名:多单词组成时所有字母都小写:xxyyzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxYyZz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxYyZz
- 常量名:所有字母都大写,多单词时每个单词用下划线连接:XX_YY_ZZ
3.变量
java中每个变量必须先声明 ,后使用
格式:数据类型 变量名=初始化值
作用域:一对{}内有效
(1)整型
byte b1= 12;
short s1 = 128;
int i1= 12;
long l1 = 21345612L;#定义long型变量,值的末尾加"L"或'l',如果不加,会默认为int类型
(2)浮点型(带小数点的数值):
例:float 单精度 、double 双精度(默认类型)
float f1 = 12.3F;#如果不加F,则会被认为是double类型
double d1 = 12.3;
(3)字符型:
char只能表示一个字符[英文、中文、标点符号、日文..…];String表示多个字符
char c1 = 'a';
char c2 = '中';
String str1 = "ab";
String str2 = "中国";
//可以表示转义字符
char c3 = '\t';
char c4 = '\n';
char c5 = '\u123'
(4)布尔类型:
boolean只能够为true或false,不能取值null
boolean b1 = true;
if(b1){
System.out.println('XXX');
}else{
System.out.println('XXX');
}
变量之间的运算:
(不考虑boolean,剩下:char byte short int long float double)
自动类型转换:当容量小的数据类型与容量大的数据类型做运算时,容量小的会自动转换为容量大的数据类型:char,byte,short===>int===>long===>float===>double
int i1 = 12;
short s1 = 2;
int i2 = i1 + s1;
float f1 = 12.3F;
float f2 = f1 + i2;
//float d1 = f2 + 12.3;
long l = 12L;
float f3 = l;
需要注意的:当char/byte/short之间做运算时,默认的结果为int类型
short ss1 = 12;
byte bb1 = 1;
char cc1 = 'a';
//short ss2 = ss1 + bb1;错误
int ii1 = ss1 + bb1;//正确
//char cc1 + bb1;错误
short ss2 = 11;//正确
//short ss3 = ss1 + ss2;错误
System.out.println('*'+'\t'+'*');//93
System.out.println("*"+"\t"+"*");//* *
强制类型转换:容量大的转换成容量小的,要使用强制类型转换符:()
强制类型转换的问题:导致精度的损失
long l1 = 12345L;
int m1 = (int)l1;
byte by1 = (byte)m1;//高位截取
平时常用的字符串,也是一种数据类型:String
String nation = "我是NXF";
字符串与基本数据类型之间的运算:只能是连接运算+,得到的结果仍然是一个字符串
String str = "abc";
String str1 = str + m1;//abc12345
String st1 = 'hello'
int myInt1 = 12;
char ch1 = 'a'
System.out.println(st1 + myInt1 + ch1);//hello12a
System.out.println(myInt1 + ch1 + st1);//109hello
System.out.println(ch1 + st1 + myInt1);//ahello12
字符串的赋值可以为“字符串”,也可以是数字+“字符串”的形式;
String st2 = "12";
str2 = 12 + "";
练习题:
String str1 = 4; //错,4应该加引号
String str2 = 3.5f + "";//对
System.out.println(str2)//输出:3.5
System.out.println(3+4+"Hello!")//输出7Hello!
System.out.println("Hello!"+3+4)//输出Hello!34
System.out.println('a'+1+'Hello!')//输出98Hello!
System.out.println("Hello"+'a'+1)//输出Helloa1
4.运算符
(1)算术运算符
【1】除
//除:/
int i = 12;
int j = i/5;
double d = i/5;
double d1 = i/5.0;
double d2 = (double)i/5;
System.out.println(j);//2
System.out.println(d);//2.0
System.out.println(d1);//2.4
System.out.println(d2);//2.4
【2】取模
//取模:%取余数,结果的符号取决于被模数A:(A%B)
int i1 = 12 % 5;
int i2 = -12 % 5;
int i3 = 12 % (-5);
int i4 = -12 % (-5);
System.out.println(i1);//2
System.out.println(i2);//-2
System.out.println(i3);//2
System.out.println(i4);//-2
【3】前++、后++ | 前--— 后--—
//前++:先自增1,后做运算
//后++:先做运算,后自增1
int myInt1 = 10;
int myInt2 = myInt1 ++;
System.out.println(myInt1);//11
System.out.println(myInt2);//10
int myInt3 = 10;
int myInt4 = ++ myInt3;
System.out.println(myInt3);//11
System.out.println(myInt4);//11
//前++:先自减1,后做运算
//后++:先做运算,后自减1
int myInt11 = 10;
int myInt22 = myInt11 --;
System.out.println(myInt11);//9
System.out.println(myInt22);//10
int myInt33 = 10;
int myInt44 = -- myInt33;
System.out.println(myInt33);//9
System.out.println(myInt44);//9
(2)赋值运算符与比较运算符
【1】赋值运算符
+=
int i1 = 10;
i1 += 3;
short s = 10;
//s = s + 3;//编译不通过
s = (short)(s+1);//不建议如此实现
s += 1;//既可以实现运算,又不会更改s的数据类型
System.out.println(s);
区分好==和=的区别
if(b1=true)
System.out.println("结果为真");//输出
else
System.out.println("结果为假");
if(b1==true)
System.out.println("结果为真");
else
System.out.println("结果为假");//输出
*=
int i = 1;
i *= 0.1;//不会报错,会自动计算得到0.1,转成int之后,结果为0
System.out.println(i);//0
【2】比较运算符
if(i>1 && i<10){}
不能写为:if(1<i<10){}
(3)逻辑运算符
//& && | || ! ^
boolean a = true;
boolean b = false;
System.out.println(a & b);//true
System.out.println(a && b);//false
System.out.println(a | b);//true
System.out.println(a || b);//true
System.out.println(!a & b);//false
System.out.println(a ^ b);//true
&与&&的区别:
&:不管左端是true还是false,右端都会进行运算
&&:当左端为false时,右端不再进行运算
当左端为true时,&和&&都要进行运算
以后使用时,建议使用&&
int i1 = 10;
if (b & (i1++) >0){
System.out.println('A');
}else{
System.out.println('B');//B
}
System.out.println(i1);//11
int i2 = 10;
if (b && (i2++) >0){
System.out.println('A');
}else{
System.out.println('B');//B
}
System.out.println(i2);//10
| 与 ||的区别:
|:当左端为true时,右端照样做运算
||:当左端为true时,右端不再进行运算
当左端为false时,|和||都要计算右端
int i3 = 10;
if (a | (i3++) >0){
System.out.println('A');//A
}else{
System.out.println('B');
}
System.out.println(i3);//11
int i4 = 10;
if (a || (i4++) >0){
System.out.println('A');//A
}else{
System.out.println('B');
}
System.out.println(i4);//10
练习:
int x = 1;
int y = 1;
if (x++ == 2 & ++y == 2){
x = 7;
}
System.out.println("x="+x+",y="+y);//2,2
int x1 = 1;
int y1 = 1;
if (x1++ == 2 && ++y1 == 2){
x1 = 7;
}
System.out.println("x1="+x1+",y1="+y1);//2,1
int x2 = 1;
int y2 = 1;
if (x2++ == 1 && ++y2 == 1){
x2 = 7;
}
System.out.println("x2="+x2+",y2="+y2);//2,2
int x3 = 1;
int y3 = 1;
if (x3++ == 1 || ++y3 == 1){
x3 = 7;
}
System.out.println("x3="+x3+",y3="+y3);//7,1
(4)位运算符
两段是数值类型的数据
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
交换两个数
//交换两个数
int m = 12;
int n = 5;
//方法1:提供一个临时变量
int tmp = m;
m = n;
n = tmp;
//方法2:当m和n很大时,有可能出现精度损失
m = m + n;//m = 12 + 5
n = m - n;//n = 17 - 5
m = m - n;//m = 17 - 12
//方法3:异或,优点:没有上面两种方法的缺点
m = m ^ n;
n = m ^ n;//(m^n)^n
m = m ^ n;//(m^n)^m
(5)三元运算符
格式:(条件表达式)?表达式1:表达式2;
要求:表达式1与表达式2为同种数据类型
既然是运算符,就一定会有运算的结果,结果的数据类型与表达式1,2的类型一致
三元运算符在一定程度上,可以与if-else互换。(三元一定可以转换为if-else,反之不成立)
int i = 10;
int j = 20;
int max = (i>j)?i:j;
String str = (i>j)?"i大":"j大";
//String str = (i>j)?i:"j大";错误
String str1 = (i>j)?"i大":(i==j)?"相等":"j大"
练习:使用三元运算符,输出三个数中的最大值
//使用三元运算符,输出三个数中的最大值
int i = 10;
int j = 20;
int k = 30;
int max = (i>j)?((i>k)?i:k):((j>k)?j:k);
int max1 = (m>n)?m:n;
int max2 = (max1>k)?max1:k;
练习:手动的方式,从控制台输出60的16进制
//方法1:调包
int i = 60;
String binary = Integer.toBinaryString(i);//111100
System.out.println(binary);
String hex = Integer.toHexString(i);//3c
System.out.println(hex);
//方法2:
int j = i & 15;//获取到i的最低4位对应的值
String k1 = (j <= 9)?j+"":(char)(j-10+'a')+"";
i = i >> 4;
int z = i & 15;//高四位
String k2 = (z<=9)?z+"":(char)(z-10+'a')+"";
System.out.println(k2 + k1);
运算符优先级:
5.流程控制
(1)顺序结构
(2)分支结构:if..…else if..…else和switch
//创建一个Scanner类的对象
import java.util.Scanner;
Scanner s = new Scanner(System.in);
//调用此对象的相应的方法,完成键盘输入的值的获取
//next():表示从键盘获取一个字符串
String str = s.next();
//nextInt:从键盘获取一个整数
int score = s.nextInt();
switch..…case:
[1]根据变量的值,选择相应的case去判断,一旦满足case条件,就执行case的相应语句。如果没有break或者已经到结尾的话,会继续执行其下的case语句。
[2]default:是可选的,而且位置是灵活的
[3]变量可以是哪些类型:char、byte、short、int、枚举、String(jdk1.7)
[4]case条件:其中条件只能是值,不能是取值范围
int i = 2;
switch(i){
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
default:
System.out.println("other");
break;
(3)循环结构
[1]for循环
格式:初始化条件+循环条件+迭代条件+循环体
for (int i=0;i<4;i++){
System.out.println(i);
}
for循环与while可以相互转换
[2]while循环
格式:初始化条件+循环条件+迭代条件+循环体
int i = 1;
while i <= 20{
System.out.println(i);
}
[3]do..…while
与while的区别:do..…while循环至少会执行一次
int i = 1;
do{
if(i%2 == 0){
System.out.println(i);
}
i++;
}while(i <= 100);
[4]嵌套循环
//100以内的所有质数
long start = System.currentTimeMillis();//获取系统当前的毫秒数
boolean flag = false;
for(int i=2;i<=10000;i++){
for(int j=2;j <= Math.sqrt(i);j++) {
if (i % j == 0) {
flag = true;
break;
}
}
if(!flag){//flag == false
//System.out.println(i);
}
flag = false;
}
long end = System.currentTimeMillis();
System.out.println("time:"+(end-start));