疑惑

  最近一段学习中遇到的问题,发现有好多容易混淆的类、概念或名字相近的类或方法。简单总结如下:

  1、java.lang.Math和java.math

  Math是一个类名,位于java.lang包中,是我们平常所说的数学类。Math类包含执行基本数学运算的方法。如基本指数、对数、平方根和三角函数等。而且Math类里面的所有属性和方法都是用static修饰的,也就是说,我们可以直接通过类名.的方式去调用Math类里面的属性和方法;

  math不是类名,它只是包名的一部分,由它组成一个包名为java.math的包,里面有为数不多的几个类。如:BigDecimal等一些需要特殊处理的大浮点数字和BigInteger大数字类。

  2、方法重载和方法重写

  方法重载:英文名overload,发生在同一个类中,为一种行为提供多种实现方式并提高可读性,与修饰符列表和返回值均无关,且要求方法名称相同,参数列表(参数的个数、类型和顺序)不同,与抛出异常无关。

  方法重写:英文名override,发生在子类和父类之间,因父类方法无法满足子类的需求,子类通过方法重写满足自身需求,要求重写方法的子类修饰符要大于等于父类的修饰符(也就是访问权限),子类的返回值要小于等于父类的返回值,且要求方法的名称和参数列表(参数的个数、类型和顺序)均相同,子类抛出的异常要小于等于父类抛出的异常。

  3、this和super

  this是对象内部指代自身的引用

  (1)this可以调用成员变量,通常为了解决成员变量和局部变量的同名冲突问题;

  (2)this可以调用成员方法;

  (3)this可以在构造方法中调用重载的构造方法,且必须是构造方法的第一条语句。

  super代表对当前对象的直接父类对象的引用

  (1)super可以调用直接父类的成员变量(注意权限修饰符的影响,比如不能访问直接父类的private成员变量);

  (2)super可以调用直接父类的成员方法(注意权限修饰符的影响,比如不能访问直接父类的private成员方法);

  (3)super可以调用直接父类的构造方法,只限构造方法中使用,且必须是第一条语句。

  4、java.sql.Date和java.util.Date

  java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许JDBC将毫秒值标识为 SQL DATE值。毫秒值表示自1970年1月1日00:00:00GMT以来经过的毫秒数。为了与SQL DATE的定义一致,由java.sql.Date实例包装的毫秒值必须通过将小时、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

  JAVA里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含2019/03/21 5:00:57 PM的字段,读取日期时得到的是2019/03/21,而读取时间时得到的是5:00:57 PM。你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。比如以下操作中容易出现不易被发现的BUG:获得一个JAVA里的日期对象。从数据库里读取日期,试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用equals方法可能返回false。

  总之,java.util.Date就是Java的日期对象,而java.sql.Date是针对SQL语句使用的,只包含日期而没有时间部分。

  5、throw和throws

  (1)作用不同:throw用于程序员自行产生并抛出异常;throws用于声明在该方法内抛出了异常;

  (2)使用的位置不同:throw位于方法体内部,可以作为单独语句使用,throws必须跟在方法参数列表的后面,不能单独使用;

  (3)内容不同:throw抛出一个异常对象,且只能是一个,throws后面跟异常类,而且可以有多个。

  6、final、finally、finalize的区别

  (1)final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改(常量)。被声明为final的方法也同样只能使用,不能重写;

  (2)finally在异常处理时提供finally块来执行任何清除操作。如果有finally的话,则不管是否发生异常,finally语句都会被执行;

  (3)finalize方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。finalize()方法是在垃圾收集器删除对象之前被调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。

  7、==和equals的区别和联系

  ==:

  (1)基本类型,比较的是值

  (2)引用类型,比较的是地址

  (3)不能比较没有父子关系的两个对象

  equals():

  (1)系统类一般已经覆盖了equals(),比较的是内容

  (2)用户自定义类如果没有覆盖equals(),将调用父类的equals(比如是Object),而Object的equals的比较是地址(return (this == obj);)

  (3)用户自定义类需要覆盖父类的equals(),注意:Object的==和equals比较的都是地址,作用相同

  8、Arrays.sort()和Collections.sort()

  Arrays类位于java.util包中,Arrays类中有一大堆重载的sort()方法,它们都是用static修饰的,可以直接使用类名来调用,Arrays.sort()方法主要操作数组相关的排序;

  Collections类也位于java.util包中,Collections类中有两个重载的sort()方法,它们都是用static修饰的,可以直接使用类名来调用,Collections.sort()方法主要操作List列表相关的排序。

  9、Collection和Collections

  Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。

  Collections是Java类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

  10、Comparable和Comparator

  Comparable是位于java.lang包中的接口,实现Comparable接口的类必须实现compareTo(...)方法。Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。

  Comparator是位于java.util包中的接口,实现Comparator接口的类必须实现compare(...)方法。Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

  Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

posted @ 2019-03-22 20:26  吴永吉  阅读(262)  评论(0编辑  收藏  举报