dos命令注意点:
|--任何路径下输入与当前不同的根盘符都会回到最后一次操作该盘符的位置路径
|--返回当前盘符的根路径最快只能通过cd /的形式(直接cd当前根盘符只会显示当前路径位置)
|--查询操作必须先确定根盘符,在异盘符的情况下即使绝对路径也无法访问到
|--新建和删除操作则可以跨盘符进行,注意删除操作不过回收站
|--写相对路劲时可以把..\与想要访问的路径合在一起使用加快效率
|--只有返回根路径的前提下执行exit命令才会退出命令框
java语言特点:
|--开源免费
|--跨平台性(得益于其强大的jvm虚拟机)
|--垃圾回收机制(会自动定期对之前开辟的但现在空置的空间进行回收)
jdk、jre、jvm之间联系:
|--jdk包含了jre及其他工具,jre又包含了jvm及其他工具
jdk环境配置:
|--通常采用技巧性配置(即变量名的方式,注意在path中引用变量名时要加%)
cmd窗口编译程序注意事项:
|--必须先编译再运行,即先执行javac命令再执行java命令
|--在利用java运行程序时,记得不要输入.class后缀
标识符取名规则:
|--所有字母大小写、下划线、$的组合均可
|--注意不能以数字开头且不能直接使用关键字保留字,中文也可以只是不提倡
进制转换(主要以两条路线为主):
|--十进制与各种进制之间的转换:
|--十进制转各种进制用除基取余法,最后余数从下至上排列(基数取决于要转的是几进制,8进制则基数为8)
|--各种进制转十进制用乘基求和法(即当前位上的数乘以基数的位数减一次方,依次相加)
|--除十进制外各种进制之间的转换:
|--不包含十进制之间的转换通通换成二进制进行过渡即可,只需记住八进制对应3位,十六进制对应4位
变量命名注意事项:
|--同一作用域范围内不能有相同的变量名(但全局变量和局部变量名相同并不冲突)
数据类型注意事项:
|--整数型变量值默认为int类型,浮点数型变量值默认为double型(故使用long和float时需要特别添加L和F)
转义字符注意事项:
|--转义字符可以单独以字符的形式利用加号进行拼接,也可以直接包含在一个字符串中由计算机自动识别
类型转换注意事项:
|--算数运算符两侧类型不一样,结果一般以大容量类型为主
|--算数运算符两侧类型一样则一般保持不变
|--byte、short、char、int之间的各种运算最后均会以int的结果进行表示
取余注意事项:
|--若正负不一的情况下,结果的正负性以被取模的数为主(即与%号前的数正负性保持一致)
除法注意事项:
|--整型之间相除要格外注意结果是否为浮点型,若是浮点型要提前在表达式中进行浮点化处理(例如乘个1.0)
自增自减:
|--++或--在变量左边表示先进行自增或自减后用新的值进行运算,
|--++或--在右边表示先以原先的数进行运算后单独对变量进行自增或自减操作
混合赋值运算符特点:
|--会自动进行强转,即使运算后超过自身变量取值范围仍然不会编译报错
逻辑运算注意事项:
|--双与、双或运算又称为短路运算,实际开发中多数使用这类
|--异或运算符为^
switch使用时的注意事项:
|--switch的case所能支持的类型只有byte、short、char、int、string、枚举类这六种
|--要注意是否使用break关键字来避免穿透现象
|--default结构可有可无,不过为了规范一般会写
关于类型自动初始化的注意事项:
|--只有在一个类最外层的变量才具备自动初始化,其余变量均需要人为初始化
string的注意事项:
|--string的长度获取为a.length(),数组的长度获取为a.length
|--string强转为int原生类型可以使用integer.parseInt("x"),返回值为int
|--string不能像数组一样直接啊a[x]查找到某一位,要用固定的方法
do...while注意事项:
|--while()后面要记得加分号
random注意事项:
|--使用时记得适情况+1
ocp原则:
|--即开放封闭原则,在功能扩展上是开放的,在源代码修改上是封闭的
内存分布类型:
|--栈、堆、方法区、本地方法区、寄存器
方法签名:
|--修饰符+返回类型+方法名+形参类型
重载注意事项:
|--重载只与方法名和参数类型有关(注意与返回值无关)
|--重载是可以发生类型自动转换的(如int数据可以传递至double类型的形参中)
数组的特点:
|--是一个容器,开辟了一块连续的存储空间,内部有多个小区域,解决了变量只能存储单个数据的问题
|--可以存储匹配类型的数据
两种变字符串的比较:
|--object + “” 会比object.toString()要好,因为tostring可能为空值
二维数组注意事项:
|--动态二维数组的列需要在外层循环的内部定义(例如:arr[i] = new 数据类型[ ])
|--二维动态数组的列初始化对象时只能写全格式,不能写简写
谈一谈你对面向对象的理解:
|--可以说面试招聘的环节就是一个面向对象的过程,找合适的员工做对应的项目开发
类和对象之间的关系:
|--类是对多个对象共性的一个抽象集合,对象是对类一个实例化的表现,一旦得到了这个实例对象,就可以访问类中的成员进行相关操作
成员变量和局部变量的区别:
|--定义位置(成员和局部)
|--作用域大小
|--内存位置(成员在堆,局部在栈)
|--默认值(只有堆中的成员才用默认值)
|--生命周期(一个伴随堆一个伴随栈)
匿名对象注意事项:
|--匿名对象只被使用一起,往往使用完就被回收
this关键字注意事项:
|--构造方法之间调用使用this(...),切记this语句应该放在第一行且不能形成闭合回路
|--所有非静态方法都会默认自带一个this用于指向其对象的地址
static注意事项:
|--实例对象可以调用非静态和静态成员,但类名只能调用静态成员
|--非静态方法中可以调用静态和非静态成员,但静态方法中只能调用静态成员(硬要使用非静态成员的话,要在方法体里创建对象)
|--静态方法也是压栈执行的,只是说它比非静态先执行
|--静态家族中没有什么优先问题就是在家族中顺序执行(这点是为了区别构造函数的隐式三步)
|--静态家族中只有静态代码块是只随着类加载执行一次,其他静态成员后期还是可以调用执行的
涉及静态的内存运作流程:
|--将所有class文件加载至方法区(方法区中每个class文件对应空间分为静态和非静态)
|--非静态区可以理解为加载目录不开辟空间,静态区是可以直接开辟空间用来共享的
|--栈和堆的程序执行根据非静态的目录表进行,碰到静态属性直接使用就好了
构造方法方法体执行前的隐式三步:
|--super父类中的构造函数
|--为非静态成员属性赋值
|--执行构造代码块
|--注意第二三步无优先级,看具体代码的顺序
继承的注意事项:
|--子类在堆中开辟的空间可以理解为分为两块,一块属于自己,一块属于从父类复制过来的
|--父类中的成员其实只能由父类调用,我们平常能用子类点出来其实是隐式有加super(这里可以结合对父类私有变量的调用去理解)
|--注意super调用的是非静态属性和方法,静态的一般直接用类名调用
|--构造方法其实是不参与继承的,只是它默认会调用父类的构造方法所以造成了继承的假象
重写的注意事项:
|--重写必须存在继承关系
|--重写后的方法必须名字,返回值,访问类型(即是否静态),形参与原函数相同,权限修饰符要大于或等于原函数
|--public>缺省>private
|--静态方法没有重写的说法,因为在运行时碰到对象点静态方法会自动用对象的类名去调用
抽象的注意事项:
|--抽象类不能实例化,且其子类若没有将抽象函数全部实现也不能实例化
|--抽象类可以有构造方法,作为桥梁给子类使用的
多态的注意事项:
|--必须存在继承或者实现关系(实现指要有接口)
|--可以结合参数、数组、返回值使用
|--子转父可以自然过渡,父转子要加强转符(一般会结合instanceof关键字进行判断最底层的类是否等于即将要转的类)
|--只有非静态方法有多态性,属性和静态成员不具有多态性(可以想象交并集的关系来理解)
|--注意使用instance时若右边类型大于等于左边类型都会返回true
|--注意如果用了多态,在某个方法要接与其相关的参数时应该尽可能取大范围
接口的注意事项:
|--jdk1.8版本之前接口只能定义常量和抽象方法(其中public static int final 和public abstract可以省略)
|--jdk1.8版本之后可以写静态和默认的方法(使用默认方法是为了做功能扩展的时候防止子类大面积报错)
|--接口不能实例化且无构造方法(注意区别于抽象类)
|--接口可以多继承,多实现
|--若父类和接口中出现了同名的方法,在掉用时会默认执行父类中的方法,若想使用接口需使用接口名.super.方法名()的形式
|--若多个接口中的方法重名,必须在子类中重写,最终执行子类中重写的那个(不重写会报错)
|--注意接口中的默认方法也是需要被实现的,实现类不能直接调用
比较器原理(comparator、comparable、sort的联用):
|--comparator比较器是用于自定义的比较器类,用的时候要new这个比较器对象,一般配合sort(要排序的对象,比较器对象)去使用
|--comparable比较器是直接用于实体类后面,使用时直接配合sort(要排序的对象)使用即可,不需要new比较器对象
|--比较器里定义前减后则为升序,后减前为降序(可以理解为sort函数里会自动调用compare方法,只有默认结果大于零才会交换元素,所以可以通过这种方式判断升降序)
|--注意不管是什么比较器,里面都可以写多条件的并发判断,sort的底层会自动帮你反复循环实现(例如可以同时写上姓名年龄成绩的规则)
权限修饰符:
|--私有类型只用于本类
|--缺省类型只用于本包
|--保护类型用于有相互关系的地方
|--公共类型项目内都能使用
单例设计模式注意事项:
|--饿汉式写法是直接静态创建对象,然后提供公开的掉用方法,可以适用于多线程的模式,但资源浪费过多
|--懒汉式的写法是先定义对象变量但不创建,等用到的时候再创建,不适用于多线程的情况,但可以节省资源占用
匿名内部类注意事项:
|--适用于接口或父类的某个方法重写后使用次数并不多的情况
|--使用new 父类名/接口名 (){};的形式创建
|--可以理解为匿名类就是个子类,只是用父类名掩盖了子类名
|--正是这种掩盖模式,导致如果用实例变量接收的时候可能会有后续的强转bug存在,所以一般直接点出方法不作对象接收
包装类:
|--包装类存在一个缓冲机制,如果数值在这个缓冲范围内比较的是数据,超过了范围比的是地址(前提是不存在new对象的操作)
基本类型和包装类型,字符串之间的转换:
|--基本类型可以使用包装类的构造函数、包装类的valueof方法转成包装类
|--基本类型可以通过拼接引号、string的valueof方法、包装类的tostring方法转成字符串类
|--包装类可以通过XXXvalue方法转成基本类型
|--包装类可以通过tostring方法转成字符串类型
|--字符串类型可以通过包装类的XXXparse方法转成基本类型
|--字符串类型可以通过包装类的构造方法、包装类的valueof方法转成包装类型
增强for循环的注意事项:
|--其格式为for(数据类型 变量名:容器名){}
|--注意增强for循环无法处理跟下标索引有关的操作,一般只用来遍历
|--它的流程是把循环将容器中的每个元素赋给前面的变量,所以我们定义的数据类型要和容器中的数据一个类型
|--容器必须和迭代器(iterable)发生关系才可以使用增强for
可变参数注意事项:
|--格式为变量名...变量名(底层为数组)
|--可变参只能有一个且要放在形参列表的最后一个
|--由于可变参底层为数组,所以在方法体中使用的时候以数组格式使用即可
jdk5版本新增特新:
|--增强for
|--可变参的应用
|--自动拆装箱
|--泛型的使用
|--线程池
|--lock锁
字符串的注意事项:
|--字符串的内容会被放在一个常量池中(这个常量池根据不同版本所在位置不同)
|--字符串的内容是不可变的,每次改变都会默认新建一个字符串对象,并不会影响之前的字符串对象
|--只有常量池和常量池之间的比较才有可能为真,但凡有其他变量参加比较必为false
|--可以理解为常量池是一个公用空间,如果所放入常量池中的结果之前就有相同的,必然直接引用之前的,不然会出现重名问题,但堆中各个空间都是独立的,即使同名也不影响
字符串缓冲区:
|--分为stringbuilder(不安全但效率高),stringbuffer(安全但效率低)
|--append可以拼接到最后,insert可以添加到任意位置
|--delete删全部,deleteCharAt删除指定的
|--天生带有reverse取反方法
|--这两个缓冲区可以反复修改但只占用一个空间,不会反复创建对象
系统类简单了解:①System的currentTimeMillis()方法可以返回毫秒数
②Runtime可以通过getRuntime()、totalMemory()、freeMemory()分别返回当前运行对象,内存总量,内存空闲量(注意后两个方法是通过前一个方法得到的对象来调用的)
迭代器的注意事项:
|--可以理解为为容器复刻了一个模板,然后在这个模板上进行相关的操作,底层会自动将其映射到真实的数据中去(结合医院拍片理解)
|--在迭代器内不能使用容器本身自带的各种修改方法
|--具有hasNext(判断是否还有元素)、next(指向下一个元素并返回元素值)
|--注意迭代器是消耗品,用完后要用的话得重新创建
容器中取范围时注意事项:
|--一般规则都是包头不含尾
哈希存储的介绍:
|--存数据时会自动调用生成的哈希值(这个哈希值就会涉及到重写问题),配合算法得到存在哪个位置,若该位置为空直接存,否则执行equals(也涉及重写),判断是否与已经存在的元素相等,相等的话不存入,不相等的话以链式的方式接在这个位置(相当于这个位置存多个元素)
|--会用到equals是一个保底操作,因为哈希值返回的是一个整形数据,必然有边界,而且每种类型哈希算法不同,还是很有可能会冲突的(即出现哈希值相同但元素实际不同的情况)
集合的比较:
|--collection为单列集合,其下面有list和set两个派系,list主要处理有序且可重复的情况,set主要处理无序且不重复的情况
|--注意用的多的是arraylist和hashset,其他的子类因为多了独有操作所以效率必然变低
|--list特有一些跟索引有关的操作(尤其是其具有独特的迭代器,可以处理逆序、迭代内部添加替换等操作)
|--注意用list迭代器逆序时要重新指向index的值
|--linkedlist具有独特的对首尾的操作
|--arraylist和linkedlist的区别:
|--一个底层是数组,侧重查询,一个底层是链表,侧重增删
|--hashset依靠hashcode和equals达到无需和不重复的效果
|--注意如果是自定义类要自己重写这两个方法
|--linkedhashset在hashset的基础上多了一层链式结构,所以虽然存入无序但取出的时候可以根据链表结构模拟出正确的顺序(因为涉及hashset故也涉及重写的问题)
|--treesset不涉及hashcode和equals,它依靠比较器进行比较,所以特殊需求下需要自己添加比较器,可以理解为按特殊规则排序了所以导致跟原来的顺序不一样(注意因为是靠比较器比较,所以存入的数据必须是同一个类型)
|--map为双列集合,以键值对的方式存入
|--注意键不可以重复但值可以重复且map集合不能使用迭代器和增强for
|--在hashmap和linkedhashmap中可以将null作为键和值;在propertities中可以将string作为键和值
|--map集合使用keyset获取键值集合,使用valuse获取值集合,使用entryset获取键值对集合
|--注意使用这些方法转成其他集合后就可以使用迭代器和增强for了
泛型的注意事项:
|--泛型适用于类、接口、方法中存在属性或者参数类型未知的情况(注意定义在不同位置作用域也是不一样的)
|--类和接口的泛型定义于名字背后,方法的泛型定义于返回值之前
|--注意形参位置的泛型必须使用大写字母,实参位置的泛型必须使用引用类型
|--如果只是方法中形参列表的参数要用到泛型可以使用通配符?代替(其实与在方法上定义泛型,在列表处引用效果一样,只是更为简化)
|--泛型(包括通配符)可以配合extends和super限定所能接收类型的范围
|--注意jdk1.7版本之后创建对象时等号右边的那个泛型可以省略
异常注意事项:
|--try{}catch(){}用于解决异常,而throws用于声明异常(可以理解为暂时忽视),所以throws最终还是要用try..catch进行解决的
|--throw是直接抛出一个异常(可以理解为我们就是想在这个地方触发异常,且一般我们会抛出自定义的异常类)
|--finnally代码块尝尝配合异常捕获一起使用,它当中的代码是一定会被执行的
|--注意如果try..catch当中已经有了return,则会把目前到return为止的代码备份,先去执行finnally,最后再执行之前备份好的数据,这也就解释了为什么有时候finnally中的代码影响不到最终返回的结果
|--注意如果是finnally中已经有return了,则会用这个return代替try..catch中的return
|--注意自定义异常类的时候通常是继承,序列号,super联用
日期类常用方法:
|--通过无参有参构造获得日期对象(注意有参构造中传的是时间戳)
|--可以用gettime和settime获取或者设置时间戳(进而改变日期对象)
|--注意使用System的currenttimemillis方法也有同样效果
|--日期格式化类是个抽象类,所以我们一般使用他的子类simpledateformate调用formate(把日期类转化为字符串),parse(把字符串转化为日期类)
|--注意simpledateformate类在创建的时候就要将日期的输出模板传给它
日历类常用方法:
|--可以new一个calendar或者gregoriancalendar对象(二者效果基本一样,但后者在创建的时候可以直接传年月日等信息做到初始化的效果)
|--有了日历类对象后可以调用getinstance方法获得当前时区日历,并通过get(XXX)获取指定字段的值,set(XXX)设置指定字段的值
|--日历类调用gettime可以变成日期类,调用settime(日期)可以把日期类转成日历类
|--日历类调用add(字段,xxx)可以给指定字段加减一段时间
File类常用方法:
|--其构造方法有(字符串,字符串),(文件路径,字符串),(字符串)三种重载形式
|--注意其获取操作一般有两种,一种是返回字符串形式,一种是返回文件形式,具体情况具体分析
|--注意mkdir方法只能创建单级文件夹,若想同时创建多级文件夹应选用mkdirs
|--注意其删除文件只能一级一级删,且不走回收站
|--注意其length的方法就是获取这个文件的大小
|--注意file不做路径本身是否存在的判断,除非调用exist方法判断
文件过滤器:
|--自定义过滤器类继承FileFilter类
|--重写accept(注意FileFilter判断是否过滤的标准是看返回的值是true还是false)
|--一般配合listFiles(过滤器对象)一起使用,返回一个file数组
|--使用时根据需求可以将过滤器写成匿名内部类的形式
I/O流注意事项:
|--根据流向可以分为输入输出,
|--根据处理类型可以分为字节流(stream)和字符流(reader/writer)
|--根据位置可以分为节点流和处理流(我们一般说真正对数据进行读写的那个流为节点流,包裹节点流的为处理流,但千万注意这个概念是相对的)
|--注意只要用记事本软件打开是乱码的都不是字符文件(字节流为万能流,字符流只包含字符的领域)
|--在输入操作的时候为了能有更好的效率我们通常采用 read(byte[] b) 和 write(byte[],起始位置,有效长度)的方法进行读取和写入
|--注意如果是write的缓冲类,则可以直接用readline的方法读一行而不需要定义数组
|--注意可以把缓冲类理解为用一个流包裹了节点流,数据先都写到缓冲流中,再由缓冲流一次性操作,以此提高效率
|--注意字符的write操作后一定要进行flush或者close,否则可能出现读不全的情况(但一般用flush,因为close之后就不能再写了)
|--注意转换流在使用的时候是可以对文件的编码值进行操作的
|--注意在输出流中加换行建议使用\r\n或者newline方法
|--注意还有对象流、数据流、打印流这几个特殊流
|--对象流主要用来包裹节点流完成序列化,但要注意在需要序列化的类中要完成序列化引入及编码
|--数据流唯一注意点就是它可以写入各种类型但读出的顺序和写入的顺序必须一致
|--打印流包含scanner和printstream
|--scanner不仅可以实现我们经常用的输入流,也是可以指定输出到某个file文件中的(注意scanner读取的时候需要与hasnextline和nextline配合使用,有点像迭代器)
|--printstream可以配合print和println将内容输入至文件中
并行和并发的注意点:
|--单核cpu不可能存在并行,我们看到的并行效果都是高并发产生的(又称伪并行)
线程的小点:
|--每个线程都会开辟一个栈内存(又称线程栈)
|--一个进程包含多个线程
|--注意main方法也是一个线程
|--注意jvm自带一个回收线程
|--线程的常用方法有run、start、currentthread、getname、setname、getpriority、setpriority(XXX)、yield(礼让行为)、join(强行加入)、sleep、stop
|--线程的生命周期有创建、就绪、运行、堵塞、终止五个阶段
线程的创建方式:
|--继承thread类从而得到一个线程类并在该类中重写run方法,要使用时直接new这个线程类并调用方法即可
|--实现runnable从而得到一个实现类(并在该类中重写run方法),由于实现类无法替代线程类,故我们要使用时还是得new一个thread类,将runnable的实现类作为参数传进去,后续直接用thread实例调用方法即可使用线程
|--实现Callable从而得到一个实现类(并在该类中重写call方法),接着创建futuretask对象,将实现类作为参数传进去,最后再创建thread对象,将futuretask对象作为参数传进去,后续直接用thread实例调用方法即可使用线程
|--注意这种方式虽然麻烦但是可以通过futuretask对象的get方法获得线程运行后的返回值
|--通过 Executors.newFixedThreadPool(个数)创建线程池,然后通过submit(runnaable实现类对象)方法开启线程,通过shutdown方法关闭线程,有点类似共享单车,可以重复利用
synchronized的注意事项:
|--锁住的对象必须是一个共享的资源(一般会用class或者this)
|--非静态同步方法的话锁的就是this,静态同步方法的话锁的就是class,都是隐式存在锁对象
|--注意只有使用了同步机制,才有可能出现死锁
lock锁注意事项:
|--需要我们人为的创建一个Reentrantlock对象,并人为的调用lock方法开启锁,unlock方法关闭锁
wait和notify、notifyall注意事项:
|--这三者又被称作线程通信
|--这三者都是object中的方法(为的就是所有对象都可以对其进行调用)
|--这三者只能使用在同步机制中,且只能被对应的锁对象进行调用(尤其要注意如果不用锁对象去调用,默认的是用this调用)
|--注意wait是会释放锁资源的,而sleep不会
函数式接口:
|--如果一个接口中只有一个抽象方法(注意可以有多个其他非抽象方法),那这个接口就称为函数式接口
|--一般来说函数式接口会用注解functioninterface修饰
JDK8后出现的重要函数式接口:
|--Supplier:供应商接口,其抽象方法get无参数有返回值
|--Consumer:消费者接口,其抽象方法accept有参数无返回值
|--Predicate:判别式接口,其抽象方法test有参数有返回值
|--Function:类型转换接口,其抽象方法apply有参数有返回值
lambda表达式对函数式接口匿名内部类使用上的优化:
|--可以简写成(XX,XX,...)->{方法体}
|--如果参数只有一个则可以不用写()
|--如果方法体只有一行则{}、return、;这三元素可以选择同时写或者不写
Stream流的注意事项:
|--stream和IO流不同,它是一种思想,一总链式的思想(可以理解为把集合或数组拷贝一份放到流水线上进行各种操作)
|--stream针对的只有集合和数组
|--集合通过集合名调用stream方法即可创建流,数组则需要通过Arrays.Stream(数组名)来创建流,也可以直接Stream.of(XXX,XXX,XXX)创建流
|--stream常用的方法有filter、count、limit、skip、map、foreach(一般参数都是函数式接口,故考虑用lambda表达式)
|--每次调用一个流的延续性方法都会关闭之前的流并且返回一个新的流,若是一些终结性方法则连新的流也不会生成
|--集合过渡到并发流直接调用parallstream方法即可,数组过渡到并发流需要先变成普通流,再由普通流调用parallel方法进行转换
|--想用集合收集流中的元素可以调用collect(Collector x),x可以通过Collectors调用toList或者toSet方法获得
|--想用数组收集流中的元素可以调用toArray()或者toArray(IntFunction<A[]> x),注意这里的IntFunction<A[]>为一个函数式接口,其抽象方法会自动将流中元素的个数作为参数
枚举类注意事项:
|--枚举类是JDK1.5新特性,用于优化多例设计模式
|--普通类中能写的成员,枚举类中也能写(但要注意枚举类中常量对象必须定义在第一行,且默认为静态,构造函数默认为私有)
|--枚举类不能作为抽象类但可以有抽象方法,故其抽象方法的实现要使用匿名内部类来完成(不能作为抽象类是因为其功能本身就和抽象类很像,故不可重复定义)
|--枚举相关的常用方法有tostring(返回枚举常量的名称)、name(返回枚举常量的名称)、compareTo(通过下标比较两个枚举对象大小)、ordinal(返回次枚举对象的下标)
|--其实枚举类的常量底层也是自动执行了构造方法,在调用的时候会隐式给你掉对应的get方法,所以其实逻辑上和普通多例模式一样,只是写法上优化了
双盒测试了解:
|--黑盒测试只关注结果,白盒测试更关注优化(因为能到白盒测试这一步必然已经满足结果)
Junit单元测试5大方法:
|--Test、After、Before、AfterClass、BeforeClass
|--注意跟类有关的测试只能是静态方法,其他的只能是非静态方法,且被测试的本方法不能有形参和返回值
注解注意事项:
|--定义格式为public @interface XXX{}
|--注解中只能定义变量不能定义方法,且注解中变量名后面要带()
|--要为注解中的变量赋默认值只能依赖于default关键字
|--注解中可以定义的数据类型为8种基本类型+String+Class+枚举类+注解类+这些类型对应的一维数组
|--元注解可以理解成注解的配置文件,包括Target(用于设置注解的使用位置)、Retention(用于设置注解的生命周期)
|--若是注解中只有一个变量且变量名为value的话,在外部赋值的时候可以省去变量名
属性集Properties常用方法:
|--setProperty(设置集合内容)
|--stringPropertyNames(返回集合中所有key到一个set集合中),
|--getProperty(根据key得到对应的value)
|--load(根据输入流读取文件内容到集合中)
|--store(根据输出流将集合内容写到文件中)
反射获取Class对象三种方法:
|--对象.getClass()
|--类名.class
|--Class.forName()
反射获取成员对象三组方法:
|--getField()
getDeclaredField()
|--getMethod()
getDeclaredMethod()
|--getConstructor()
getDeclaredConstructor()
|--注意带Declared的可以访问所有权限成员对象,不带的只能访问公开的成员对象
|--注意如果方法后面是带s的可以获取指定种类的所有对象,并返回数组形式
|--注意可以通过在参数中添加字符串或者数据类型.class来指定要获取的是哪一个对象(这是为了解决可能出现重载的问题)
反射构造对象常用方法:
|--newInstance(XXX,XXX):通过获取到的构造对象new出实例对象
|--setAccessible(boolean):设置相应对象的权限是否被限制
|--invoke():运行方法
|--isAnnotationPresent(XXX.class):判断该语句上面是否存在指定注解,返回值为布尔类型
|--getAnnotatiion(XXX.class):得到该语句上面的注解对象