[随手记]Java核心卷1-第3-5章

时间:2023-01-10 16:17:53

第三章
Java的基本程序设计结构

  1. 数据类型
    a.整形
    int 4字节 取值范围:-2 147 483 648 ~ 2 147 483 647 (正好超过20亿)
    short 2字节 取值范围:-32 768 ~ 32 767
    long 8字节 取值范围:-9 223 372 036 854 775 808 ~9 223 372 036 854 775 807
    byte 1字节 取值范围:-128~127
    b.浮点类型
    float 4字节
    double 8字节
    浮点数值计算,溢出和出错情况的三个特殊的浮点数值:正无穷大,负无穷小,NaN(不是数字)
    计算0/0或者负数的平方根 结果为:NAN
    判断是不是数字: Double.isNaN(x)
    c.char类型
    和unicode有关 /u开头
    在java中,char类型描述了UTF16编码中的一个代码单元。
    强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。
    char和unicode的关系: https://blog.csdn.net/pacosonswjtu/article/details/51113322
    d.boolean类型
    true false

2.变量
3.常量
在java中,用final关键字指示常量。eg. final int NUM = 2; 常量名使用全大写,final表示只能赋值一次。
在java中,如果希望某个常量可以被一个类中的多个方法使用,通常被称为:类常量。eg. public static final NUM = 1;

4.运算符
+-*/ 数学函数

5.数值类型之间的转换
规则:
有高精度的操作数(long float double)时,另外一个,会转换会高精度的。其他的(如:byte short char),都会转为int.

6.强制类型转换
double x = 0.999;
int nx = (int) x;
..。
7.格式化输出
java SE 5.0 沿用了C语言库函数中的printf方法。
double x = 3333.33333333333333333335
eg. System.out.printf(“%8.2f”,x);
表示:用8个字符的宽度和小数点后两个字符的精度打印x。
输出结果:x: 3333.33
具体参考:https://www.cnblogs.com/huhx/p/javaFormatter.html

8.数组初始化
int[] arr = {1,2,3,4};
arr = new int[] {4,5,6,7,8}; //new int[] {4,5,6,7,8} —>匿名数组。在不创建新变量的时候,重新初始化数组

9.不规则数组
int[][] odds= new int[][]{{1},{2,3},{4,5,6},{11,2,1,1,1,1}}; //每行数组的长度不一样
在java中,实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。


第四章
对象与类
PS:第四章略过5小点,从对象构造开始记录。

对象构造:
1.重载:如果多个方法相同名字不同参数,便产生了重载。
NOTE:不能有两个相同名字、参数也相同却返回不同类型值的方法。(返回值不计入重载的特征中)
2.初始化块:
eg:
class A{
private int a;
private int sum;
private String name;
//代码块
{
sum = a++; //每次实例A对象(new)都会调用一次代码块。
} // 执行调用的顺序比构造器要早。
public A(String name){
this.name = name;
}
}


第五章
继承
该章节知识点:类、超类、子类、object、泛型数组列表、对象包装器与自动装箱
参数数量可变的方法、枚举类、反射、继承的设计技巧。

1、已存在的类 称为 超类、基类或父类
新类称为子类、派生类或者孩子类。
java程序员最常使用的术语:超类、子类
2、super关键字,和this引用不是一样的概念,super不是一个对象的引用,不能讲super赋给另外一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字。
3、覆盖方法,在子类可以增加域、增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。
4、子类构造器
//超类
public class A{
public A(int a,string b){}
}
//子类
public class B extends A{
public B(int a,string b){
super(a,b); //这里不写super带参的时候,默认会调超类的无参构造器
}
}
这里的super具有不同的含义,它是“调用超类A中含有a,b参数的构造器”的简写形式。

NOTE:如果超类没有不带参数的构造器(超类里都是带参数的构造器),而子类的构造器又没有显示的调用超类的其他构造器时(子类没有写super,走默认,会默认调用超类无参构造器),编译会报错。

回忆:
this有两个用途:一是引用隐式参数,二是调用该类其他的构造器;
super也有两个用途:调用超类的方法,二是调用超类的构造器。

5、多态
……略
“is-a”规则的另一种表述法是置换原则。它表明程序中出现超类对象的任何地方都可以用子类对象置换。

6、受保护访问
控制可见的4个访问修饰符:
a、private–仅对本类可见
b、public–对所有类可见
c、protected–对本包和所有子类可见
d、默认,不需要修饰符——-对本包可见

7、java语言规范要求equals方法具有的特性:
a、自反性:对于任何非空引用x, x.equals(x)应该返回true; //自己调用自己,返回true;
b、对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true;
c、传递性:对于任何引用x,y和z,如果 x.equals(y)应该返回true,y.equals(z)应该返回true,那么,
x.equals(z)也应该返回true;
d、一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果;
e、对于任意非空引用x,x.equals(null)应该返回false。

8、完美的equals方法编写建议:
给出以下编写建议:


    a、显式参数命名为oherObject,稍后需要将它转换成另一个叫做other的变量。
    b、检测this与oherObject是否引用同一个对象:
    if (this == otherObject) return true;
    这条语句只是一个优化。实际上,这是一种经常采用的形式。因为计算这个等式要比一个一个地比较类中的域所付出的代价小得多。
    c、检测otherObject是否为null,如果为null,返回false。这项检测是很有必要的。
    If(otherObject == null)return false;
    d、  比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,  就使用getClass检测:
    if(getClass != otherObject.get Class)return false;
    如果所有的子类都拥有统一的语义,就使用instanceof检测:
    if(!(otherObject instanceof ClassName)) return false;
    e、将otherObject转换成相应的类类型变量:
    ClassName other = (ClassName) othrerObject
    f、现在开始对所有需要比较的域进行比较。使用==比较基本类型域。使用equals比较对象域。如果所有的域都匹配,就返回true;否则返回false。
    如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。

9、※反射※
反射机制的作用:
a、在运行时分析类的能力;
b、在运行时查看对象;
c、实现通用的数组操作代码;
d、利用Method对象,这个对象很像C++中的函数指针。