Java基础语法

基础知识

1.变量

数据类型:Java是一种强类型的编程语言
声明周期:有效范围。Java提供了垃圾回收机制

2.基本类型

(1)整型 byte 1、short 2、int 4、long 8

  • Java采用补码的方式存储数据
  • 4中不同的表示方法:十进制、0八进制、0x十六进制、0b二进制
  • 在使用字面量,Java中的整数默认类型就是int,如果想表示long则在数值末尾添加l/L,一般建议使用L
    (2)浮点数:float 4、double 8
  • 在Java中浮点数无法精确存放,除非使用Java提供的类BigDecimal(不允许使用等值==判断,应该使用Math.abs(a-b)<1e-6
  • 字面量的表示方式:十进制123.0、科学计数法1.23e2,注意e后面只能是整数(数值末尾使用f/F表示float,使用D/d表示double)
    (3)字符类型 char char c = ‘中’;注意是单引号,不是双引号
  • Java中字符采用Unicode编码字符集,2B对应的整数为0-65535
  • 字符类型的变量可以当作整数使用
  • ‘0’ < ‘A’ < ‘a’
  • Java中提供了转义字符,以反斜杠开头
    – \ddd 1-3位的8进制数对应的字符
    – \uxxxx 1-4位的16进制对应的字符
    – ‘表示单引号,注意不允许’’’
    –’'表示双引号
    –\表示反斜杠字符
    (4)布尔类型boolean
  • 只有两个数值:true表示真,false表示假
  • 在Java中整型数据和boolean值之间没有转换关系
int k = 123;
//将十进制数转换为8进制
System.out.println("0"+Integer.toOcatlString(k));
//将十进制数转换为16进制
System.out.println("0x"+Integer.toHexString(k));
//将十进制数转换为2进制
System.out.println("0"+Integer.toBinaryString(k));

(2)浮点数类型:float单精度、double双精度
在Java中浮点数无法精确存放,除非使用BigDecimal
float:4B:1.4E-45到3.428235E38保存7-8位有效数据
double:8B:4.9E-324到1.797693134823157E308保存15-16位有效数据
注意:浮点数无法精确存放

3.基本数据类型转换

小转大自动转,大转小需强转 (窄化操作)

//小转大
byte b1 = 123;
long k1 = b1;
double k2 = k1;

//大转小
double d1 = 123.456;
long k1 = d1;//语法错误Type mismatch:cannot convert from double to long
long k2 = (long)d1;

强制类型转换的语法:(目标类型)变量
注意:Boolean类型和数值类型之间没有任何对应关系,所以进行强制类型转换会报语法错误

浮点数的特殊处理
针对浮点数系统默认的是double类型,所以123.456系统识别为double类型,但是变量f1声明为float,所以这里需要进行数据类型转换或者进行特殊声明

double d1 = 123.456
// long k1 = d1;
long k1 = (long)d1;//强制类型转换
System.out.println(k1);//使用强制类型转换可能会导致精度丢失问题

//针对浮点数的特殊处理
//float f1 = 123.456;语法报错,Type mismatch:cannot convert from double to float
float f1 = 123.456f; //d/F表示单精度浮点数、d/D表示双精度
float f2 = (float)123.456;

4.符合数据类型

符合数据类型包括:类class、接口interface、数组
特殊值null,在运行时并没有对应的类型,但是它可以被转换为任何复杂类型,表示没有存储数据,但是不能赋值给简单类型
注:复合类型的默认值就是null空指针

public class Test{
	public static void main(String[] args){
		Object b;//定义变量b为复合类型Object,Object类就是系统预定义
		//System.out.println(b);这里报错是因为要求临时变量必须先定义后使用,必须先赋初值后使用
		b = null;
		System.out.println(b);
	}
}

5.常量

常量就是值在程序执行的期间其值不能发生变化的数据

final double PI = 3.1415;
PI = PI + 1;//语法报错是因为final表示PI是常量,不允许修改
System.out.println(PI);

6.表达式

表达式就是运算符、操作数以及方法的调用序列,用来说明某个计算过程并返回计算结果
基本运算符可以分为:算术运算符、关系运算符、位运算符、条件运算符

  • 算术运算符:+ - * / % ++ –
  • 关系运算符:> >= < <= ==等值 !=不等于
  • 逻辑运算符:&&与运算,表示并且的关系;||或运算,表示或者的关系;!非运算,表示不是,中点在于计算过程中支持短路操作
  • 位运算:&与 |或 ^异或 ~按位取反 <<左移位 >>右移位 >>>,基本不做要求,位运算不支持短路操作
  • 赋值运算符:= += -= *= /= %=
  • 三目运算:(表达式1?表达式2:表达式3)

7.算术运算符

//+ - * /
//特殊:整除计算,参与计算的双方都是整数,则计算为整除计算,结果不会有小数部分
//例如:10/3=3,不是3.33333。如果是10./3返回值就是3.3333...,因为10.表示浮点数,不是整数

//%取余[取模]
//10%3 = 1实际上就是10除以3的余数

double k = 10.12;
System.out.println(k%3);//输出结果为1.12,小数部分不参与除法计算

//++和--是单目运算符
//i++计算结果等价于i=i+1,i--结果等价于i=i-1;

//有两种写法:以++为例,--写法实际相同
//i++是先获取i的值,然后针对i执行加1操作
int age = 99;
System.out.println(age++); //输出值为99
System.out.println(age); //没有任何运算符,但是输出值为100

//++i是先对i执行加1操作,然后再获取i存储的数据
int age1 = 99;
System.out.println(++age); //输出值为100,是因为先执行加1再获取数据
System.out.println(age);//100

8.关系运算符

用于判断两个数据之间的大小关系,计算结果就是boolean值,如果成立则返回true,否则返回false
>大于 <小于 >=大于等于 <=小于等于 ==等于 !=不等于

double d1 = 10;
System.out.println(d1>3);//返回true

===的区别:

  • k = 1; 这是一个赋值运算,将等号右边的计算结果赋值给等号左边的变量
  • k==100; 这是比较运算,判断k是否值为100,如果是则返回true,否则返回false
    由于浮点数无法精确存放,所以判断k==1.0写法是错误的,正确的写法应该是Math.abs(a-b)<1e-6

9.逻辑运算符


用于表达多个条件之间的关系,例如年龄大于18且年两小于65age > 18 && age < 65

&&与运算,表示并且

同真则真,其余为假
age > 18 && age < 65     age = 25由于两个条件同时成立,所以计算结果为真

||或运算,表示或者

同假则假,其余为真
age >18 || age <65     age = 125 由于age>18成立所以返回结果为true

!非运算,不是否则

非假则真,非真则假
//例如A&&B,如果条件A为false,这里不管B的值是true还是false,则计算结果一定是false,所以计算结果和B的值没有任何关系,所以执行真正计算时B并不执行,而是直接返回false,A||B如果条件A为true,则不需要计算B的结果,因为结果一定是true,计算结果和B的值没关系
int age = 100;
char cc = 'A';
System.out.println(cc + "--->" + (int)cc);
System.out.println('B' + "--->" + (int)'B');
if (cc >= 'B' && age++ < 200)//第一个表达式位false,所以第二个表达式必须进行计算
	System.out.println("这是一个输出语句!");
System.out.peintln(age);//或运算结果值为101,与运算结果值为100,因为与运算执行了短路操作

10.赋值运算符

= += -= *= /= %=
int k = 10;//将1- 赋值存储在k对应的存储单元中
k = k+3可以化简为k+=3,其他的运算符含义一致

short k = 3;
k = k + 3;//语法错误,因为k+3中的3被系统识别为int类型,所以计算结果自动转换为int,但是int类型不能直接复制给短整型的变量,这里代码可以修改为k = (short)(k+3)

short k = 3;
k += 3;//这里可以直接运行,不需要手工转换

结构化编程

自顶向下、逐步求精、模块化

条件分支语句

Java提供两种判断语句if和switch,这两种语句用于实现条件判断,当复合某些条件时执行某段代码,否则不执行
if语句

if (条件判断语句){//当条件成立时执行代码段1,否则执行代码段2
	代码段1;
}else{
	代码段2;
}
//if/else结构进行嵌套
if (条件1){
	代码段1;
}else if (条件2){
	代码段2;
}else if...{
	代码段n;
}else {
	代码段n+1;
}

Switch分支语句

switch(表达式){
	case 值1:  //计算表达式的值是否等于值1,如果相等执行代码块1
		代码块1;
	break;  //执行完毕后,如果没有break则继续向下执行,但是不做判断。如果没有break语句立即终止switch的执行,跳转到
	case 值2:
		代码块2;
	break;
	......
	default;  //当所有case都不能成立时,则执行代码块n
		代码块n;
	break;
}

1.要求:输入月份,显示对应的本月天数,1、3、5、7、8、10、12是31天,4、6、9、11是30天,2月闰年29天,平年28天,如果一个年份值可以被4整除,同时不能被100整除,或者能够被400整除就是闰年。

System.out.println("请输入月份");
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();//读取用户键盘录入的月份值
switch(month){
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		System.out.println("本月31天");
		break;
	case 2:
		System.out.println("请输入年份:")
		int year = sc.nextInt();
		if((year%4==0 && year%100!=0)||(year%400==0)){
			System.out.println("本月29天");
		}else
			System.out.println("本月28天");
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		System.out.println("本月30天");
	break;
	default:
		Syste,.out.println("月份输入错误!");
		break;
}
循环结构

while循环
while循环是Java最基本的循环语句,满足条件才执行循环体,如果不满足则不执行,所以有可能循环体执行多次,也可能一次都不执行

int count = 0;  //累加器,用于存放每次循环体的执行结果
int num = 1;  //控制循环次数
while(count<=100){
	count+=num++;  //
}
System.out.println("1+2+3+...+100="+count);

break和continue的区别
例题:

int res = 0;
int k = 0;
while(true){
	if (++k>100)
		break; //终止程序避免死循环
	fi (k%2==0)
		continue; //终止本次循环,直接进入下一次的循环,不会执行后续代码
	res+=k;
}
Syste,.out.println(res); //输出计算的结果
  • break: 是立即终止循环,跳出循环体执行后续代码
  • continue: 是终止本次循环体,进入下一次循环,循环并没有结束。

do/while循环结构
先执行一次循环体,然后惊醒条件判断,如果条件为true,则执行下次循环体;如果条件为false则终止循环。
与while的区别:do/while循环结构至少需要执行一次循环体。但是while循环有可能一次都不执行。

do{
	循环体;
}while(条件);

for循环结构
执行表达式1->执行表达式2->执行循环体->判断下次循环条件是都满足->执行表达式3

for (表达式1;表达式2;表达式3){
	循环体;
}
//例如:
for (int i;i < 10;i++){
	System.out.print(i + "\t");
}
//变换1
int res = 0;
int k = 1;
for (;k <= 100;k++){
	res+=k;
}
//变换2
int res = 0;
int k = 1;
for (;k <= 100;){
	res+=k++;
}
//变换3
int res = 0;
int k = 1;
for (;;){
	res+=k++;
	if (k>100)
		break;
}

三种循环体的建议使用场景

  • for循环一般用于可以明确循环次数的场景中;
  • while循环体一般用于不能明确指导执行次数的场景中;
  • do/while循环一般用于不能预先明确循环次数,但是同时要求循环体至少执行一次的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值