Java 核心技术卷I 笔记(2)

###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);
}

####继承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

猜你喜欢

转载自blog.csdn.net/weixin_41761478/article/details/88094014