###Java 笔记
######3/3
####基础知识
- 整型字节数不变
- 不要使用char
- 整数型和布尔值之间不能相互抓换
if(x=0)
不能通过编译 - final表示常量,且常量名一般全大写
final double PAY_EFFORT=2.4
- 字符串不可以被修改
- 码点和代码单元
- 代码单元数量
stringname.length()
- 码点数量
codePointCount(0,stringname.length())
- 返回第i个代码单元
.charAt(i)
- 第i个码点
- 代码单元数量
int index=stringname.offsetByCodePoints(0,i);
int cp=stringname.codePointAt(index);
- 构建字符串:StringBuilder类 append方法 toString方法
- 输入输出:
- 加入包
import java.util.*;
Scanner in=new Scannner (System.in);
调用方法nextLine、next……
- 加入包
- 文件输入与输出
- 读取
Scanner in=new Scanner(Paths.get("filename.txt"),"UTF-8");
- 输出
PrintWriter out=new PrintWriter("filename.txt","UTF-8");
- 读取
- 嵌套块中不能有相同的变量
- 一次性跳出多重循环
- 大数值运算 BigInterger:add/multiply/valueOf
- for each循环
for(type element:a)
- 数组复制Arrays.copyOf(arrayname,length)
- 不能通过arrayname+1得到下一个数据
####类和对象
- java的对象变量相当于c++的指针,是对对象的引用
- java对象都是在堆中构造的,构造器与new!
- 方法中的变量名不能与实例域变量名相同
- 所有方法都在内部定义
- final关键词用于修饰可变类时,指的是该变量引用不会指向其他对象,但是自身可以变化(append之类)
- 在方法的实现中对于实例域常常加上this区分
- 静态方法不能访问对象实例域,只能访问类的静态域
- 一个方法可以不能改变基本数据类型参数;可以改变对象参数状态;不能改变对象参数所引用的对象
- 在构造器中通过this()可调用另一个构造器
- 若静态域初始化代码复杂,则
static
{
Random generator=new Random();
nextId=generator.nextInt(1000);
}
- 要从基目录编译和运行类:加上路径
javac c:\xx\xx\xx.java
- javac编译器搜索的是文件路径,和环境变量classpath无关。而java虚拟机搜索的是类文件,严格地说是类,搜索路径由环境变量classpath决定,且有先后顺序。
- 注释格式:方法注释
/**……*/
@param
@return
@see package.class#方法或变量
- more:[https://blog.csdn.net/vbirdbest/article/details/80296136]
####继承extends
- 所有继承都是公有继承
- 子类不能访问超类的私有域(尽管自身也继承来了一个私有域),要通过超类的公共接口
super.getxx()
- 子类构造器第一句
super(xx,xx,……)
使用超类构造器 - 超类对象变量也可引用子类对象(多态),但编译器仍将其视为超类对象,不能调用子类特有方法
- 方法调用:每个类有一个方法表
- 阻止类继承:public final class xx
- 阻止子类覆盖方法:public final xx()
- 强制类型转换前检查:instanceof
- 抽象类:abstract;抽象类不能实例化,其对象变量引用的是其子类对象,可调用抽象方法
- Objects中的equal方法:
- 比较实例域:Objects.equals()防止变量可能为null
- instanceof当不是同一个类时是true,但在调用equals时会不满足“相等的对称性”
- 如果由超类决定相等的判定,则可用instanceof检测且超类的equals函数用final修饰;otherwise(equals会被各个子类覆盖时)->getClass
- 定义超类equals函数的方法
显示参数命名为otherObject
检测this和otherObject是否为引用同一个对象
检测otherObject是否为null
检测this和otherObject是否为同一类(上一条)
将otherObject用强制类型转换换成相应类型
开始对所有域进行比较:==比较基本类型域,Objects.equals()比较对象域
// 子类的equals方法中应首先调用超类的equals
if(!super.equals(otherObject)) return false;
Classname other=(Classname) otherObject;
return xx=other.xx;
- Objects中的hasCode方法:定义应当和equal保持一致
- 超类:Objects.hash(xx,xx,xx)
- 子类:super.hashCode()+y*Classname.hashCode(xx)
- Objects中的toString方法:子类定义了toString之后
- 当对象遇到“+”时相当于调用toString
- System.out.println(对象)
- 给每一个自定义的类增加toString方便获得对象状态信息
Public String toString()
{
return getClass().getName()+"[name="+……;
//if so,当子类覆盖超类的toString时可以直接调用super.toString
}
- 泛型数组列表
- ArrayList name=new ArrayList<>(potential capacity);
- name.add(new Type(xx,xx));
- name.ensureCapacity();
- name.trimToSize();
- name.set(i,value);
- name.get(i);
- name.remove(i);
- 对象包装器:比如int被包装成Integer类
- 自动装箱:list.add(n)自动转换成list.add(Integer.valueOf(n))
- 自动拆箱:list.get(i)->list.get(i).intValue()
- 不定项参数理解为数组,so若已定义函数中最后一个参数为数组,可修改为不定项参数
Type...args