1Java语言概述和基本语法
Java语言概述和基本语法
1 java语言特点:面向对象,健壮性,跨平台性
2 java两种核心机制:java虚拟机,垃圾收集机制
java虚拟机:JVM是一个虚拟的计算机,具有指令集并使用不同 的存储区域,负责 执行指令,管理数据,内存,寄存器。
对于不同平台有不同的虚拟机
虚拟机屏蔽了底层运行平台的差别,实现了一次编译,到处运行
垃圾回收:提供了一种系统级线程跟踪存储空间的分配情况,在JVM空闲时,检 查并释放那些可被释放的存储空间。
3 JRE (java runtime environment java运行环境 )包含java虚拟机和java程序所需的核心类库
JD K(java development kit java 开发工具包)包含了java的开发工具(编译工具javac.exe和打包工具jar.exe),也包括了JRE
4 开发体验:将java代码编写到扩展名为.java的文件中;通过javac命令对该Java文件进行编译;通过java命令对生成的class文件进行运行
5 java三种注释:单行注释,多行注释,文档注释
单行注释://
多行注释:/* */ 以上两个注释了的内容不参与编译,即.class结尾的字节码文件中不包括注释内容
文档注释(java特有):注释内容可以被JDK提供的工具javadoc解析,生成一套以网页文件形式体现的该程序的说明文档
/**
@author 指定java程序的作者
@version 指定源文件的版本
*/
6 标识符,命名规则,命名规范
标识符:凡是自己可以起名字的地方
命名规则:
- 26个英文字母 0-9 _ $
- 数字不能开头
- 不可以使用关键字和保留字 但是可以包含关键字和保留字
- 严格区分大小写 长度无限
- 不能包括空格
命名规范:
- 包名:多单词组成字母都小写
- 类名,接口名:首字母大写XxxYyy
- 变量名,方法名:第一个单词首字母小写,其他单词首字母大写
- 常量名:所有字母大写且中间用下划线连接
7 变量的使用
说明:
- 变量必须先声明赋值 后使用
- 变量出了作用域就失效了
- 同一个作用域内 不能有两个同名的变量
java数据类型:
基本数据类型:
- 整数(byte,short,int,long)
- 浮点类型(float double)
- 字符型(char)
- 布尔型(boolean)
引用数据类型:
-
类(class)
-
接口(interface)
-
数组(array)
int myAge=12; System.out.println(myAge); // 声明long变量必须以小写l或大写L结尾 long l1=2312321312L; System.out.println(l1); // 通常定义整型变量用int型 // byte1字节 short2字节 int4字节 long8字节 // float4字节 double8字节 float 表示数值范围比long还大 // 定义float后面必须以f或F结尾 // 一个字符2个字节 char c1='d' char c2='范'都行 // 也可以声明转义字符 char c5='\n' // 直接使用unicode char c6='\n0043' // boolean只能取两个之一:true false
8 8种基本数据运算规则
前提:不包含boolean 只有前面7种
8.1自动类型提升
byte、char、short-> int-> long-> float-> double
当容量小的数据类型变量和大的数据类型变量做运算时,结果自动提升为容量大的类型
容量小和大表示这个类型表示数的大和小 不是占字节的大小 所以float比long大
特别:当byte chat short三种类型做运算时 结果为int类型 其中也包括同等类型 byte+byte还是用int来接收
8.2强制类型转换
自动类型提升逆运算,需要使用强转符
可能导致精度损失
byte b1=2;
int i1=12;
int i2=b1+i1;
// 也可以用long来接收 不能用byte接收,也可以用float接收
double d1=12.3;
int i3=(int)d1;
System.out.println(i3);
long l=123123;
// 不会报错 自动转换为int
// long l1=1231232132323123213213213;
// 会报错 一定要加L
// float=12.3;
// 一定会报错 一定要加f
// 整型常量默认是int 浮点型常量默认是double
// 所以float f1=b+12.3会编译错误
9 string基本使用
string属于引用类型
String s=""可以 但char c=""不可以
String可以和8种基本数据类型做运算 且运算只能是连接运算
10 进制
int num1=0b110;//二进制
int num2=110;
int num3=0127;//八进制
int num4=0x110A;//十六进制
System.out.println(num1);//6
System.out.println(num2);//110
System.out.println(num3);//87
System.out.println(num4);//4362
11 运算符
/*
算符运算符: + - * / % 前++ 后++ +
比较运算符
+ - * / 只能适用在数值类型的数据之间
== !=不仅可以在数值类型数据之间,还可以使用在其他引用类型变量之间
*/
int num1=12;
int num2=5;
int result =num1/num2;//结果为2
double result2=num1*1.0/num2;
System.out.println(result2); //2.4
//%结果符号和被模数的符号相同
//前++先自增1 然后运算 后++先运算再自增1
//自增1不会改变本身变量的数据类型
//赋值
int ii3=10,jj3=10;//也可以
short s1=10;
//s1=s1+2编译失败
//但是s1+=2可以通过,不会改变s1的类型
//区分& &&
//& 和&&运算结果相同 当符号左边为true 二者都会执行右边的运算
//当符号左边是false。&会继续执行符号右边的运算
boolean b1=false;
int num1=10;
if(b1 & (num1++>0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num1: "+num1);
//我现在在南京 num1:11
boolean b2=false;
int num2=10;
if(b2 && (num2++>0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num2: "+num2);
//我现在在南京 num1:10
// | ||
// 和上面类似 当符号左边是true时 |还会执行右边的运算
//开发中一般选&& ||
/*
位运算符
操作的都是整形的数据
<<在一定范围内,每向左移1位 相当于*2
>>在一定范围内,每向右移1位 相当于/2
正数负数都是这样
面试题:最高效的2*8 2<<3
*/
/*
三元运算符
(条件表达式)? 表达式1:表达式2
条件表达式结果为boolean类型 根据真假决定是表达1还是2
表达式1和表达式2要求是一致的 能够统一成一个类型
表达式中可以嵌套
凡是可以用三元运算符的地方 都可以改成if else
但反之不成立
如果两者都可以用 优先使用三元 因为效率更高
*/
12 scanner 类用法
导包import java.util.Scanner;
Scanner的实例化 Scanner scan=new Scanner(System.in);
调用Scanner类的相关方法,来获取指定类型的变量
Scanner scan=new Scanner(System.in);
System.out.println("请输入你的姓名");
String name=scan.next();
System.out.println(name);
System.out.println("请输入你的年龄");
int age=scan.nextInt();
System.out.println(age);
System.out.println("请输入你的体重");
double weight=scan.nextDouble();
System.out.println(weight);
System.out.println("你是否相中我了呢?(true/false)");
boolean isLove=scan.nextBoolean();
System.out.println(isLove);
//对于char型 Scanner没有相关方法 只能获取一个字符串
System.out.println("请输入你的性别:(男/女)");
String gender=scan.next();
char genderChar=gender.charAt(0);
System.out.println(genderChar);
//输入数据和要求数据不匹配时 会报一个异常 程序终止
13 随机数
/*
Math.random()返回一个double [0.0,1.0)
*/
public class Fao14SuiJiShu {
public static void main(String[] args){
int value=(int)Math.random()*90+10; //[10,99]
//公式 [a,b] (int)(Math.random()*(b-a+1)+a)
}
}
14 分支结构
/*
else结构是可选的
针对于条件表达式:
如果多个条件表达式之间是互斥关系,哪个判断写在上面或写在下面都无所谓
如果多个条件表达式有交集,应该根据实际情况考虑应该将哪个结构声明在上面
如果多个条件表达式之间有包含关系 通常情况下需要将范围小的声明在防范围大的上面
if-else结构是可以相互嵌套的
如果执行语句中只有一行时 可以省略{}但不建议
*/
/*
switch-case
switch(表达式){
case 常量1:
balabala;
//break;
case 常量2:
。。。
default:
balabala;
根据switch表达式中的值 依次匹配各个case中的常量 一旦匹配成功 就进入相应case中语句
当调用完执行语句后 则任然继续向下执行其他case中语句 直到遇到break 或者遇到末尾结束
break 关键字表示一旦执行到此 就跳出switch case结构
switch中的表达式只能是如下六中数据类型之一:byte short char int 枚举 String
case之后只能声明常量 不能声明范围
default 关键字是可选的 而且位置是灵活的 但一般都是写在最后的
break关键字是可选的
如果case 中语句相同可以进行合并
说明:
凡是可以使用switch结构都可以使用if else但反之不成立
若两者都可以用 且case相对简单 优先使用case 执行效率稍高
*/
15循环
/*
循环4要素
1初始化条件
2循环条件 boolean类型
3循环体
4迭代条件
for(1;2;4){
3
}
/*
循环4要素
1初始化条件
2循环条件 boolean类型
3循环体
4迭代条件
1
while(2){
3
4
}
千万小心不要丢了迭代条件
写程序避免出现死循环
for和while相互转换
不在循环条件限制次数:while(true) 或者for(;;)
结束循环几种方式:
循环条件部分返回false
循环体中执行break
*/
/*
循环4要素
1初始化条件
2循环条件 boolean类型
3循环体
4迭代条件
1
do{
3
4
}while(2)
do while至少执行一次循环体
开发中用for和while多一点
嵌套循环:将一个循环结构放在另一个循环结构中
假设外层循环m次 内存循环n次 则内存循环体一共执行m*n次
技巧 外层循环控制行数 内层控制列数
*/
//获取100以内的所有素数
long start=System.currentTimeMillis();//获取一开始毫秒数
boolean isFlag=true;
for(int i=2;i<=100;i++){
for(int j=2;j<=Math.sqrt(i);j++){//优化二
if(i%j ==0){
isFlag=false;
break;//优化一
}
}
if(isFlag==true){
System.out.println(i);
}
isFlag=true;
}
long end=System.currentTimeMillis();//结束
System.out.println("花费时间为:"+(end-start));
/*
break和continue关键字使用
使用范围 循环中使用区别
break: switch-case/循环 结束当前循环
continue: 循环 结束当次循环
*/
public class Fao19BreakContinue {
public static void main(String[] args){
lable:for(int i=1;i<=4;i++){
for(int j=1;j<=10;j++){
if(j%4==0){
//break;默认跳出包裹关键字最近的一层循环
//continue; 也是如此
break lable;//结束指定标识的一层循环结构
}
System.out.print(j);
}
System.out.println();
}
}
}