【安卓逆向】1.Java开发(1)_世界速讯

时间:2023-01-28 01:50:19来源:哔哩哔哩

#Java语言的特点

---面向对象、强类型、垃圾自动回收

---强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。


(相关资料图)

---而弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换

#面向对象

---面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。特点:封装、继承和多态(本质是为了节省代码量)

#垃圾自动回收

---自动垃圾回收是针对堆区内存中的对象,分辨哪些对象是正在使用中而哪些对象没有,然后删除那些没用的对象。

---一个正在使用中的对象或者是一个被引用的对象,意味着你的程序中的某部分仍然维护着指向这个对象的指针。

---一个无用的对象或者是一个无引用的对象,是说它已经不再被你的程序中任何一个模块所引用。所以被一个无用对象所占用的内存是可以被回收的。

#编译型语言:

---编译型语言在执行之前要先经过编译过程,编译成为一个可执行的机器语言的文件,比如exe。因为翻译只做一遍,以后都不需要翻译,所以执行效率高。

---编译型语言的典型代表:C语言,C++。

---编译型语言的优缺点:执行效率高,缺点是跨平台能力弱,不便调试。

#解释型语言:

---解释性语言编写的程序不进行预先编译,以文本方式存储程序代码。执行时才翻译执行。程序每执行一次就要翻译一遍。

---代表语言:python,Java。

---优缺点:跨平台能力强,易于调,执行速度慢。

#跨平台

---注意:类要和文件名一样(这里类名Demo,文件名Demo.java)

---notepad++创建(我的是UTF-8编码)

---编译:javac Demo.java

---发现生成了Demo.class文件

---运行:java Demo

---流程:Demo.java > Demo.class > Win/Linux/Mac版 jvm虚拟机 > Win/Linux/Mac

---Demo.class不需要修改代码就可以在Win/Linux/Mac系统运行,靠的是JVM虚拟机屏蔽了底层运行平台的差别,实现“一次编译,到处运行”。

#Java语言的注意事项:

---驼峰命名法:当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母

---注意:区分类名首字母大写,而且公有类和源文件命名相同

#Java语言的基础组成

#Java的编码

---CMD的窗口默认的编码是GBK编码

---例如:在Demo.java中加入中文的注释

---然后用CMD打开发现乱码

---这里的原因是:CMD的编码是GBK,而Java的编码是UTF-8

#常见的编码方式

---在滴水逆向里面有详细描述,这里就简略描述下(想看详细说明,可以看我的专栏:【滴水基础】4.Win32Api调用(上)

---UTF-16和UTF-8的对于区间:

#CMD设置默认编码UTF-8

---不建议将系统改为UTF-8,这里只需要将CMD改为UTF-8就行

---chcp 65001

---发现编码更改

---而且也可以正确显示

---但是不能永久生效(需要修改注册表)

---Win+R > regedit打开注册表:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor

---新建字符串/值

#IDEA的配置(安装可以CSDN+某宝)

---IDEA中新建的项目(我直接默认的)

---IDEA的配置文件:C:\Users\huangbo\AppData\Roaming\JetBrains

---删除配置文件,即idea的字体设置啊这些就失效了

#转义字符\

---在ASCII中有一些不可见的字符,如果想要表示这些不可见的字符,就需要转义字符

---如果本身就要输出1个\,就需要\\,不然就会报错

---转义字符\的作用:1.解决不能显示的字符2.防止重复和冲突

---执行结果如下

#变量

---变量就是在内存中的一块存储区域,声明定义了一个变量就是在内存中开辟了一块空间

---变量被开辟就要明确存放数据的类型(数据类型)和将来被调用的名字(变量名

---分为局部变量(缓冲区)和全局变量(堆内存)

---声明的变量一般在缓冲区存储为(32位)0xCCCC CCCC(查看反汇编)

#Java的数据类型

---注意:Java的原始类型int里没有无符号类型,c语言int类型表示有符号整型,unsigned int无符号整型(所有Java里面的int 是有符号数: 00000000 00000000 00000000 00000000,首位0代表符号位)

---C语言中的char是1Byte,估计是参考了ASCII码,字符占位1Byte

---而Java中的char是以Unicode编码中的UTF-8存储,一个字符占2Byte(通用情况下)

---float与int一样都占了四个字节也就是32个比特位,但是存储的含义与int不一样了。其中第一位代表正负,第2-9这八位代表指数,与后23位的底数。

---符号位(1bit):0位正数,1位负数。---指数位(8bit):用于记录科学计数法中指数数据(具体可以看滴水专栏)由于指数位全为1的时候有特殊用途,所以指数位真正的取值范围是-127-127。---尾数位(底数位)(23bit):记录科学计数法中的底数部分。

---double的存储方式和float类似,只是内存扩大了1倍

#有符号数的存储方式(在解析前,先判断正数/负数):

---正数:以原码方式存储

---负数:以补码方式存储

---例如:-1的原码: 1 000 0001;反码:1 111 1110;补码:1111 1111(FF)

#为什么byte的取值范围是-128到127

---byte 占一个字节(8个 bit 位),最高位是符号位,尾七位可以表示的就是 0 ~ 2^7 - 1( 1000 0000 = 2 ^ 7,减1,得到 111 1111),所以 byte 可以表示 -127 ~ 127

---[1000 0000]补 表示 -128,-128只有补码,没有原码和反码

---我认为[1000 0000]补 = [0111 1111]反 = [0000 0000]原 = 0;

---已经有[0000 0000]原 表示 0 了,不需要[1000 0000]补 表示 0 了,所以[1000 0000]补 表示 -128

#整数型

---出现在代码中的整数,默认为int,声明long或者运算的时候需要加L

#浮点型

---出现在代码中的小数,默认为double,声明float变量需要在后面加F

---小的数据类型可以放入大的数据类型里面

----科学计数法:相当于10^n次方

---输出(这个是double类型):

---小数精度问题:

----由于小数存储的方式和整数不一样,分为:符号位/指数位/尾数位,所有小数的运算可能会造成精确度的问题

---这里发现输出存在精度问题

#字符型

---char本质是一个整数,输出的是Unicode对应的字符

---如果非要输出整数,需要进行强制转换

---Java中‘’代表字符,“”代表字符串

---发现:字符型可以强制转型为对应的Unicode编码的字符串

---字符型的存储(注意:字符型是一种特殊的基本数据类型)

---存储:a > Unicode对应的编码97(正数) > 二进制:01100001 >原码存储

---读取:二进制 > 97 > a

---char类型可以进行的运算(因为char的本质是一个整数

---输出发现

#布尔型和类型转换

---占1Byte,取值为TRUE或者FALSE(注意:在Java中不能使用0或者非零来代替flase和true)

---自动类型转换:Java在进行赋值或者运算的时候,精度小的类型可以自动转化为精度大的类型

---注意事项(强行转换则不用考虑这些)

---在运算的时候,自动的转换为精度最高的类型

---这里报错的原因:byte/short/char在进行计算的时候,自动转为了int

---前提是:在运算的过程中,没有高于int的类型(如出现float,就转化为精确度最高的类型)

---测试案例:

---在运算的时候,整型一般转化为int,浮点型转化为double

---其它了些自动转换案例

---发现了字符串进行了串联

---注意:当存在数值运算和字符串连接的时候:

---根据运算的从左到右的顺序,来判断是先计算还是先连接(先连接就不用计算了

---输出如下:3001=(100+200)1=3001;

---1100200=1+100+200

#强制类型转换

---当类型不一致且不符合自动类型转换的标准,就可以使用强制转换(优先级高)

---类型转换不仅仅在基本数据类型,引用数据类型也可以转换

---进行强制转换可能会造成精度丢失(可以从二进制的角度分析)

---输出

#关键字和保留字

---标识符命名的时候不能使用关键字,关键字一律用小写字母标识,按其用途划分为如下几组。

---另外,Java还有3个保留字:goto、const、null。它们不是关键字,而是文字。包含Java定义的值。

---和关键字一样,在IDEA里面也是会变色的,它们也不可以作为标识符使用。

#标识符

---标识符为名字,用来区分不同的类、方法、变量等---标识符规则:不可以以数字开头,大写字母和小写字母以及下划线$符号---注意事项和规范:

---案例

#常量

---注意:System.out.println()输出的是十进制

#算术运算符

---运算符是一种特殊的符号,表示数据的运算/赋值/比较等

---单元运算符

--:+作为单元运算符的时候,表示正负

---二元运算符

---+作为二元运算存在,左右没有字符串的时候,进行数值处理;而存在字符串的时候,进行字符串拼接

---输出:

---四则运算符:+ - * /

---注意:对于四则运算要特别的考虑数据类型(可能会照成精度缺失)

---例如:12/5输出的2,这是由于12和5都是int类型

---解决方法:将12转换为double

---这里输出:4000,原因是x/1000都是Int,所以等于4,4*1000=4000

---取余运算符%(从整数考虑:a%b=a-a/b*b)

---自增和自减

---作为独立的语句使用:前++和后++都完全等价于i=i+1

---前++:先自增,后赋值

---后++:先赋值,后自增

---i=i++;的本质

---i=++i;的本质

---对于()的运算,可以看成A B C三个部分

#运算符的练习

---43天等于多少星期多少天

---4725秒等于多少时多少分,多少秒(输出1小时18分钟45秒)

关键词: Java 数据类型

相关资讯
热门频道