java基础---初识java(与C的一点底层知识)

初识java

  • DOS 常用命令:

    dir         //显示该目录下的所有文件
    cd          //进入文件夹         eg: cd JAVA基础
    cd ..       //返回上一级目录
    cd \   cd / //这俩都可以跳到根目录 但是推荐使用 cd \
    mkdir //新建文件夹               eg:mkdir JAVA基础
    rd    // 删除文件夹              eg: rd JAVA基础
    del   //删除文件                 eg: 像是 .class .doc文件之类的
    cls   //清屏 命令作用的路径还是不变  
    
  • 在DOS运行程序

    javac hello.java
        //编译程序成.class文件 (字节码)
    java hello
        //在jvm上跑.class文件
    
  • JDK JRE JVM

    • 解释

      JDK  --java development kit  java软件开发者工具包  
          顾名思义 给开发者使用的工具包 就像木工 修理工 会随身带着的装工具的包一样  JDK是java开发者使用的工具包
      
      JRE  --java runtime environment  Java运行时环境
          
      JVM  --java virtual machine  Java虚拟机
      
      
    • 三者之间的关系:
      在这里插入图片描述

JAVA语言

  • 和其他语言的差别

    • C的一点底层知识
    C / C++ 这俩直接和底层交互,PC的环境对其编译运行有影响
        像是32位机 64位机中C变量的内存所占大小就不一样
        32位: sizeof(int *) = 4
        64位: sizeof(int *) = 8
        为什么拿这个打比? 因为指针里面的东西是内存地址。 
        那为什么内存地址和32位机64位里有关系?这里稍微解释一下计算机的底层:
        
        我们平常说的32位机 64位机,这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度。
        64位机的通用寄存器数据宽度是6432位机的CPU通用寄存器宽度是32,(这里的64 32 可以与bit联系)64位指令
        集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据
        而我们平常下的win程序、操作系统 都有X86 X64两种区别  x86是32位机适用  x64是64位机适用
        64位机可以跑x64的程序也可以跑x32位的程序, 但是32位只能跑x32位的程序 x64的跑不动
        I:	
    		至于为什么是x86 不是什么x32 百度百科是这么说的:
        Intel x86:
    	x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构。最早的8086处理器于1978年由Intel推出,
    	为16位微处理器。Intel在早期以80x86这样的数字格式来命名处理器,包括Intel 8086801868028680386以及
    	80486,由于以“86”作为结尾,因此其架构被称为“x86”。
        //具体的还是等后续补充吧
        II:
    		关于位数这一块 要彻底搞清楚3264啊之类的我们需要知道几个概念:
    	--数据总线  --通用寄存器  --地址总线  --寻址能力  --字长  --CPU位数 --内存大小
        先从总线和CPU讲起:
            总线分 数据总线、地址总线和控制总线。
            1.先讲地址总线,要存取数据或指令就要知道数据或指令存放的位置,地址寄存器存储的就是CPU当前要存取的
            数据或指令的地址,该地址是由地址总线传输到地址寄存器上的。
    		假设地址总线有n位,即共有n位二进制位来表示地址,那么最多可以表示2^n个地址。另外,由于计算机以一个字
    		节为寻址单位,所以CPU的寻址能力或者说最大寻址范围为2^n个字节。
    		综上,地址总线的位数决定了CPU的寻址能力。
            第二段可能有些人看不明白,这里解释一下内存中的物理地址分配:计算机储存器容量以字节为最小单位。
            内存中的地址编排是从000....0000(n个)~111....1111(n个)所以n位的地址总线最大能找到的地址是:
            111....11111(n个)那么,总共能找到的地址就有2^n个。同时由于计算机以一个字节为寻址单位,
            所以CPU的寻址能力或者说最大寻址范围为2^n个字节。
            这里再举个例子:
            32位的CPU一般来说,默认地址总线也是32位 那么 它能寻到的最大地址范围是2^32个字节,
            也就等于是 2^2 * 2^30个字节 也就是说是 4GB
            而64位的CPU的话 它能寻到的最大地址范围是2^64个字节 等于 2^4 * 2^60个字节,
            也就是说理论上64位的CPU能寻到16EB大的内存(当然,现在好像还没有这么大的内存)
         补充一下二进制的计量单位换算:
                注:Byte也就是B也就是字节
                 1024换算(2^10次方)
                 1KB=1024Byte
                 1MB=1024KB 
                 1GB=1024MB 
                 1TB=1024GB 
                 1PB[Petabyte]=1024TB
                 1EB[Exabyte]=1024PB
                 1ZB〔Zettabyte〕=1024EB
                 1YB [Yottabyte]=1024ZB
       		[K是千 M是兆 G是吉咖 T是太拉]
        	从小到大是:Bit(比特)、B(字节)、KB(千字节)、MB(兆字节)、GB(吉字节)…… 
            
            2.而CPU位数、字长和数据总线的宽度应该是需要一致的。为什么? 因为CPU的位数指的是CPU通用寄存器的数
            据宽度。而字长指的是CPU在同一时间内可以处理的二进制数的位数,这个东西决定着寄存器、加法器和数据总
            线等设备的位数。字长这个东西是由CPU这个硬件直接决定的。
            而CPU从内存中获取数据或指令的过程是这样的:由地址寄存器指出要存取数据或指令的位置,然后到该地址把
            数据或指令找到,接着用数据总线传输给CPU。假设数据总线有m位,则传输的数据或指令也有m位。
            CPU一次能处理多少个二进制数 就应该需要多大的寄存器同时也需要与之匹配的传输数据的那根线(数据总线)
            的数据宽度
            3.控制总线 
            	CPU通过控制总线对外部器件进行控制。
            	控制总线的宽度决定了CPU对外部器件的控制能力。
            	控制总线是控制线数量之和。
            这个和位数之间的关系并不算特别大 就不展开讲了
            
            还可以补充一点的是 CPU位数允许和地址总线的宽度不一致 就像是lnter 8086 CPU 它是16位的微处理芯片,但
            是有20位地址总线可以寻到1MB的储存空间
                
                
           III:
    			或许不少人还有这样的疑问:就是为什么处理器的位数好像都是8的倍数 为什么内存中的一个储存单位是8bit
                //这个问题的话也还是等到以后再来补充
    		解释完了计算机底层 但好像还是没有解决为什么C语言在32位系统中指针大小是 4个字节 但64位系统大小是 8个字
    		节 
            那咱们就来讲一下 C对基本数据类型所占内存大小(如int)的规定和C的指针:
                C标准中并没有具体给出规定那个基本类型应该是多少字节数,而且这个也与机器、OS(操作系统)、编译器
                有关,比如同样是在32bits的操作系统系,VC++的编译器下int类型为占4个字节;而tuborC下则是2个字节。
              	所以intlong intshort int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的):
                        sizeof(short int)<=sizeof(int)
    
                        sizeof(int)<=sizeof(long int)
    
                        short int至少应为16位(2字节)
    
                        long int至少应为32位。(4字节)
                    
                 这里是三种编译器下C的数据类型所占的空间:
                    16位编译器:
                    char1个字节
                    char*(即指针变量): 2个字节
                    short int : 2个字节
                    int:  2个字节
                    unsigned int : 2个字节
                    float:  4个字节
                    double:   8个字节
                    long:   4个字节
                    long long:  8个字节
                    unsigned long:  4个字节
    
                    32位编译器:
                    char1个字节
                    char*(即指针变量): 4个字节(32位的寻址空间是2^32,32个bit,也就是4个字节。同理64位编译器)
                    short int : 2个字节
                    int:  4个字节
                    unsigned int : 4个字节
                    float:  4个字节
                    double:   8个字节
                    long:   4个字节
                    long long:  8个字节
                    unsigned long:  4个字节
    
                    64位编译器:
                    char1个字节
                    char*(即指针变量): 8个字节
                    short int : 2个字节
                    int:  4个字节
                    unsigned int : 4个字节
                    float:  4个字节
                    double:   8个字节
                    long:   8个字节
                    long long:  8个字节
                    unsigned long:  8个字节
                在这中间呢我们可以发现这个指针大小与编译器、CPU位数、地址总线等之间关系:
                    具体表述就是 假设是64位CPU 寻址能力是2^64个字节 这说明一个物理地址的编号有64位,64位机中用64位
                    bit表示地址 也就是说用8个字节表示地址
                    而指针变量里面存的是地址 所以在64位机上 指针变量所占字节大小是8个字节
             IV:
    			最后来解释一个问题:而为什么64位机两个都可以 32位的却只能跑x86?
    		其实看懂了上面几个问题的解答的话 这个问题很好解决 
                    64位机他编写的程序 指针(地址)就占了8个字节  但是32位机的指针只有4个字节 它可能根本就找不全地址
                    所以无法运行  但是这就延伸出了另一个问题:就是说 64位程序和32位程序的区别 
                    //实际上我们都知道 操作系统也就是OS它其实也是一个程序..... 待补充
    
    • JAVA自身的特点
    java它最大的特点是:一处编译,处处运行 
        这说明JAVA的可移植性超级强大,java做到的是 源代码可移植性
        那么这么强大的能力是怎么实现的呢?
        		实际上java一开始被设计出来是因为詹姆斯·高斯林想开发出一门语言,能让程序在各种家电像是电视、电话、闹
        钟、冰箱之类的地方运行。这就意味着一开始这门语言就不是在传统意义上的计算机上跑的(大概。 
       		 java程序它是跑在java虚拟机上的 --也就是在之前所说的JVM上跑的。这就像是java和计算机硬件中间有一个平   
       	台,
        		这个平台可以承载java程序 使之不像C一样需要直接和硬件交互 这样的话就能把硬件对程序对语言的影响降到最
        低。而与硬件交互的任务就交到了JVM的手里 于是又出现了一个问题:
        
        JVM又是怎么和不同的硬件打交道的? 
        
        		我们都知道 要是有一把固定的钥匙你让它去开各种乱七八糟的锁那绝大部分都是打不开的吧(就算是所谓开锁	
        神器-铁丝那也有很多打不开的锁),这意味着啥呢?这意味着咱们之前讲的JVM它根本不是一个具体的程序。
        
        那它到底是什么? jvm是一套标准。是由SUN公司制定的标准。人们可以依照这一套标准进行jvm具体的版本的开
        发。比如HotSpot,它是遵照jvm的标准,使用jdk开发工具进行开发出来的一个软件,用来运行编译好的java程序。
        
        综上所述,Java受到的硬件影响最小 只要你安装了适合的JRE之后你就可以在各种地方运行你的JAVA程序 这是非
        常理想的,因为用其他语言写的程序有很多地方都是在和硬件妥协,看起源码来理解上就比较困难。但是java你直接
        看源码完全没问题 因为可以说所有Java程序的运行环境都是一样的(大概
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值