天天看点

JavaSe一个月一些笔记和感想

部分常识

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格式,所以一些笔记还没有做好排版,后续如果有时间会做下排版问题。