目录

  1. JDK与JRE和JVM的区别
  2. API

上面目前阶段只需了解,下面是必掌握的重点:

  1. java的数据类型

    基本数据类型分析

    final、字符常量、Scanner的使用引入

注:(资料来自马士兵教育笔记)

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; //314
10^(-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);
        }
}

在这里插入图片描述
返回目录

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐