计算机语言发展史
java之父:詹姆斯•高斯林(james gosling)
java语言平台版本
javase — standard edition—标准版/基础版
定位于个人计算机上的应用,这个版本是java平台的核心,他提供非常丰富的api来开发一般个人计算机上的应用程序,包括用户界面接口awt及swing,网络功能与国际化,图像处理能力以及输出支持等,在上个世纪90年代末互联网上大放异彩的applet也属于这个版本。applet后来被flash取代,flash即将被html5取代
javaee — enterprise edition— 企业版/商务版
定位在服务端的应用,javaee是javase的扩展,增加用于服务器开发的类库。如:jdbc是让程序员直接在java内使用的sql语法来访问数据库的数据,servlet能够延申服务器的功能,通过请求-响应的模式来处理客户端的请求;jsp是一种可以将java程序代码内嵌在网页上的技术
javame — micro edition — 微型版/移动版
定位在消费性能电子产品的应用上,javame是javase的内申,包含javase的一部分核心类,也有自己的扩展类,增加了适合微小装置的类库:javax.microedition.io.*等。该版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型的产品能够增加支持的能力
三种java版本之间的关系
java语言特性:简单性、安全性、面向对象、高性能、编译性、解释性、分布式处理、健壮性、开源、跨平台
三者关系图解
三者关系:jdk>jre>jvm(三者是包含关系)
jdk、jre、jvm解释:
- jdk:java development kit(java开发工具套件)
- jre:java runtime environment(java运行环境)
- jvm:java virtual machine(java虚拟机)
jdk、jre、jvm作用
- jdk:jdk是java语言软件开发工具包,主要用于移动设备,嵌入式设备上的java应用程序,编写java必须使用jdk,他提供编译和运行java程序的环境,是整个java开发的核心
- jre:java运行的环境
- jvm:将字节码文件翻译成当前平台认识的可执行文件格式
由上面观之java跨平台前提:安装对应的jvm
java是一门解释性的语言:jvm将字节码文件一行一行的解释为当前操作系统可执行文件格式。
注意:编译后产生的可执行文件可以在对应的平台上运行(一般vs2019包含编译器与链接器)
- java的字节码文件是和平台无关的,拿着这个字节码文件到不同的平台上去运行
- c语言不同的平台有不同的编译器,编译器与平台相关的,编译后的可执行文件也和平台相关
注意:c语言相对java来说效率高,因为他产生的可执行文件可以直接在平台上运行,不用解释和翻译
- 源文件:.java文件
- 字节码文件:.class文件
- 编译环节所对应的文件:javac.exe
- 运行环节所对应的文件:java.exe
.java文件运行原理
.java文件(javac.exe)=>.class文件(java.exe)=>jvm运行.class得到结果
注释的作用
- 屏蔽代码
- 解释说明
注释分类
注释名称 | 注释内容 |
单行注释 | // |
多行注释 | /*……*/ |
文档注释 | /**……*/ |
注意:
- 多行注释内容不能用于生成一个开发者文档,而使用文档注释内容可以生成一个开发者文档
- 一般文档注释可以配合jdk提供的工具javadoc.exe来一起使用,通过javadoc.exe可以对文档注释进行解析,生成一套网页文件形式体现该程序的说明文档
- 如果一个类需要使用javadoc工具生成一个软件开发者文档,那么该类必须经过public修饰
- 文档注释注释的内容一般都是位于类或方法上面的
定义
标识符:标识符可以简单的理解成一个名字。
在java中,我们需要给代码中的很多元素起名,包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符
标识符原则
- 标识符可以由字母、数字、下划线(_)、美元符($)组成,但不能包含 @、%、空格等其它特殊字符
- 不能以数字开头。
- 标识符严格区分大小写。
- 要做到见名知意。
- 标识符不能是java的关键字
注意:除了上述的50个关键字以外,true,false,null也不可以被用作标识符
关于标识符细节
- 类名:首字母大写,其余遵循驼峰命名
- 方法名:首字母小写,其余遵循驼峰命名
- 包名:全部小写,不遵循驼峰命名
变量:数据的值是不固定的,总在变的量
语法:变量类型 变量名 = 变量值 ;
定义变量的两种格式:
//声明变量时赋值
int num=18;
//先声明变量,再赋值
string str; str="hello world";
注意:
- 变量名必须是一个有效的标识符
- 变量名不能重复
- 声明变量前要定义类型
- 变量的值可以更改
变量的使用原则:就近原则(离自己最近的变量会生效)
变量本质上是在内存中申请一块内存空间(申请内存空间的大小取决于变量的类型),这块内存空间用变量名来表示,而这块内存里存储的是变量的值
final关键字
final double a=34;
double b=78;
system.out.println(a "\t" b);
b=67;//成功
a=45;//报错
注意:一个变量被final修饰,那么这个变量就变成了常量,必须提前赋值,并且这里的值便不可修改
变量分类
局部变量
位置:定义在方法里或者方法的声明上
注意:必须手动初始化来分配内存.如:int i = 5;或者int i; i = 5;作用域:整个方法的内部
生命周期:随着方法的调用而存在,方法运行完毕就释放了
全局变量
位置:定义在类里方法外
注意:不用初始化,也会自动被初始化成默认值作用域:整个类的内部
生命周期:整个类中,类消失了,成员变量才会释放
成员变量和局部变量的区别
常量:在程序运行过程中,值一直不会改变的量成为常量。
常量分类
类型 | 默认值 |
整数型 | 0 |
浮点型 | 0.0 |
字符型 | '\u0000'(空格) |
布尔型 | false |
引用类型 | null |
- 我们只要写一个整数,就默认是int类型
- 我们只要写一个小数,就默认是double类型
- byte,short,char三种比int小的整数可以用范围内的值直接赋值
- 加了字面值后缀就表示此值是特定的类型
- 字面值后缀l——long、 d——double、f——float
- 浮点数类型不同,不要做值的比较
int a=123456789012;//报错,因为超过int范围。不能放入a内存
long a1=123456789012;//报错,因为123456789012为int类型,而此值超过int类型范围
long a2=123456789012l;//正确,告诉了此值为long类型并且符和long类型范围,并且可以放入long内存
long a3=12;//正确,说明此值为int类型可以放入long类型内存
float nu3=3.14;//报错,因为3,14为double类型
float nu4=3.14f;//正确
- 0b - 标识这是2进制 ,如:0b11
- 0 - 标识这是8进制, 8进制是三位,如: 023
- 0x - 标识这是16进制,如: 0x0001
//默认10进制
int a1=12;
//16进制
int a2=0x10;
//二进制
int a3=0b11;
- 十进制形式:3.14,314.0
- 科学计数法形式: 314e2,314e-2(e大写小写都可以)
//十进制形式
double num1=3.14;
//科学计数法象时
double num2=314e-2;
system.out.println(num1 "\t" num2);
字符常量: java中使用单引号来表示字符常量
注意:
- 字符在内存中占两个字节
- char类型用来表示在unicode编码中的字符,unicode编码被设计用来处理各种语言的文字,他表示两个字节,可允许有65536个字符
- char类型保存的是该字符的ascii码值,但是显示的是对应的字符
转义字符
char c='h';
char c1='\n';
char c2='i';
//以字符的形式打印
system.out.println(c);
//不用拼接,因为多个char类型运算时会整型提升
system.out.format("%c%c", c,c2);
定义:除了基本类型以外的所有类型都是引用类型
注意:引用类型是一个对象类型,它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。如:类,接口,数组
注意:箭头开始的地方是小类型(容量小的类型),箭头指向的地方是大类型(这里的"大"和"小",指的是对应类型的取值范围,不是字节数)
转换规则
隐式转换:小类型到大类型直接转
byte m = 120;
int n = m;//小转大,右面的m是小类型,给左面的n大类型赋值,可以直接使用
float f = 3.2f; double d = f; //-->可以执行
显示转换:大转小强制转,浮变整,小数没
double a=3.2;
int b=(int)a;
system.out.println(b);//b=3
注意:不能对boolean类型进行类型转换,并且boolean也不可以参与运算。
1.计算结果的数据类型,与最大数据类型一致
2.byte,short,char三种比int小的整数,运算时会先自动转换成int
byte a=3;
byte b=5;
byte c=(byte)(a b);//a b会自动提升为int
system.out.println(c);//c=8
3.整数运算溢出
4.浮点数运算不精确——后面有解决办法
5.浮点数的特殊值
infinity 无穷大 3.14/0
nan not a number 0/0.0 或 0.0/0
import java.util.scanner;
public class hello {
//main主方法——程序的入口
public static void main(string[] args) {
//获取当前时间——返回值为时间戳
long l = system.currenttimemillis();
//获取扫描器
scanner sc=new scanner(system.in);
//让扫描器扫描键盘输入int类型的数据
int i = sc.nextint();
//让扫描器扫描键盘输入string类型的数据
string s = new scanner(system.in).nextline();
//输出后换行
system.out.println("时间为" l);
//输出后以\n换行
system.out.print("\n");
//以特定格式输出
system.out.format("%d--%s", i,s);
}
}
前言
运算符:用于连接 表达式的操作数,并对操作数执行运算的符号。
运算符类型:
算术运算符、位运算符、比较运算符、逻辑运算符、三目运算符、赋值运算符。
根据操作数来分类
- 单目运算符:只有一个操作数的运算符
- 双目运算符:有两个操作数的运算符
- 三目运算符:有三个操作数的运算符
算数运算符
自增自减运算符
i i先参与运算 i=i 1
i i=i 1 i参与运算
号的作用
- 表示正数
- 表示相加操作
- 字符串的拼接
注意:左右两侧的任意一侧有字符串,那么就是字符串拼接;结果就为字符串
system.out.println( 5);//5
system.out.println(5 6);//11
system.out.println(5 '6');//59——整形提升
system.out.println(5 6 "7");//117
system.out.println("hello" 888);//hello888
位运算符
逻辑运算符与位运算符(&、|、^)
- 逻辑运算符:左右连接的是布尔类型的操作数
- 位运算符:左右连接的是具体的数值
按位运算
- &:同1为1
- |:有1为1
- ^:相同为0,相异为1
- ~:对一个二进制数按位取反
- <<:算数左移:移位过程左边舍弃,右边补零
- >>:算数右移:移位过程右边丢弃,左边补符号位
- <<<:逻辑左移:移位过程左边舍弃,右边补零
- >>>:逻辑右移:移位过程右边丢弃,左边补零
比较运算符
逻辑运算符
逻辑异或(^):相同为假,相异为真
短路与:&&
只要第一个操作数为false那么整个结果就为false,第二个操作数根本不用算(前提第一个为false)
短路或:||
只要第一个操作数为true那么结果就为true,第二个操作数根本不用算(前提第一个为true)
注意:短路与或短路或相对于逻辑与或逻辑或效率更高
逻辑运算符实验
//&运算
system.out.println(true&true);//true
system.out.println(true&false);//false
system.out.println(false&false);//false
//|运算
system.out.println(true|true);//true
system.out.println(true|false);//true
system.out.println(false|false);//false
//!运算
system.out.println(!true);//false
system.out.println(!false);//true
//异或^运算——同为假,异为真
system.out.println(true^true);//false
system.out.println(true^false);//true
system.out.println(false^false);//false
三目运算符
语法:exp1?exp2:exp3
注意:如果表达式1结果为true那么整个式子的结果就是表达式2的结果,否则是表达式3的结果
int num=(5<7)?1:0;
system.out.println(num);//1
赋值运算符
a =b和a=a b的区别
- a =b:可读性稍差,编译效率高,底层自动进行类型转换
- a=a b:可读性好,编译效率低,手动进行类型转换
byte a=10;
int b=20;
a =b;//不报错
a=(byte)(a b);
优先级控制
当一个表达式包含多个运算符时,就需要考虑运算符的优先级,优先级高的运算符先参与运算,优先级低的运算符后参与运算。在实际的开发中,不需要特别去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号辅助进行优先级管理。