基础语法
标识符
作用
常量、变量、方法、类、包等的名称
命名规则
- 必须以字母,下划线_,美元符号$开头
- 大小写敏感,长度不限制
- 不可以是java关键字
java基本数据类型
java是一种强类型语言
- 常量有数据类型
- 变量必须声明其数据类型
数据类型
类型 | 占用存储间 | 表数范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -2152<sup>15</sup>-1(-3276832767) |
int | 4字节 | -231~231-1(约21亿) |
long | 8字节 | 263~263-1 |
float | 4字节 | 尾数后七位有效数字 |
double | 8字节 | |
字符型 | 2字节 | |
布尔型 | 1位,不是1字节 |
注意事项
- 整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ‘(建议使用大写,小写容易误认为数字1)
- 浮点常量默认为double。要变为float,需在后面增加F/f. 如: 3.14F
基本数据类型之间的转换
自动转换(隐形转换):在运算过程中,如果两个值的类型不一致,将会自动将小的类型转化为大的类型
强制转换:在运算过程中,可以手动强制转换,将大的类型转化为小的,实现方式(datatype)
常量和变量
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储单元
注意事项
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型。
- 变量名必须是合法的标识符。
命名规则
所有变量、方法、类名:见名知意
- 变量、方法名:
- 首字母小写和驼峰原则 ageNew monthSalary
- 常量:
- 大写字母和下划线 MAX_VALUE
- 类名:
- 首字母大写和驼峰原则 Man GoodMan
运算符
算数运算符:+,-,*,/,%,++,–
赋值运算符: =
扩展赋值运算符:+=,-=,*=,/=
关系运算符:>,<,>=,<=,==,!=
逻辑运算符:&&,||,!
位运算符:&,|,^,~ , >>,<<,>>> (了解!!!)
条件运算符:?:
优先级
赋值<三目<逻辑<关系<算数<单目(++,–)
注意事项
- /:取商
- %:取模,取余数
- ++:在变量原有基础上+1,谁在前先运算谁
- 关系运算符返回值为布尔类型
- &&短路与:两边表达式从左到右进行对比,如果左边表达式为false,则右边不需要判断,两边表达式有一个为false即为false
- ||短路或:两边表达式从左到右进行对比,如果左边表达式为true,则右边不需要判断,两边表达式有一个为true即为true
- 三目运算符:(3>2 ? 3:2)表达式如果是true,则返回?后的结果;如果是false,则返回:后的结果。
机器数和真值
例如:11010111(机器数) = -87(真值)
第一个1为负数,后面为26+24+22+21+20=87
原码反码补码
原码
原码是指将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。
例如:
数字6在计算机中原码表示为 :0000 0110
数字-6在计算机中原码表示为:1000 0110
以上是在8位计算机中的原码表示,如果在32位或16位计算机中,表示方法是一样的,只是多了几个0而已。
原码进行乘除运算时结果正确,而在加减运算的时候会回出现问题
反码
反码表示规则为:如果是正数,则表示方法和原码一样,如果是负数,则保留符号位1,然后将这个数字的原码按照每位取反。
例如:
数字6在计算机中反码就是它的原码:00000110
数字-6在计算机中反码为 :11111001
负数符号位为1,其他位都取反
补码
补码是计算机表示数据的一般方式,其规则为:如果是正数,则表示方法和原码一样,如果是负数,则将数字的反码加上1(相当于将原码数值按位取反然后再加1)
分支结构
-
单分之结构:只做单一条件的判断,如果符合,做某些事。
public class IfDemo{ public static void main (String[] args){ //单分之判断,Math.random()产生数据的范围是[0,1) int i = (int)(Math.random()*6); if(i>3){ System.out,println("值大于3"); } System.out.println("number:"+i); } }
-
双分支结构:当做条件判断的时候,只有两种选择
public class IfDemo{ public static void main (String[] args){ int r = 1; double PI = 3.14; double area = PI*r*r; double length = 2*PI*r; if(area >= length){ System.out.println("面积大于等于周长"); }else{ System.out.println("周长大于面积"); } } }
案例-会员信息录入
要求:录入会员信息,判断录入会员号是否合法
import java.util.Scanner; public class AddCust{ public static void main(String[] args){ System.out,println("欢迎光临"); System.out,print("请添加客户信息"); //创建Scanner对象 Scanner sc = new Scanner(System.in); System.outprintln("请输入会员号码<4位整数>"); Sting number = sc.nextLine(); System.out.println("请输入会员生日<日/月>"); Sting birthday = sc.nextLine(); System.out.println("请输入会员积分"); Sting score = sc.nextLine(); if(number.length()==4){ System.out.println("会员信息如下"); //\t为制表符 System.out,println(number+"\t"+birthday+"\t"+score); }else{ System.out.println("会员号码输入错误,请输入四位整数") } } }
-
多分支:可以进行多个条件的判断,每个匹配项可以选择不同
案例:年龄分类
int age = (int)(Math.random()*100); if(age<10){ System.out,println("儿童"); }else if(age<20){ System.out,println("少年"); }else{ System.out.println("成年人") }
4.嵌套分支结构
案例:学校举行运动会,百米赛跑跑入20秒内的学生有资格进决赛,根据性别分别进入男子组和女子组
int time =(int)(Math.random()*40); if (time<20){ System.out.println("恭喜进入决赛"); String sex = ((int)(Math.random()*2))==0?"girl":"boy"; if(sex = "girl"){ System.out.println("欢迎进入女子组"); }else{ System.out.println("欢迎进入男子组"); } }else{ System.out.println("成绩太差,淘汰"); }
5.switch多分支结构
1.每个case模块中要添加break,防止多次匹配
2.如果多个case中处理的逻辑代码功能一致,可以考虑只在最后添加一次处理
3.default表示默认选项,当所有的case不匹配时,会执行此选项
4.default可以有,也可以没有
案例 : 判断元音辅音
int random = (int)(Math.random()*26); char ch = (char)('a'+random); swith(ch){ case'a': case'e': case'i': case'o': case'u': System.out.println("元音"+ch); break; default: System.out.println("辅音"+ch); }
循环结构
1.while
需要四部分组成 先进行判断再执行
初始化:变量的初始化
条件判断:必须返回true或者false的值
循环体:具体要执行的逻辑代码
迭代变量:促使此循环结束
public class WhileDemo{
public static void main(String[] args){
int i = 1;
while(i<=100){
System.out.println("第"i+"次输出");
i++;
}
}
}
案例:求一百以内偶数和
public class WhileDemo{
public static void main{String[] args}{
int i = 1;
int sum = 0;
while(i<=100){
if(i % 2 == 0){
sum+=i;
}
i++;
}
}
}
2.do-while循环
先执行再判断
public class DoWhileDemo{
public static void main{Strings[] args}{
int i = 1;
do{
System.out.println("第"+i+"次输出");
i++;
}while(i<=100);
}
}
3.for循环
使用最多,语法规则:
for(初始化1;条件表达2;步进器4){
代码逻辑3
}
使用for循环的好处
1.代码简洁
2.变量初始化时,for循环的作用域仅仅是当前for循环结构
while循环的作用域是从变量的定义开始到整个方法结束
public class ForDemo{
public static void main(String[] args){
for(int i = 1,i<=100;i++){
System.out.println("第"+i+"次输出");
}
//100以内的偶数和
int sum = 0;
for(int i = 1;i<=100;i++){
if(i%2==0){
sum+=i;
}
}
System.out.println("100以内偶数和是"+sum);
}
}
案例:用循环实现十进制转为二进制
import java.util.Scanner;
public class TenToTwo{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个十进制数");
int number = sc.nextInt();
String str ="";
while(number!=0){
int i = number % 2;
str = str + i;
number = number/2;
}
System.out.println(str);
}
}
跳转语句
break(适用于循环结构和switch结构)(break语句终止摸个循环,程序跳到循环块外的下一条语句)
continue(只用于循环结构中)(continue跳出本次循环,进入下一次循环)
return(从当前方法退出,返回到调用该方法语句处,并从该语句的下条语句处继续执行程序)
return有两个基本用途: 1.返回方法的返回值 2.终止当前程序
break案例:生成0-100随机数,直至88为止
break:跳出循环,当包含多层循环时,break只能跳出本层循环,无法跳出外层循环。
public static BreakDemo{
public static void main(Strings[] args){
int count = 0;
while(true){
int i = (int)(Math.random()*101);
if(i==88){
break;
}
count++;
System.out.println(count+"--"+i);
}
/* 请打印输出(1,1)(1,2)(1,3)......直到(6,6)停止
for(int i = 1;i<10;i++){
for(int j =1;j<10;j++){
System.out.println("("+i+","+j+")");
if(i==6&&j==6){
return;//此处不可以用break的
}
}
}
*/
}
}
continue 语句:跳出本次循环
案例:把100~150之间不能被3整除的数输出
public class ContinueDemo{
public static void main(String[] args){
for(int i = 100;i<=150;i++){
if(i%3==0){
continue;
}
System.out,println(i);
}
}
}
return案例:
public class ReturnDemo{
public static void main(String[] args){
System.out.println(get());
for(int i = 0;i<10;i++){
System.out,println(i);
if(i==5){
return;
//System.exit(100);(这个和return都可以。括号内可以填任何数)(很暴力,杀死进程)
}
}
}
public static int get(){
return 100;
}
}
多重循环
案例:输出九九乘法表
public class ManyFor{
public static void main(String[] args){
for(int i =1;i<10;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println();
}
}
}
案例:斐波那契数列,1.1.2.3.5.8.13.21.34.55
import java.util.Scanner;
//斐波那契数列可以选择打印多少个值
public class Fibonacci{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入要打印的斐波那契数列的个数");
int count =sc.nextInt();
int x =1;
int y =1;
int z =0;
//前两位是1
for(int i = 1;i<=count;i++){
if(i==1||i==2){
System.out.print(1+"/t");
}else{
z=x+y;
x=y;
y=z;
System.out.print(z+"/t");
}
}
}
}
案例:百钱买百鸡,公鸡5元,母鸡3元,小鸡3只1元
public class BuyChicken{
public static void main(String[] args){
for(int i =0;i<=20;i++){
for(int j=0;j<=34;j++){
for(int k =0;k<=300;k++){
if(((i+j+k)==100) && (5*i+3*j+k/3)==100)&&(k%3==0)){
System.out.println("公鸡:"+i+"\t母鸡:"+j+"\t小鸡:"+k);
}
}
}
}
}
}
递归算法
递归函数:
在程序运行过程中,有时需要调用程序本身,此时可以使用递归
注意:在程序中,能不使用递归就不要使用递归
1.使用递归时会加大资源的消耗
2.如果递归的层次比较深,会造成栈溢出
递归使用:输出摸个磁盘目录下所有文件名称
案例:斐波那契数列,1.1.2.3.5.8.13.21.34.55
public class Fibonacci{
public static void main(String[] args){
for(int i = 1;i<=10;i++){
System.out.print(getNumber(i)+"\t")
}
}
public static int getNumber(int number){
if(number==1||number==2){
return 1;
}else{
return getNumber(number-1)+getNumber(number-2);
}
}
}