Java核心技术卷1读书笔记

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

  1. 文档注释以/*开始以/结束

  2. 四种整型 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

  3. 数字字面量的类型:加后缀L的为long,如40L;加前缀0x的为十六进制数,如0xAA;加前缀0的为八进制数,如010表示十进制数8;(Java7)加前缀0b的为二进制数,如0b1001表示十进制数9。

  4. (Java7)为了方便读出数字可以给数字字面量加上下划线,如1_000_000

  5. 两种浮点类型float和double。一般字面量默认为double类型,除非加上F后缀。一般使用double处理数据,float使用情况较少。

  6. boolean类型有true和false两个值。整型和布尔值之间不能相互转换。

  7. 变量名由应为字母,数字,下划线,和美元符号组成,且不能以数字打头。

  8. StringBuilder可以用来构建字符串。采用String加号连接字符串的方式过于低效。

StringBuilder bullder = new StringBuilder();builder.append('a');  //可以加一个字符
builder.append("ello"); //也可以加一个字符串
String str = builder.toString(); //hello,获取String对象
  1. BigInteger类,大整数,可以表示任意大的整数,实现了任意精度的整数运算;BigDecimal实现了任意精度的浮点数运算
  2. 数组:使用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"}; 创建一个新的数组,可以赋给数组
  1. Arrays.toString(arr); 返回数组的String形式。Arrays.sort(arr); 对数值型数组进行排序。Arrays.binarySearch(arr,a);//二分查找
  2. 多维数组
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章 对象与类

  1. GregorianCalendar 日历对象
  2. Date 时刻
  3. final。如果将字段(非静态)设置为final则必须保证每个构造器执行完后,这个字段的值都会被设置,并且在后面的操作中不会被修改。
  4. 常用的System.out.println()中的out就是System中的一个static final静态常量。
  5. Math.PI是另一个static final常量。
  6. 什么时候使用静态方法(加static),这个方法不需要对象的字段,所有参数都是外部传入的;这个方法内部只用到类的静态域字段。
  7. 设计一个每个对象有唯一id字段的类:
class Employee {
    private static int nextId;
    private int id = assignId();
    private static int assignId() {
        int r = nextId;
        nextId++;
        return r;
    }
}
  1. 在一个构造器中可以通过this(参数列表)调用类的另一个构造器,但这个语句必须是第一个语句。
  2. 和静态域类似,静态块也是在类加载时就被执行。所以可以写一个不带main函数饿hello world程序
public class HelloWorldWithoutMain {
    static {
        System.out.print("Hello,World!");
    }
}  //并没有试验成功,衰
  1. 文档注释以/开头以/结尾。有类注释域(字段)注释、和方法注释。标记有@author表示作者,@parm 参数;@return 返回值;@throws抛出异常描述。这些标记多用于方法。类注释和域注释一般不写标注(?),直接是/* */之间的内容

第5章 继承

  1. 继承的一个原则是子类和父类具有is-a即是的关系。
  2. 子类自动拥有父类的所有字段和方法;在子类方法中使用super.方法名()可以显示地调用父类的方法,常用在覆写父类方法的时候。
  3. 抽象类不能被实例化,因为有抽象方法未实现;抽象类一般设计来被继承,子类来实现部分或全部抽象方法;如果只实现了部分抽象父类中的抽象方法,那么子类也必须声明为抽象的,只有实现了抽象父类的全部抽象方法子类才能被声明为非抽象的;
  4. 如果不对方法编写实现代码,那么可以将方法声明为abstract(抽象的)。含有抽象方法的类也必须是抽象的,应该用abstract声明。
  5. 除了含有不带实现代码的抽象方法,不能被实例化,抽象类和其他父类没差别?字段、具体方法啥的也正常被继承。
  6. 关键字extends表示继承:class Manager extends Employee {} //Manager类继承Employee类。
  7. 子类会继承父类的域、方法。但不能访问其private内容,但有。如Manager只能通过public的get方法来访问父类中的私有字段。
  8. 在子类方法中可以通过super.方法名()来调用父类方法。在构造函数中可以通过super(参数)来调用父类构造函数(必须是第一条语句)。
  9. 如果不想一个类被继承,可以用final修饰它。如果不想子类覆盖特定的方法,可以使用final修饰该方法。
  10. 枚举
  • 最简单的使用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章 接口与内部类

  1. 接口中所有方法自动默认为public的,所有域自动默认为public static final的不用显示地声明。
  2. Double.compare(x,y)用来比较double数据x,y的大小,x > y 是返回1 x < y 是返回-1 x==y是返回0。
  3. Arrays.sort()可以给数组排序。入参为数组。给数值型数组(int short long byte double float?)排序时按照数字从小大小的顺序。也可以给对象排序Arrays.sort(Object[]) 这是传入的对象数组应该实现Comparable接口,这个接口只有一个方法声明public int compareTo(T o) 按照类似Double.compare()的方式编写。另外,如果是给集合类排序可以使用Collections.sort()方法,如下:
    Collections.sort(stuYears,new Comparator() {
            @Override
            public int compare(String o1,String o2) {
                Integer x1 = Integer.valueOf(o1);
                Integer x2 = Integer.valueOf(o2);
                return x1 > x2 ? 1 : -1;
            }
        });
  1. 接口不能被实例化。但可以声明一个接口变量,可以具体引用实现了这个接口的类。
  2. instance of是一个二元操作符。用来判断检查一个对象是否是某个类的实例,或者是否实现了某个接口。
  3. 一个类只能extend(继承)一个父类,但能implement多个接口。
  4. 抽象类与接口的区别:抽象类是一种特殊的类,不能被实例化,含有抽象方法,抽象方法只有声明没有实现,一个类只能最多继承一个抽象类。接口不是类,一般只有一些方法的声明,类可以实现implment多个接口,也可以有字段,接口中的

第11章 异常、断言、日志和调试

  1. 在java中,异常对象都是派生于Throwable类的一个实例。从Throwable派生出Error类和Exception类。其中Error类描述了java运行时内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。
  2. Exception又可以分为两部分,一部分是RuntimeException,它是由程序错误导致的异常,如越界访问数组、访问空指针等。其余的异常是为另一类。应尽力避免RuntimeException异常的出现(通过检查空指针,确保数组不越界等)。
  3. 派生于Error或RuntimeException类的所有异常成为未检查(unchecked)异常。其它异常都为已检查(checked)
  4. 可以在方法后用throws关键字表明这个方法可能抛出的异常,特别是在方法调用了一个抛出已检查异常的方法或程序中用throw语句抛出一个已检查异常。throws后可跟多个异常,用逗号隔开。
  5. 一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)
  6. 通常,应该捕获(try catch)那些知道如何处理的异常,而将那些不知道怎样处理的异常继续进行传递(throws)。

第12章 泛型程序设计

  1. 泛型对于集合类尤其有用
  2. 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。
  3. 在java7之后,构造函数中可以省略泛型类型:ArrayList strs = new ArrayList<>();
  4. 给集合指定类型确保了,一个集合中只能添加一种类型的数据
  5. 使用Java提供的集合类是容易的,但自己设计一个泛型类是困难的。

你可能感兴趣的:(Java核心技术卷1读书笔记)