JDK与JRE和JVM的区别、API、数据类型---2
目录JDK与JRE和JVM的区别API上面目前阶段只需了解,下面是必掌握的重点:java的数据类型1.JDK与JRE和JVM的区别(资料来自马士兵教育笔记)JDK,JRE,JVM的关系:(此图是重点)先说JDK和JRE:初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Ru
目录
上面目前阶段只需了解,下面是必掌握的重点:
注:(资料来自马士兵教育笔记)
1.JDK与JRE和JVM的区别
JDK,JRE,JVM的关系:(此图是重点)
先说JDK和JRE:
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Enviroment)是Java的运行环境,JVM( java virtual machine)也就是常常听到Java虚拟机。JDK是面向开发者的,JRE是面向使用JAVA程序的用户,上面只是简单的区别
通过上图发现发现有两个JRE文件夹,如果细看里面的内容基本上是一样的,如果是只是Java程序使用者,那么只会有最外层的那个JRE目录,JDK中是JRE自带的,你如果安装了JDK必然里面会有一个JRE.那么问题来了,为什么会有两套JRE呢?
从侧面证明:
利用javac.exe进行编译:
然后我将C:\Program Files\Java\jdk1.8.0_151\lib\tools.jar改个名字,再去编译:
证明:dt.jar和tools.jar是两个java最基本的包,里面包含了从java最重要的lang包到各种高级功能如可视化的swing包,是java必不可少的。而path下面的bin里面都是java的可执行的编译器及其工具,如java,javadoc等,报错的原因就是输入的javac的命令不是去JDK中bin目录去找的javac.exe,而是去JDK中lib目录中的tools.jar中com.sun.tools.javac.Main中执行,因此javac.exe只是一个包装器(Wrapper),存在的目的是为了让开发者免于输入过长的指命。这个时候发现JDK里的工具几乎是用Java所编写,同属于Java应用程序,因此要使用JDK所附的工具来开发Java程序,所以自身需要附一套JRE才能运行。上图中与jdk同级目录下的JRE就是用来运行一般Java程序用的。
两套JRE运行的时候究竟运行哪一个呢,这个时候JDK中java.exe先从自身目录中找,然后父级目录中找,如果都没有就去注册表中找
再说JRE和JVM:
JVM – java virtual machineJVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,class文件并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行,类似于C#中的CLR。
JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JVM+Lib=JRE,如果讲的具体点就是bin目录下的jvm.dll文件, jvm.dll无法单独工作,当jvm.dll启动后,会使用explicit的方法(就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库),而这些辅助用的动态链接库(.dll)都必须位 于jvm.dll所在目录的父目录之中。因此想使用哪个JVM,只需要设置PATH,指向JRE所在目录下的jvm.dll。
2.API
- JDK帮助文档
- SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。
- JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。
- JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料
- 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。
- 注:API手册需要请联系我,不仅只有java的。
3.java的数据类型
-
标识符
【1】标识符:读音 biao zhi fu
【2】什么是标识符?
包,类,变量,方法…等等,只要是起名字的地方,那个名字就是标识符
【3】标识符定义规则:
1.四个可以(组成部分):数字,字母,下划线_,美元符号$
注意:字母概念比较宽泛,指的是英文字母,汉字,日语,俄语…
但是我们一般起名字尽量使用英文字母
2.两个不可以:不可以以数字开头,不可以使用java中的关键字
3.见名知意:增加可读性
4.大小写敏感: int a ; int A;
5.遵照驼峰命名:
类名:首字母大写,其余遵循驼峰命名
方法名,变量名:首字母小写,其余遵循驼峰命名
包名:全部小写,不遵循驼峰命名
6.长度无限制,但是不建议太长 asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasfd -
关键字
关键字:被JAVA语言赋予了特殊含义,用作专门用途的单词
特点:JAVA中所有关键字都为小写
官网:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
这个不需要死记硬背,在以后的编程中会慢慢熟悉的 -
变量和常量(理解即可)
举例:
丽丽的年龄:去年17岁,今年18岁,明年19岁
年龄:17–》18—》19 --》值不断变化年龄—》变量
常量: 17 , 18 , 19 ----》 常量中的字面常量 -
字面常量(理解即可)
常量分为两种:
常量通常指的是一个固定的值,例如:1、2、3、’a’、’b’、true、false、”helloWorld”等。
在Java语言中,主要是利用关键字final来定义一个常量。 常量一旦被初始化后不能再更改其值。
为了更好的区分和表述,一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量,而使用final修饰的PI等称为符号常量(字符常量)。 -
字面常量的类型:
注意:逻辑常量就两个值,一个是true,一个是false
-
变量的声明格式:
数据类型 变量名 [=初始值] [,变量名 [=初始值]…];
案例:
int age = 19 , age2 = 90 ;
int age,age2; -
变量的声明:
- 重点一是局部变量必须赋初始值(写在方法中的变量,范围也在方法中)。
- 重点二是全局变量可以不赋初始值(写在类中,范围在类中,类中所有方法都可以调用)
- 重点三就是全局变量也叫成员变量,又分为实例变量和类变量两种,后者被static修饰,且不能被非static修饰的方法调用。
基本数据类型
返回目录
Java是一种强类型语言,每个变量都必须声明其数据类型。
Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。
整型数据类型:
比如:byte的右侧表数范围127怎么算出来的?
byte: 1字节 = 8位
二进制:01111111
12^6 + 12^5 + 12^4 + 12^3 + 12^2 + 12^1 + 1*2^0
= 64 + 32 + 16 +8 +4 + 2 +1
= 127
public class Test{
public static void main(String[] args){
//定义整数类型的变量:
//给变量赋值的时候,值可以为不同进制的:
int num1 = 12 ;//默认情况下赋值就是十进制的情况
System.out.println(num1);
int num2 = 012;//前面加上0,这个值就是八进制的
System.out.println(num2);
int num3 = 0x12;//前面加上0x或者0X,这个值就是十六进制的
System.out.println(num3);
int num4 = 0b10;//前面加上0x或者0B,这个值就是二进制的
System.out.println(num4);
//定义byte类型的变量:
byte b = 126;//定义了一个byte类型的变量,名字叫b,赋值为12
System.out.println(b);
//注意:超范围的赋值会报错。
short s = 30000;
System.out.println(s);
int i = 1234;
System.out.println(i);
//整数类型默认就是int类型的,所以12345678910是一个int类型的数,对于int类型来说,它超出范围了
//要想把一个数给long类型变量,那么后面加上L(推荐)或者l就可以了
long num5 = 12345678910L;
System.out.println(num5);
//注意:只有这个数超出int类型的范围了后面才需要加上L,否则无需加L也可以赋值给long类型:
long num6 = 12;
System.out.println(num6);
}
}
浮点类型
1. 浮点类型常量:
(1)十进制数形式,例如:
3.14 314.0 0.314
(2)科学记数法形式,如
314e2 314E2 (E的大小写没有区分) 314E-2
double f = 314e2; //31410^2–>31400.0
double f2 = 314e-2; //31410^(-2)–>3.14
2. 浮点类型变量:
- float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。
- 而double表示这种类型的数值精度约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。
- float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。
- 也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
public class Test{
public static void main(String[] args){
//浮点类型的常量有两种形式:
//十进制形式:
double num1 = 3.14;
System.out.println(num1);
//科学计数法形式:
double num2 = 314E-2;
System.out.println(num2);
//浮点类型的变量:
//注意:浮点型默认是double类型的,要想将一个double类型的数赋给float类型,必须后面加上F或者f
float f1 = 3.14234567898623F;
System.out.println(f1);
//注意:double类型后面可以加D或者d,但是一般我们都省略不写
double d1 = 3.14234567898623D;
System.out.println(d1);
//注意:我们最好不要进行浮点类型的比较:
float f2 = 0.3F;
double d2 = 0.3;
System.out.println(f2==d2);
/*
区别:
= 赋值运算: 将等号右侧的值赋给等号左侧
== 判断==左右两侧的值是否相等 :结果要么相等 要么不相等
==运算符的结果就是要么是true,要么是false
*/
}
}
3.字符类型:
【1】Java中使用单引号来表示字符常量。
char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,它占2个字节,可允许有65536个字符。
【2】转义字符:
【3】ASCII表:
【4】Unicode编码表:
https://www.cnblogs.com/csguo/p/7401874.html
代码展示1
public class Test{
public static void main(String[] args){
//定义字符类型的变量:
char ch1 = 'a';
System.out.println(ch1);
char ch2 = 'A';
System.out.println(ch2);
char ch3 = '4';
System.out.println(ch3);
char ch4 = '中';
System.out.println(ch4);
char ch5 = '?';
System.out.println(ch5);
//java中无论:字母,数字,符号,中文都是字符类型的常量,都占用2个字节。
char ch6 = ' ';
System.out.println(ch6);
//字符类型:单引号引起来的单个字符
System.out.println("--------------------------------");
/*
转义字符:
\将后面的普通字符转换为特殊含义
*/
char ch7 = '\n';
System.out.println("aaa"+ch7+"bbb");
System.out.println("aaa\nbbb");// \n 换行
System.out.println("aaaaaaa\tbbb"); // \t 制表符
System.out.println("aaa\bbbb");//aabbb \b 向前退一格
System.out.println("aaa\rbbb");//bbb \r 将光标到本行开头 :回车
System.out.println("\"java\""); // \" 将双引号原样输出 \' 将单引号原样输出 \\ 将\原样输出
}
}
代码2:
public class Test{
public static void main(String[] args){
char ch1 = 'A';
System.out.println(ch1);//A
System.out.println(ch1+90);//155
System.out.println(155-ch1);//90
//char类型我们看到的样子就是它本身的字面常量,但是底层在进行计算的时候,实际上是按照一个码进行计算的。
//这个码就是ASCII
//之前说char类型是按照Unicode码表进行存储的 (Unicode兼容了ASCII码,Unicode的前128位置ASCII)
char ch2 = '中';
System.out.println(ch2);// 中
System.out.println(ch2+90);// 20103
System.out.println(20103-ch2);// 90
//转换:
int num1 = (int)ch2;
System.out.println(num1);//20013
char ch = (char)20013;
System.out.println(ch);
int num2 = '中';
char ch5 = 20013;
System.out.println(ch5);
//面试题:
char ch6 = '2'+2;
System.out.println(ch6);//'4'--->4
}
}
什么是编码?
- 最常用的编码为GBK和UTF-8。常用的字符集为ASCLL和Unicode。
拓展: - eclipse默认编码和计算机编码(DOS命令)相同为GBK。一个字符占两个字节。
- Intellj IDEA默认编码为UTF-8,一个字符占三个字节。
- 当使用不同的编辑器展示同一份代码的时候需要转换编码,否则会出现中文乱码问题。
4. 布尔类型
boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。 boolean 类型用来判断逻辑条件,一般用于程序流程控制 。
这与C语言不同,java的boolean是包装了C语言的bool类型的
代码展示:
public class TestVar09{
public static void main(String[] args){
//创建一个布尔类型的变量:
boolean flag1 = true;
System.out.println(flag1);
boolean flag2 = false;
System.out.println(flag2);
boolean flag3 = 5==9;
System.out.println(flag3);
boolean flag4 = 5<9;
System.out.println(flag4);
}
}
5. 基本数据类型的转换
【1】什么是类型转换:
在赋值运算或者算数运算的时候,要求数据类型一致,就要进行类型的转换。
【2】类型转换的种类:
自动转换,强制转换
public class TestVar10{
public static void main(String[] args){
//类型转换的两种形式:
double d = 6;//int-->double 自动类型转换
System.out.println(d);
int i = (int)6.5;//double--->int 强制类型转换 (强转)
System.out.println(i);
//在同一个表达式中,有多个数据类型的时候,应该如何处理:
//多种数据类型参与运算的时候,整数类型,浮点类型,字符类型都可以参与运算,唯独布尔类型不可以参与运算。
//double d2 = 12+1294L+8.5F+3.81+'a'+true;
double d2 = 12+1294L+8.5F+3.81+'a';
System.out.println(d2);
/*
类型级别:(从低到高的)
byte,short,char-->int--->long--->float--->double
级别用来做什么?当一个表达式中有多种数据类型的时候,要找出当前表达式中级别最高的那个类型,然后
其余的类型都转换为当前表达式中级别最高的类型进行计算。
double d2 = 12+1294L+8.5F+3.81+'a';
= 12.0+1294.0+8.5+3.81+97.0
*/
int i2 = (int)(12+1294L+8.5F+3.81+'a');
System.out.println(i2);
/*
在进行运算的时候:
左=右 : 直接赋值
左<右 :强转
左>右 :直接自动转换
*/
//以下情况属于特殊情形:对于byte,short,char类型来说,只要在他们的表数范围中,赋值的时候就不需要进行
//强转了直接赋值即可。
byte b = 12;
System.out.println(b);
byte b2 = (byte)270;
System.out.println(b2);
}
}
特别的说明:4.999转换为int类型后是4。(数据类型类比于不同类型的盒子,数据就类比于蛋糕,盒子大中装的蛋糕放到小盒子肯定要损失数据)
如果想四舍五入转:可以让被转数加0.5后再转。
final、字符常量、Scanner的使用引入
import java.util.Scanner;//形象理解:在java.util下将Scanner拿过来用
public class TestVar11{
public static void main(String[] args){
//实现功能:求圆的周长和面积
//【1】提取变量:提取变量,就是为了一劳永逸,以后只要改变变量的值,下面只要用到这个变量的地方,取值也都发生变化了
//【2】一个变量被final修饰,这个变量就变成了一个常量,这个常量的值就不可变了
// 这个常量就是我们所说的 字符常量 ---》pi
// 约定俗成的规定:字符常量的名字全部大写
//【3】使用扫描器:Scanner的使用--》注意通过形象的理解去使用
final double PI = 3.14;
//拿来一个扫描器:
Scanner sc = new Scanner(System.in);
//给一个友好性的提示:
System.out.print("请录入一个半径:");
//让扫描器扫描键盘录入的int类型的数据:
int r = sc.nextInt();
//求周长:
double c = 2*PI*r;
System.out.println("周长为:"+c);
//求面积:
//PI = 9.29;报错:TestVar11.java:12: 错误: 无法为最终变量pi分配值
double s = PI*r*r;
System.out.println("面积为:"+s);
}
}
加深对Scanner的使用
import java.util.Scanner;
public class TestVar12{
public static void main(String[] args){
//键盘录入学生的信息:年龄,身高,姓名,性别:
//键盘录入年龄:(接收int类型数据)
Scanner sc = new Scanner(System.in);
System.out.print("请录入年龄:");
int age = sc.nextInt();
//键盘录入身高:(接收double类型数据)
System.out.print("请录入身高:");
double height = sc.nextDouble();
//键盘录入姓名:(接收String类型数据--》字符串)
System.out.print("请录入姓名:");
String name = sc.next();
//键盘录入性别:(接受char类型)
System.out.print("请录入性别:");
String sexStr = sc.next();
char sex = sexStr.charAt(0);
//上面两句可以合为一句表示:char sex = sc.next().charAt(0);
System.out.println("该学生的信息为:姓名是:"+name+",年龄是:"+age+",身高为:"+height+",性别是:"+sex);
}
}
更多推荐
所有评论(0)