部分常识
dos指令(win和Linux上删除指令不太一样
java环境变量设置,尽量不要设置出中文名称变量,后续会影响路径读取
public只能修饰一个类,且该类的名称和文件名称一致,同一文件中可以有多个类
类、方法、常量的基本命名规范和规则
标识符:java 对类名 方法名 变量名 包名 等命名时采用的字符序列。
在java中凡是需要自己命名的位置都是标识符
标识符命名规则:
由字母数字下划线美元符组成,且数字不能开头
不能用保留字和关键字
严格区分大小写
命名规范
看到名字要知道这玩意大概啥意思
类名各个单词首字母大写
方法(函数)名第二个单词首字母大写(其之后的所有单词首字母大写)
包名小写
常量全部大写
命名规则:
1.字母数字下划线 美元符 组成
2.数字不能开头
3.不能是java中的关键字或者保留字
4.严格区分大小写
命名规范:
1.见名之意
2.类 每一个单词的首字母大写
3.方法 变量 等 第一个单词的首字母小写 从第二个单词开始 首字母大写
4.包 所有字母小写
5.常量 所有的字母大写 多个单词组成 使用下划线连接
局部变量需要初始化,即放在方法中的变量要初始化
放在方法外的因为其是类变量所以可以不做初始化
ASCLL码:0:48,A:65,a:97
byte,short,char三者任意之间运算,结果都会转换为int类型
+=,-=,/=,%=之类的赋值运算符不会改变原有的数据类型
charAt方法只能接收空格前的数据
nextLine只能跟随nextLine的输入,如果上一输入不是nextLine则会中断
随机数公式
Math.random()*(n-m+1)+m
取值范围[m,n]
循环控制部分
switch(数据){}
数据中可以放的数据类型char,int,String,short,byte,枚举
do{循环体}while();
一般先执行一次循环体的内容,再进行条件判断
循环选择
for适用条件 循环次数固定
while 循环次数不固定
do while 初始化条件不满足循环条件,但仍执行一次循环
嵌套循环内break
如果没有标签,则结束当前break所在层循环,如果有标签,结束标签所在循环
标签
l: for(i=0;i<x;i++){
for(j=0;j<x;j++){
if(a==b)
brake l;}}
嵌套循环内continue
面向对象
包(package)命名
名称小写
模块名+网址(不用www倒叙:com.baidu)
静态成员变量与非静态成员变量
相同
都有默认值
都是类变量
方法
形参:
存在:方法声明处
规定调用出传递的实参类型、个数、顺序
在定义方法时方法名后面括号中声明的变量称为形式参数(简称形参)即形参出现在方法定义时。
形参是基本数据类型,
那么实参给形参的是数据值的副本,形参的修改不影响实参;
重载
定义:同一个类中,允许存在多个同名方法,只要其参数个数或参数类型不同
两同一不同
同一个类,同一个方法名
不同的参数类型或参数个数
对象数组
类似二维数组,但其内部存储的是一个对象(对象内部又有其他的属性)
递归
直接递归
间接递归
注意点
递归需要有出口
不断的向出口靠近
当递归次数过多时,会出现StackOverflowError错误
封装
访问控制权限
封装的作用
防止出现垃圾数据,可以对属性进行封装
private 数据类型 变量名,同时也要提供方法去改变或者获取该变量
利用this区别成员变量和局部变量
构造器
构建方法
[修饰符] 类名(形参列表){方法体}
继承
注意点:
继承的子类在使用资源时,一般现在本类中寻找,如果没有则到父类(上一级)中寻找,不断往上,直到object
一个类没有显示的继承一个类,那么这个类默认继承object类
Java中的继承是单继承,一个类只能直接继承另一个类。但可以多重继承(深度,一脉单传)
关于私有属性,其子类不能直接调用和使用(但可以通过getXxxxx/setXxxxx整活)
成员初始化赋值
默认赋值
显示赋值
和代码块看谁在前,谁前谁先(静态例外)
多态
前提
有继承
有方法重写
native
被native 修饰的方法
本地方法
public native int hashCode();
final
final修饰的类 不能被继承 不能有子类 声明方式 final class 类名
final 修饰的方法 不能被重写 声明方式 public final void eat(){}
final的注意点
修饰的变量 变为 常量
修饰的对象 地址值不能改变
修饰的成员变量 可以显示赋值 也可以通过构造器赋值
但需要注意的是:这个只能赋值一次,类似初始化,之后就不能修改了
object
其为所有类的根父类
任意对象 都可以使用Object类中的方法
数组也是对象 也可以使用
除了Object 类之外 所有的类 都可以写出向上转型的关系
抽象类
抽象:既不具体,也无法具体
抽象类声明方法:abstract class 类名{}
抽象方法:规定子类行为
权限修饰符 abstract 返回值类型 方法名(形参);
接口
用来定义规范 has a 的关系
接口声明:interface 接口名{ }
使用:class 类名 implements 接口名{ }
接口成员
接口属性是全局静态常量,其默认被public static final修饰
接口的抽象方法,默认被public、abstract修饰
接口内可以有静态的方法,默认被public修饰
接口内有默认方法 哪一个实现类需要重写 直接重写即可 不会对其他类造成影响,其默认被 public 修饰
声明方式【public 可有可无】 default 返回类型 方法名
那个实现类需要则重写,不会对其他类造成影响
内部类
成员内部类(不常用)
常见于源码
声明方式
外部类名{ class 内部类名{ } }
单元测试
@Test,有网络的情况下
单元测试必须是公共的类
单元测试必须是公共的方法
方法名无要求
不要混杂其他无关内容
数组
一维数组
初始化:
动态:type[] var=new type[length];var[0]=x;var[1]=y;····
通俗讲就是声明与赋值分开进行,相对常用点。即只知道数组长度,不知道具体元素内容
异常
异常的体系结构
Throwable
Error:程序员不需要处理的异常
Exception : 程序员处理的异常(这个是编译时异常)
运行时异常:代码真正跑起来 才会出现的异常
数组下标越界
空指针
算数异常
类型转换
输入不匹配
两个比较好用的方法
getMessage();获取发生异常的原因
printStackTrace();发生异常的原因
异常的抛出
try { 可能发生异常的代码 }catch(异常类型 变量名){ 异常解决方案 }
注意
1.try中发生了异常 那么 异常下面的代码不会执行 直接进到 catch内
2.try{} 是有作用域限制 想要在其他位置使用需要进行作用域提升
3.只有发生了对应的异常类型 才可以进行捕获
4.想要捕获多个异常
4.1 使用 | 进行连接 catch(异常类型1 | 异常类型2 | .... 变量名)
4.2多重catch
4.3使用父类
如果存在多重catch 一定按照 从小到大的顺序写
继承关系的异常抛出
父类抛出的是运行时异常 子类抛出异常没有约束
父类抛出的是编译时异常 子类不能抛出比父类更大的异常
自定义异常
1.新建一个类型 继承一个异常类型
编译时异常 继承一个编译时异常类
运行时异常 继承一个运行时异常类
单元测试如何使用
注意:
1.单元测试方法 必须是 公共的类
2.单元测试方法必须是 公共的方法
3.方法名无要求
4.单元测试类 不要混杂其他内容
@Before 运行单元测试方法前 会执行的内容
@After 运行单元测试方法后 会执行的内容
异常处理注意事项
编译期异常必须处理,要么捕获处理,要么声明在方法上,让调用者处理。
运行时异常被抛出可以不处理。即不捕获也不声明抛出。
try语句范围要尽量小的包围在可能出现异常的一行或几行代码上,不要把大量无异常的代码一起包起来,虽然这样很省事。
catch语句捕获的异常类型要尽量小,尽量精准,好针对性的做处理。
如果finally有return语句,永远返回finally中的结果,但要避免该情况.
如果父类方法抛出了多个异常,子类重写父类方法时不能抛出更大异常,可以抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。
float a=3.14f;此处需要加上f/F
long a=234l;此处需要加上l/L
输入不匹配异常,在输入中,接收int但输入double等
输入
next()方法:
遇到空格等空白符,就认为输入结束
witch不能作用long,JDK1.7可以String
break:只能用在switch和循环内
continue:只能在循环内
数组长度为Arr.length,其最后一个元素的索引为Arr.length-1
字符串比较中,==比较的是字符串的内存地址,字符串相等用q1.equals(q2)
数组定义
int[] len=new int[length]
此处动态声明有长度
对象实例化要在main中
private是不同包下的子类可见,注意是在类中可见,而不是对象中可见
静态方法没有重写(static)
空指针不能调用对象方法,(返回是一个空null,不能调用一些方法,会报空指针异常)
导model时维持原文件名一致
新建一个类对象时,会先加载父类的资源,然后才会加载子类的资源(static另外考虑,会先加载static的,然后按照这个考虑)
静态资源无法通过this调用
代码块声明的变量有作用域
枚举中的属性,必须位于枚举元素的下边,枚举类的构造器默认私有
泛型不能放基本数据类型
单元测试,@before 是个很好玩的东西
Comparable内部比较器
泛型只能放包装类型
Java 中的两种排序方式:
Comparable 自然排序。(实体类实现)
Comparator 是定制排序。(无法修改实体类时,直接在调用方创建)
同时存在时采用 Comparator(定制排序)的规则进行比较。
对于一些普通的数据类型(比如 String, Integer, Double…),它们默认实现了Comparable 接口,实现了 compareTo 方法,我们可以直接使用。
而对于一些自定义类,它们可能在不同情况下需要实现不同的比较策略,我们可以新创建 Comparator 接口,然后使用特定的 Comparator 实现进行比较。
comparable自然顺序
comparator杂乱的顺序也可以
run和start不能一起调用
子类异常不能抛出,原因有子类重写父类方法,不能抛出比父类更大的异常(父类没抛出异常,子类也不能)
本憨憨以前学习的是Python,所以对于Java中很多问题都感觉很熟悉,但有时候会找不到解决方法,很多时候多是依靠百度,做题时,或多或少会受到之前Python语法上的苦恼(语法要求格式不同,语法也有一定差异),虽然Java学起来相对有点吃力(以前Python学的也不是很好,做的一些爬虫和数据分析挖掘相关的,但人很菜),但总体来讲还是有较大收获,还在持续学习和梳理后面多线程那些的笔记,不确定还会不会想起来放出来。
由于是我临时想发布,之前用的幕布写的,复制出来不是md格式,所以一些笔记还没有做好排版,后续如果有时间会做下排版问题。