
正文
菜鸟的java代码审计之旅-0之java基础知识
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
前言:
对于java的代码审计我就是一个小白,没有代码基础(不会java),从0开始记录我的java漏洞的审计学习之旅。对于java来说是一门很难的语言,但是不去学习就永远不会。对于一门很复杂的语言如果学习的过于仔细专研原理追求完美,容易跑偏消耗积极性和精力,我学的是代码审计而不是java开发,所以我学的比较有针对性,对此仅仅是我个人看法。
00x1:
java的基础知识,由于语言的特性,我不是去搞开发所以根据以往的语言经验,我直接在菜鸟的java教程过一遍基础语法,了解java的语言特性,语法无外乎3大结构体,条件,循环和判断语句,以及面向对象,异常处理,以及文件处理,等对于预期达到的学习目的是能看懂java代码,理清楚逻辑,入门java的代码审计。
00x2:
基础的语法,对象,类,方法,实例变量就是对象的实例化,而java是大小写敏感,标识符是字符,字母,下划线,不能是数字,关键字。java的修饰符:分为访问修饰符以及非访问修饰符,访问控制修饰符:default,public,protected,private,而非访问的修饰符final,abstract,static等。java的变量:局部变量,类变量,成员变量。java的特性之一:枚举:预先设定好值,不可更改,减少代码bug
java的类和对象:封装,继承,多态,海军3大将面向对象精华,类和对象简单解释,类是一个模板,比如男孩和女孩是一类,而男孩的女朋友叫美羊羊就是一个对象,对象也可以是行为,比如说,吃等代码解释:
public class Dog{
strinng bread;
int age;
string color;
viod barking(){}
viod hungry(){}
viod sleeaping(){}
} 上述代码类,和方法以及变量,变量分为局部,成员,类变量
构造方法:类在创建对象的时候至少调用一种构造方法,若没有定义,则系统使用默认的构造方法,通过new关键字去调用构造方法,必须满足以下要求:1.方法名和类名完全匹配,构造方法不需要返回了偶像,构造方法不需要非访问修饰符修饰,如:static,final等,以下代码解释构造方法的作用原理:
Fruits apple = new Fruits("80%","60%","30%") 使用new关键字创建java对象的时候,首先是分配内存空间,然后调用类的构造方法初始化成员属性和成员变量,最后返回实例给对象apple,构造方法为有参和无参,又分隐式和显式,这怎么理解其实作用就是给对象一个初始的参数,这部分网上有是咧代码自己敲了一遍,发现的坑是源文件名称必须和public类保持一致
变量:变量是啥,是申请内存来存储值,变量名就是申请的这块内存的名字,而这个申请的内存类型是由变量类型决定的比如定义一个变量为浮点数,这块内存就只能存储浮点数,java的两大数据类型:内置数据类型和引用数据类型,内置的数据类型有8种基本的数据类型,其中6种数字型,一个字符,一个布尔。比如二进制类型:byte,short以二进制补码形式,int,long,float,double.boolean,char,这些取值范围啥的,不需要记忆,若需要直接打印即可,因为是常量,
常量:常量不可修改,上面提到的非访问修饰符final 就是修饰常量的。
局部变量,类变量,实例变量的区别:类变量是独立方法之外的变量用static修饰,实例变量是独立方法之外,但是不用static修饰,而局部变量就是类方法中定义的变量
java有个自增和自减运算符:++和--这和c语言差不多有个前缀自增和后缀自增 ++a和a++的区别,就是先运算表达式再自增和先自增再运算表达式的区别,关系运算发和其他语言一样,istanceof运算符,就是比较对象是部署同一个对象
循环结构:for,while do...while,switch case: break,default
正则:\\符号在其他语言中为普通符号\ 但是在java中表明这是转义,而表示一个普通的反斜杠为\\\\
在正则中 如果单独的?号表示零次或者一次匹配前面的字符或者表达式,而如果?紧跟着其他的限定符,表示非贪心模式,比如o+?表示匹配单个的o而o+为匹配所有的o,{m,n} 非负整数: 字少m次最多n次,小写和大写相反的匹配:\d 数字,\D非数字,\s空格 \S非空格,\w任意字符,\W 与任意非单词字符匹配
方法:函数和过程,一个返回非viod叫函数,而返回viod的方法叫过程,finalize方法;垃圾收集器析构之前调用,用来清除回收对象,jvm可以自动的清除内存,手动的话就用上面的方法。
流:java.io 包含了所以的输入输出类,一个流可以理解为一个数据序列,输入流表示从一个源读取数据,输出流表示向目标写数据
比如从控制台输入:由System.in 完成,从控制台读取多字符: read()方法读取字符,readline 读取字符串,语法: int read() throws IOExcetion,当流结束的时候返回-1,该方法抛出IOExcetion
scanner类获取用户的输入:格式: Scanner s = new Scanner(System.in) next和nextline的区别 就是空白的区别:next遇到空白就结束不能得到带空白的字符串,而nextline 是可以得到空白可以得到包括空白的所有字符。
之前最好验证写完没有:用hasNextXxx()方法。
java异常:
用户输入非法数据,打开文件不存在,网络连接中断,或者jvm内存溢出 捕获异常:try{} catch(ExceptionName e1){} 多重捕获就是多个catch,finnaly关键字在cathc后面,不管异不异常都会执行
序列化:全名对象的序列化,将对象的数据,类型和信息都是一个字节序列,将该字节序列写入文件,叫序列化,如果将该字节序列从文件中读取出来,叫反序列化,优点是整个序列化和反序列化的过程是虚拟机JVM独立的,是可以跨平台的
类:ObjectInputStream 和ObjectOutputStream 是高层次的数据流,包含序列化和反序列化的方法
...后面没有记录懒,基本上一天时间过了遍基础知识,能看懂代码。






