Java核心技术卷1读书笔记
2019-01-06 本文已影响13人
第四单元
第3章 Java的基本程序设计结构
-
文档注释以/*开始以/结束
-
四种整型 int 32位 short 16位 long 64位 byte 8位。全是有符号整数;和c/c++相比优点是机器无关,即在任何机器上其都是固定的位数;int范围-2147483648到2147483647;short范围-215到215-1即-32768到32767;long范围-263到263-1;byte范围-128到127;short范围是-32768到32767
-
数字字面量的类型:加后缀L的为long,如40L;加前缀0x的为十六进制数,如0xAA;加前缀0的为八进制数,如010表示十进制数8;(Java7)加前缀0b的为二进制数,如0b1001表示十进制数9。
-
(Java7)为了方便读出数字可以给数字字面量加上下划线,如1_000_000
-
两种浮点类型float和double。一般字面量默认为double类型,除非加上F后缀。一般使用double处理数据,float使用情况较少。
-
boolean类型有true和false两个值。整型和布尔值之间不能相互转换。
-
变量名由应为字母,数字,下划线,和美元符号组成,且不能以数字打头。
-
StringBuilder可以用来构建字符串。采用String加号连接字符串的方式过于低效。
StringBuilder bullder = new StringBuilder();builder.append('a'); //可以加一个字符
builder.append("ello"); //也可以加一个字符串
String str = builder.toString(); //hello,获取String对象
- BigInteger类,大整数,可以表示任意大的整数,实现了任意精度的整数运算;BigDecimal实现了任意精度的浮点数运算
- 数组:使用int [] ints = new int[100]; String [] strs = new String[100];的形式创建数组。创建一个数字数组时,所有元素都初始化为0。boolean数组的元素初始化为false,对象数组的元素初始化为null
- java中允许数组的长度为0: int [] a = new int[0]; 数组a长度为0和a为null是不同的概念。
- String[] strs = {"hello","hi","good night","wow"};
- new String[] {"hello","hi","good morning"}; 创建一个新的数组,可以赋给数组
- Arrays.toString(arr); 返回数组的String形式。Arrays.sort(arr); 对数值型数组进行排序。Arrays.binarySearch(arr,a);//二分查找
- 多维数组
double[][] b = new double[2][10];
int [][] a= { {1,2}, {3,4}}
Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”,即数组的元素还是数组。数组的每一行可以有不同的长度:可以先指定数组的行,再分别指定其列如:
double[][] a = new double[5][]
for(int i = 0; i < a.length; i++) {
a[i] = new double[i+1];
}
第4章 对象与类
- GregorianCalendar 日历对象
- Date 时刻
- final。如果将字段(非静态)设置为final则必须保证每个构造器执行完后,这个字段的值都会被设置,并且在后面的操作中不会被修改。
- 常用的System.out.println()中的out就是System中的一个static final静态常量。
- Math.PI是另一个static final常量。
- 什么时候使用静态方法(加static),这个方法不需要对象的字段,所有参数都是外部传入的;这个方法内部只用到类的静态域字段。
- 设计一个每个对象有唯一id字段的类:
class Employee {
private static int nextId;
private int id = assignId();
private static int assignId() {
int r = nextId;
nextId++;
return r;
}
}
- 在一个构造器中可以通过this(参数列表)调用类的另一个构造器,但这个语句必须是第一个语句。
- 和静态域类似,静态块也是在类加载时就被执行。所以可以写一个不带main函数饿hello world程序
public class HelloWorldWithoutMain {
static {
System.out.print("Hello,World!");
}
} //并没有试验成功,衰
- 文档注释以/开头以/结尾。有类注释域(字段)注释、和方法注释。标记有@author表示作者,@parm 参数;@return 返回值;@throws抛出异常描述。这些标记多用于方法。类注释和域注释一般不写标注(?),直接是/* */之间的内容
第5章 继承
- 继承的一个原则是子类和父类具有is-a即是的关系。
- 子类自动拥有父类的所有字段和方法;在子类方法中使用super.方法名()可以显示地调用父类的方法,常用在覆写父类方法的时候。
- 抽象类不能被实例化,因为有抽象方法未实现;抽象类一般设计来被继承,子类来实现部分或全部抽象方法;如果只实现了部分抽象父类中的抽象方法,那么子类也必须声明为抽象的,只有实现了抽象父类的全部抽象方法子类才能被声明为非抽象的;
- 如果不对方法编写实现代码,那么可以将方法声明为abstract(抽象的)。含有抽象方法的类也必须是抽象的,应该用abstract声明。
- 除了含有不带实现代码的抽象方法,不能被实例化,抽象类和其他父类没差别?字段、具体方法啥的也正常被继承。
- 关键字extends表示继承:class Manager extends Employee {} //Manager类继承Employee类。
- 子类会继承父类的域、方法。但不能访问其private内容,但有。如Manager只能通过public的get方法来访问父类中的私有字段。
- 在子类方法中可以通过super.方法名()来调用父类方法。在构造函数中可以通过super(参数)来调用父类构造函数(必须是第一条语句)。
- 如果不想一个类被继承,可以用final修饰它。如果不想子类覆盖特定的方法,可以使用final修饰该方法。
- 枚举
- 最简单的使用public enum Size{SMALL,MEDIUM,LARCE,EXTRA_LAREC};
- 所有枚举类型都是Enum类的子类
- toString()返回枚举常量名,如Size.SMALL.toString()返回字符串"SMALL"
- 静态方法valueOf(): Size s =Enum.valueOf(Size.class,"SMALL");
- 静态方法values(),返回包含全部么枚举值的数组。如:Size[] values = Size.values();
第6章 接口与内部类
- 接口中所有方法自动默认为public的,所有域自动默认为public static final的不用显示地声明。
- Double.compare(x,y)用来比较double数据x,y的大小,x > y 是返回1 x < y 是返回-1 x==y是返回0。
- Arrays.sort()可以给数组排序。入参为数组。给数值型数组(int short long byte double float?)排序时按照数字从小大小的顺序。也可以给对象排序Arrays.sort(Object[]) 这是传入的对象数组应该实现Comparable<T>接口,这个接口只有一个方法声明public int compareTo(T o) 按照类似Double.compare()的方式编写。另外,如果是给集合类排序可以使用Collections.sort()方法,如下:
Collections.sort(stuYears,new Comparator<String>() {
@Override
public int compare(String o1,String o2) {
Integer x1 = Integer.valueOf(o1);
Integer x2 = Integer.valueOf(o2);
return x1 > x2 ? 1 : -1;
}
});
- 接口不能被实例化。但可以声明一个接口变量,可以具体引用实现了这个接口的类。
- instance of是一个二元操作符。用来判断检查一个对象是否是某个类的实例,或者是否实现了某个接口。
- 一个类只能extend(继承)一个父类,但能implement多个接口。
- 抽象类与接口的区别:抽象类是一种特殊的类,不能被实例化,含有抽象方法,抽象方法只有声明没有实现,一个类只能最多继承一个抽象类。接口不是类,一般只有一些方法的声明,类可以实现implment多个接口,也可以有字段,接口中的
第11章 异常、断言、日志和调试
- 在java中,异常对象都是派生于Throwable类的一个实例。从Throwable派生出Error类和Exception类。其中Error类描述了java运行时内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。
- Exception又可以分为两部分,一部分是RuntimeException,它是由程序错误导致的异常,如越界访问数组、访问空指针等。其余的异常是为另一类。应尽力避免RuntimeException异常的出现(通过检查空指针,确保数组不越界等)。
- 派生于Error或RuntimeException类的所有异常成为未检查(unchecked)异常。其它异常都为已检查(checked)
- 可以在方法后用throws关键字表明这个方法可能抛出的异常,特别是在方法调用了一个抛出已检查异常的方法或程序中用throw语句抛出一个已检查异常。throws后可跟多个异常,用逗号隔开。
- 一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)
- 通常,应该捕获(try catch)那些知道如何处理的异常,而将那些不知道怎样处理的异常继续进行传递(throws)。
第12章 泛型程序设计
- 泛型对于集合类尤其有用
- 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。
- 在java7之后,构造函数中可以省略泛型类型:ArrayList<String> strs = new ArrayList<>();
- 给集合指定类型确保了,一个集合中只能添加一种类型的数据
- 使用Java提供的集合类是容易的,但自己设计一个泛型类是困难的。