昨日内容复习
1.jdk,jre,jvm的关系
jdk > jre > jvm 1.三者联系: JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。 2.三者区别: a.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。 b.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。 原文链接:https://blog.csdn.net/ancientear/article/details/79483592
2.编写输出"helloworld"的步骤
`java
1)创建一个.java文件 HelloWorld.java
2)在java文件中编写一个类
class HelloWorld{ //建议和文件名称保持一致
//3)编写main方法,是能够被jvm识别的,是程序的入口
public static void main(String[] args){
//4)输出"helloworld"
System.out.println("helloworld") ;
}
}
3.java文件被编译和运行的步骤
1)进入dos控制台 2)进入到指定java文件所在的目录中 3)javac HelloWorld.java javac 后面跟的是java源文件----->编译过程检验语法,没有问题 ---产生 HelloWorld.class (字节码文件) 4)java HelloWorld java 后面跟的是类名 5)输出的"helloworld"内容
4.什么是jdk,什么是jre,什么是jvm
JDK:Java Development Kit Java开发工具包 里面包含了jre以及工具库(jdk安装目录里面有一个lib目录---tools.jar) 所有的Java文件都需要运行,前台java运行环境的支持,jre: Java Runtime Environment:Java运行环境,包含了jvm以及Java运行时所需要的核心类库(jre目录下面 lib目录----rt.jar) JVM:Java Virtual Machine Java虚拟机,是一个假想计算机,所有的java应用程序需要交给jvm(jvm运行在操作系统之上)
5.配置环境变量path的意义是什么?
如果不配置path环境变量,我们书写的java代码都需要放在jdk安装目录的bin目录中,随着我们开发过程中java文件越来越多,放在bin目录不合适了,部分java文件不需要了删除,不小心将jdk其他的可执行.exe这种文件删除,导致jdk出问题!
为了让java文件可以在指定目录中进行编译和运行,就需要配置path!(javac 和java)
推荐配置第二种方式
系统变量-----新建变量名 :JAVA_HOME
变量值 :jdk的安装目录
path:%JAVA_HOME%bin;
好处:
1)jdk升级,只需要改变JAVA_HOME的变量值,不需要手动更改path
2)后期使用web服务器 tomcat,启动的时候需要寻找系统变量中是否有一个JAVA_HOME,如果没有启动失败!
今日内容
Java注释
class HelloWorld{
public static void main(String[] args){
System.out.println("今天天气不错!") ;
System.out.println("helloworld!") ;
System.out.println("helloJavaEe!") ;
}
}
Java中的关键字
Java中标识符
class MakeNameDemo{
public static void main(String[] args){
//定义变量
//int 1a = 10 ; //不能以数字开头
//System.out.println(a) ;
//int public = 100 ; //不能是Java中的关键字
//System.out.println(public) ;
//int _price = 100 ; //下划线可以开头,不建议,最好的方式前面加一个单词!
//System.out.println(_price) ;
//int Public = 200 ; java是严格区分大小写,虽然此时变量明不是关键字,这种写法不建议,一定"见名知意"
int productPrice = 200 ;
System.out.println("productPrice:"+productPrice) ;
}
}
Java中的常量
class ConstantDemo{
public static void main(String[] args){
//测试
//字符串常量
System.out.println("helloworld,helloJavaEE") ;
System.out.println("-----------------------------------------") ;
//字符常量
System.out.println('A') ;
System.out.println('我') ;
System.out.println('a') ;
System.out.println('0') ;
//System.out.println('ab') ; 错误写法
System.out.println("-------------------字符参与运算--------------------") ;
System.out.println('A'+1) ;
System.out.println('a'+1) ;
System.out.println('0'+1) ;
System.out.println("-----------------------整数常量和小数常量------------------------------") ;
System.out.println(100) ;
System.out.println(3.14) ;
System.out.println("-----------------------布尔常量------------------------------") ;
System.out.println(true) ;
System.out.println(false) ;
System.out.println("-----------------------空常量null------------------------------") ;
//引用类型(面向对象部分讲)的默认值就是null
//String:jdk提供的 代表字符串
String str = null ;
System.out.println(str) ;
}
}
进制运算
class JinZhiDemo{
public static void main(String[] args){
//二进制转换成十进制
System.out.println(0B100) ;//4
//八进制转换成十进制
System.out.println(0100) ; //64
//整数默认就是十进制
System.out.println(100) ;//100
//十六进转成十进制
System.out.println(0x100) ;//256
}
}
变量
class DataTypeDemo{
public static void main(String[] args){
//测试基本数据类型
//字节类型byte
byte b = 100 ;
b = 120 ;//重新赋值
//byte b = 120 ;
System.out.println("b:"+b) ;
System.out.println("-------------short短整型----------------") ;
short s = 150 ;
s = 100 ;
System.out.println("s:"+s) ;
System.out.println("-------------整数的默认类型int----------------") ;
//以后需求没有明确数据类型,都默认使用int
int i = 1000 ;
i = 10000 ;
System.out.println("i:"+i) ;
System.out.println("-------------长整型long----------------") ;
//int ii = 10000000000000;//DataTypeDemo.java:82: 错误: 过大的整数: 10000000000000
//System.out.println("ii:"+ii) ;
//当这个数据的值已经超过了int类型的最大值,那么报错,此时需要使用long 长整型
//long l = 10000000000000 ;//定义long类型,在值的后面不带标记,那么jvm认为int,但是值已经超过了范围
//long类型的值后面加入L或者l
long l = 10000000000000L;
System.out.println("l:"+l) ;
System.out.println("-------------float类型----------------") ;
//浮点类型默认是double,jvm在编译的时候,认为12.56就是一个double类型值,但是此时变量类型float
//Java语法规定:在定义float类型的值的后面加上F或者f进行标记,它是一个单精度
//float f = 12.56 ;//不兼容的类型: 从double转换到float可能会有损失
float f = 12.56F;
System.out.println("f:"+f) ;
System.out.println("-------------double类型(浮点类型默认)----------------") ;
//本身就定义double类型
double d = 3.14 ;
d = 13.42 ;
System.out.println("d:"+d) ;
System.out.println("-------------字符类型char----------------") ;
char ch = 'A' ;
//char ch2 = 'abc' ;//错误的写法
System.out.println("ch:"+ch) ;
ch ='a' ;
System.out.println("ch:"+ch) ;
ch ='0' ;
System.out.println("ch:"+ch) ;
ch = '国' ;
System.out.println("ch:"+ch) ;
System.out.println("-------------boolean类型----------------") ;
boolean flag = true ;
flag = false ;
System.out.println("flag:"+flag) ;
}
}
隐式类型转换 自动类型转换
class DataTypeDemo2{
public static void main(String[] args){
//int类型变量a,初始化3 ;
//byte类型变量b,初始化值4 ;
int a = 3 ;
byte b = 4 ;
//定义一个结果变量,接收最终的值
int result = a + b ; //将b这个类型----int类型的4
System.out.println("result:"+result) ;
}
}
Java中的隐式转换和显式转换
隐式类型转换也叫做自动类型转换。
1、规则:
从存储范围小的类型到存储范围大的类型。
2、转换方向:
byte→short(char)→int→long→float→double(这里指的是只有前面的数据类型能随便转换成后面的)
—实际开发中这样的类型转换很多,但没有为这种转换提供专门的语法,都是由虚拟机自动完成。
3、例子:
byte b = 10;short sh = b;这里在赋值时,JVM首先将b的值转换为short类型,然后再赋值给sh
二、显式类型转换
显式类型转换也叫做强制类型转换。
1、规则:
从存储范围大的类型到存储范围小的类型。
2、转换方向:
double→float→long→int→short(char)→byte
强制类型转换通常都会存储精度的损失,所以使用时需要谨慎。
—需要在被转换值的前面添加个括号,括号里面写的是希望得到的数据类型。
3、例子:
int m = 1234;
byte b = (byte)m;//-46
解析:
整数强制转换为整数时取数字的低位,例如int类型的变量转换为byte类型时,则只取int类型的低8位(也就是最后一个字节)的值。
则m的值还是12345,而b的值为-10。b1的计算方法如下:m的值转换为二进制是10011010010,取该数字低8位的值作为b的值,则b
的二进制值是11010010,按照机器数的规定,最高位是符号位,1代表负数,在计算机中负数存储的是补码,则该负数的原码是10101110,
该值就是十进制的-46。
附:
补码算得原码:—百度百科
算法1: 补码=原码取反再加1的逆运算
10010110是补码,应先减去1变为反码,得10010101;
由反码取得源码即除符号位外其他为按位取反,得11101010,即十进制数的-106
算法2:负数补码速算法,由最低位(右)向高位(左)查找到第一个1与符号位之间的所有数字按位取反的逆运算
10010110是补码,符号位与最后一个1之间的所有数字按位取反,得11101010
注意:
+=具有强转效果(short s = 1;s = s + 1;s += 1;前面的s=s+1会报错,因为s+1会先转换成int类型,然后再赋值给short类型,这样可能数据丢失;s+=1具有强转效果,相当于s = (short)(s+1),所以正确)
原文链接:https://blog.csdn.net/qq_16268979/article/details/114629247
byte a = 128;引发的问题
就是当一个int值大过byte表示的数值范围的时候,这个时候问题就出现了。比如,int的128转换成一个byte类型会是-128。这是因为补码运算的关系造成的。首先,128写成16进制是0x00000080,当做int到byte的类型转换的时候,前面的0被截断形成0x80。在二进制中0x80可以写成10000000,如果这是一个无符号数哪么一切正常,但是如果是一个有符号数就会经过补码运算。对于负数而言,其补码运算就是反码(就是1转换成0并且反正既然)加一。哪么,10000000的补码就是01111111加一,即10000000=128(十进制)。因此,byte0x80事实上表示的也
就是-128了。类似的int类型的129就是byte类型的-127,而int类型的130则是byte类型的-126,等等,直到int的255对应为byte的-1。
哪么如果到了256呢?此时,地位的字节被0来填充,简而言之256就是0x00000100。因此,转换成byte就是0,这个转换循环也就是256个
原文链接:https://blog.csdn.net/jackwofe/article/details/4955117
数据类型匹配问题
class DataTypeDemo3{
public static void main(String[] args){
//int类型变量a,初始化3 ;
int a = 3 ;
//byte类型变量b,初始化值4 ;
byte b = 4 ;
//结果使用byte类型接收
//byte result = a + b ; // 不兼容的类型: 从int转换到byte可能会有损失
//=号右边:byte类型 b先提升为int类型,和int类型的a进行计算----结果int类型 4个字节
//=左边:byte类型接收,1个字节
//System.out.println("result:"+result) ;
//套格式
//目标数据类型 变量名 = (目标数据类型)(初始化值) ;
byte result = (byte)(a+b) ;
System.out.println("result:"+result) ;
}
}



