09 2021 档案
摘要:类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。 1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。 2. void shuffle(List) //对List容器内的元素进行随机排
阅读全文
摘要:【示例】遍历List方法一:普通for循环 1 2 3 4 for(int i=0;i<list.size();i++){//list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp); } 【示例】遍历List方法
阅读全文
摘要:迭代器为我们提供了统一的遍历容器的方式,参见以下示例代码: 【示例】迭代器遍历List 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class Test { public static void main(String[] args) {
阅读全文
摘要:TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素。 TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。 【示例
阅读全文
摘要:HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。我们来看一下HashSet的源码: 我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是
阅读全文
摘要:大家在做下面练习时,重点体会“Set是无序、不可重复”的核心要点。 【示例】HashSet的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Test { public static void main(String[] args) { Set<Str
阅读全文
摘要:Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。我们在前面通过List学习的方法,在Set中仍然适用。因此,学习Set的使用将没有任何难度。 Set容器特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重
阅读全文
摘要:TreeMap是红黑二叉树的典型实现。我们打开TreeMap的源码,发现里面有一行核心代码: 1 private transient Entry<K,V> root = null; root用来存储整个树的根节点。我们继续跟踪Entry(是TreeMap的内部类)的代码: 可以看到里面存储了本身数据
阅读全文
摘要:二叉树的定义 二叉树是树形结构的一个重要类型。 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。 二叉树(BinaryTree)由一个节点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组
阅读全文
摘要:HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们以后理解很多技术都非常有帮助(比如:redis数据库的核心技术和HashMap一样),因此,非常有必要让大家理解。 数据结构中由数组和链表来实现对数据的存储,他们各有特点。 (1) 数组:占用空间连续。 寻址容易,查询速度快。但
阅读全文
摘要:HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。 【示例】Map接口中的常用方法 1 2 3 4 5 6 7 8 9 10 11 12 1
阅读全文
摘要:现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。 Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。 Map 接口的实现类有HashMap、TreeM
阅读全文
摘要:LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。 双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。 每个节点都应该有3部分内容: 1 2 3
阅读全文
摘要:Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。 老鸟建议 如何选用ArrayList、LinkedList、Vector? 1. 需要线程安全时,用Vector。 2. 不存在线程安全问
阅读全文
摘要:ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它。查看源码: 我们可以看出ArrayList底层使用Object数组来存储元素数据。所有的方法,都围绕这个核心的Object数组来开展。 我们知道,数组长度是有限的,而ArrayList是可以存放任意
阅读全文
摘要:List是有序、可重复的容器。 有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。 可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。 除了Collection接口中的
阅读全文
摘要:Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。 表9-1 Collection接口中定义的方法 由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。我们下一节中,通过ArrayL
阅读全文
摘要:我们可以在类的声明处增加泛型列表,如:<T,E,V>。 此处,字符可以是任何标识符,一般采用这3个字母。 【示例】泛型类的声明 1 2 3 4 5 6 7 8 9 10 class MyCollection<E> {// E:表示泛型; Object[] objs = new Object[5];
阅读全文
摘要:容器相关类都定义了泛型,我们在开发和工作中,在使用容器类时都要使用泛型。这样,在容器的存储数据、读取数据时都避免了大量的类型判断,非常便捷。 【示例】泛型类的在集合中的使用 1 2 3 4 5 6 7 8 9 public class Test { public static void main(S
阅读全文
摘要:开发和学习中需要时刻和数据打交道,如何组织这些数据是我们编程中重要的内容。 我们一般通过“容器”来容纳和管理数据。那什么是“容器”呢?生活中的容器不难理解,是用来容纳物体的,如锅碗瓢盆、箱子和包等。程序中的“容器”也有类似的功能,就是用来容纳和管理数据。 事实上,我们第七章所学的数组就是一种容器,可
阅读全文
摘要:JDK1.5引入了枚举类型。枚举类型的定义包括枚举声明和枚举体。格式如下: 1 2 3 enum 枚举名 { 枚举体(常量列表) } 枚举体就是放置一些常量。我们可以写出我们的第一个枚举类型,如示例所示: 【示例】创建枚举类型 1 2 3 enum Season { SPRING, SUMMER,
阅读全文
摘要:本节结合前面给大家讲的递归算法,展示目录结构。大家可以先建立一个目录,下面增加几个子文件夹或者文件,用于测试。 【示例】使用递归算法,以树状结构展示目录树 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
阅读全文
摘要:java.io.File类:代表文件和目录。 在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到本类。 File类的常见构造方法:public File(String pathname) 以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统
阅读全文
摘要:java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型。如果需要更加强大的数学运算能力,计算高等数学中的相关内容,可以使用apache commons下面的Math类库。 Math类的常用方法: 1. abs 绝对值 2. acos,asin,at
阅读全文
摘要:Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年、月、日、时、分、秒的展示和计算。 GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。 菜鸟雷区 注意月份的表示,一月是0,二月是1,以此类推,12月
阅读全文
摘要:·DateFormat类的作用 把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。 DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。 【示例】DateFormat类和SimpleDateFormat类的使用 1 2 3 4 5 6
阅读全文
摘要:在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间,精确到毫秒。 1. Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒)。 2. Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoc
阅读全文
摘要:“时间如流水,一去不复返”,时间是一个一维的东东。所以,我们需要一把刻度尺来表达和度量时间。在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一),如图所示。 我们用long类型的变量来表示时间,从基准时间往前几亿年,往后几亿年都能表示。
阅读全文
摘要:· String使用的陷阱 String一经初始化后,就不会再改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。比如: String s ="a"; 创建了一个字符串 s = s+"b"; 实际上原来的"a"字符串对象已经丢弃了,现在又产生了另一
阅读全文
摘要:String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。 那什么叫做“不可变对象”呢?指的是对象内部的成员变量的值无法再改变。我们打开String类的源码,如图8-8所示: 图8-8 String类的部分源码 我们发现字符串内容全部存储到value[
阅读全文
摘要:StringBuffer和StringBuilder非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。我们打开AbstractStringBuilder的源码,如示例8-11所示: 【示例8-11】AbstractStringBu
阅读全文
摘要:整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的是提高效率。 缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时(或者手动
阅读全文
摘要:对于包装类来说,这些类的用途主要包含两种: 1. 作为和基本数据类型对应的类型存在,方便涉及到对象的操作,如Object[]、集合等的操作。 2. 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本数据类型、包装类对象、字符串之间提供相互之间的转化!)。
阅读全文
摘要:自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing)。 自动装箱: 基本类型的数据处于需要对象的环境中时,会自动转为“对象”。 我们以Integer为例:在JDK1.5以前,这样的代码 Integer
阅读全文
摘要:Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。比如:将基本数据类型存储到Object[]数组或集合中的操作等等。 为了解决这个不足,Java在设计类时为每个基本数据类型设计了一个对应的类进行
阅读全文
摘要:正常学习和开发中,我们经常会遇到各种异常。大家在遇到异常时,需要遵循下面四步来解决: 1. 细心查看异常信息,确定异常种类和相关Java代码行号; 2. 拷贝异常信息到百度,查看相关帖子,寻找解决思路; 3. 前两步无法搞定,再问同学或同事; 4. 前三步无法搞定,请示领导。 很多同学碰到异常一下就
阅读全文
摘要:.在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。 2.自定义异常类只需从Exception类或者它的子类派生一个子类即可。 3.自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处
阅读全文
摘要:当CheckedException产生时,不一定立刻处理它,可以再把异常throws出去。 在方法中使用try-catch-finally是由这个方法来处理异常。但是在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。 如果一个方法中可能产生某种异常,但是并不能确定如何处理
阅读全文
摘要:捕获异常是通过3个关键词来实现的:try-catch-finally。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行(catch语句可有多条;fi
阅读全文
摘要:所有不是RuntimeException的异常,统称为Checked Exception,又被称为“已检查异常”,如IOException、SQLException等以及用户自定义的Exception异常。 这类异常在编译时就必须做出处理,否则无法通过编译。如图6-9所示。 如图所示,异常的处理方式
阅读全文
摘要:派生于RuntimeException的异常,如被 0 除、数组下标越界、空指针等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。 因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。 这类异常通常是由编程错误导致的,所以在编写程序时,并不要求
阅读全文
摘要:Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMe
阅读全文
摘要:Exception是程序本身能够处理的异常,如:空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)等。 Ex
阅读全文
摘要:JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。 Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwabl
阅读全文
摘要:在实际工作中,我们遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求;你的程序要打开某个文件,这个文件可能不存在或者文件格式不对;你要读取数据库的数据,数据可能是空的;我们的程序再运行着,但是内存或硬盘可能满了等等。 软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,
阅读全文
摘要:异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。 在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。 所谓异常处理,就是指程序在出现问题时依然可以正确的执行完。 我
阅读全文
摘要:二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功; 否则,若key小,则在数组前半部分中继续进行二分法检索; 若key大,则在数组后半
阅读全文
摘要:其实,我们可以把之前的冒泡排序的算法优化一下,基于冒泡排序的以下特点: 1.整个数列分成两部分:前面是无序数列,后面是有序数列。 2.初始状态下,整个数列都是无序的,有序数列是空。 3.每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加1),也就是不用再去顾及有序序列。 4.
阅读全文
摘要:冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。 算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序算法的运作如下: 1. 比较相邻的元素。如果第一个比第二个大,就交换
阅读全文
摘要:多维数组可以看成以数组为元素的数组。可以有二维、三维、甚至更多维数组,但是实际开发中用的非常少。最多到二维数组(学习容器后,我们一般使用容器,二维数组用的都很少)。 【示例7-15】二维数组的声明 1 2 3 4 5 6 7 8 9 10 public class Test { public sta
阅读全文
摘要:表格数据模型是计算机世界最普遍的模型,可以这么说,大家在互联网上看到的所有数据本质上都是“表格”,无非是表格之间互相套用。如下表格是一张雇员表: 表7-1 雇员表 我们观察表格,发现每一行可以使用一个一维数组存储: 1 2 3 Object[] a1 = {1001,"高淇",18,"讲师","20
阅读全文
摘要:JDK提供的java.util.Arrays类,包含了常用的数组操作,方便我们日常开发。Arrays类包含了:排序、查找、填充、打印内容等常见的操作。 【示例7-10】打印数组 1 2 3 4 5 6 7 8 import java.util.Arrays; public class Test {
阅读全文
摘要:增强for循环for-each是JDK1.5新增加的功能,专门用于读取数组或集合中所有的元素,即对数组进行遍历。 【示例7-8】增强for循环 1 2 3 4 5 6 7 8 public class Test { public static void main(String[] args) { S
阅读全文
摘要:System类里也包含了一个static void arraycopy(object src,int srcpos,object dest, int destpos,int length)方法,该方法可以将src数组里的元素值赋给dest数组的元素,其中srcpos指定从src数组的第几个元素开始赋
阅读全文
摘要:数组元素下标的合法区间:[0, length-1]。我们可以通过下标来遍历数组中的元素,遍历时可以读取元素的值或者修改元素的值。 【示例7-7】 使用循环遍历初始化和读取数组 1 2 3 4 5 6 7 8 9 10 11 12 13 public class Test { public stati
阅读全文
摘要:数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。下面针对这三种方式分别讲解。 1. 静态初始化 除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。 【示例7-4】静态初始化数组 1 2 int[] a = { 1, 2, 3 };// 静态初始化
阅读全文
摘要:【示例7-1】数组的声明方式有两种(以一维数组为例) 1 2 type[] arr_name; //(推荐使用这种方式) type arr_name[]; 注意事项 1. 声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。 2. 声明一个数组的时候并没有数组
阅读全文
摘要:数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的三个基本特点: 1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。 2. 其元素必须是相同类型,不允许出现混合类
阅读全文
摘要:组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 【示例】对象的组合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
阅读全文
摘要:模板方法模式很常用,其目的是在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。在标准的模板方法模式实现中,主要是使用继承的方式,来让父类在运行期间可以调用到子类的方法。 详见抽象类部分示例。 其实在Java开发中,还有另外一
阅读全文
摘要:开闭原则(Open-Closed Principle)就是让设计的系统对扩展开放,对修改封闭。 · 对扩展开放: 就是指,应对需求变化要灵活。 要增加新功能时,不需要修改已有的代码,增加新代码即可。 · 对修改关闭: 就是指,核心部分经过精心设计后,不再因为需求变化而改变。 在实际开发中,我们无法完
阅读全文
摘要:1. equals方法用来检测两个字符串内容是否相等。如果字符串s和t内容相等,则s.equals(t)返回true,否则返回false。 2. 要测试两个字符串除了大小写区别外是否是相等的,需要使用equalsIgnoreCase方法。 3. 判断字符串是否相等不要使用"=="。 【示例】忽略大小
阅读全文
摘要:String类是我们最常使用的类。字符串类的方法我们必须非常熟悉!我们列出常用的方法,请大家熟悉。 表5-2 String类的常用方法列表 【示例】String类常用方法一 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class StringTest1 { pub
阅读全文
摘要:· 如何下载API文档 1. 下载地址,点击进入: http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html 图5-27 API下载界面图 2. 下载成功后,解压下载的压缩文
阅读全文
摘要:在Java的内存分析中,我们会经常听到关于“常量池”的描述,实际上常量池也分了以下三种: 1. 全局字符串常量池(String Pool) 全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。 2.
阅读全文
摘要:1. String类又称作不可变字符序列。 2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类。 3. Java字符串就是Unicode字符序列,例如字符串“Java”就是4个Unicode字符’J’、’a’、’v’、’a’组成的。 4. Java没有内
阅读全文
摘要:在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。 .成员内部类(可以使用private、default、protected、public任意进行修饰。 类文件:外部类$内部类.class) a) 非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不
阅读全文
摘要:一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。 内部类可以使用public、default、protected 、private以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰
阅读全文
摘要:面向接口编程是面向对象编程的一部分。 为什么需要面向接口编程? 软件设计中最难处理的就是需求的复杂变化,需求的变化更多的体现在具体实现上。我们的编程如果围绕具体实现来展开就会陷入”复杂变化”的汪洋大海中,软件也就不能最终实现。我们必须围绕某种稳定的东西开展,才能以静制动,实现规范的高质量的项目。 接
阅读全文
摘要:接口完全支持多继承。和类的继承类似,子接口扩展某个父接口,将会获得父接口中所定义的一切。 【示例】接口的多继承 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 interface A { void testa(); } interface B { void
阅读全文
摘要:声明格式: 1 2 3 4 [访问修饰符] interface 接口名 [extends 父接口1,父接口2…] { 常量定义; 方法定义; } 定义接口的详细说明: 1. 访问修饰符:只能是public或默认。 2. 接口名:和类名采用相同命名机制。 3. extends:接口可以多继承。 4.
阅读全文
摘要:· 为什么需要接口?接口和抽象类的区别? 接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。 抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。 从接口的实
阅读全文
摘要:·抽象方法 使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。 ·抽象类 包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用
阅读全文
摘要:final关键字的作用: 1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。 1 final int MAX_SPEED = 120; 2. 修饰方法:该方法不可被子类重写。但是可以被重载! 1 final void study(){} 3. 修饰类: 修饰的类不能被继承。比
阅读全文
摘要:父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。 向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型! 【示例5-13】对象的转型 1 2 3 4 5 6 7 8 9 10 11 public cla
阅读全文
摘要:多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,高淇老师是敲代码,数学教授是做数学题; 同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。 多态的要点: 1
阅读全文
摘要:类的属性的处理: 1. 一般使用private访问权限。 2. 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。 3. 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的
阅读全文
摘要:Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种“访问控制符”分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。 下面详细讲述它们的访问权限问题。其
阅读全文
摘要:我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。 需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是
阅读全文
摘要:super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。 使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。 若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参
阅读全文
摘要:·属性/方法查找顺序:(比如:查找变量h) 1. 查找当前类中有没有属性h 2. 依次上溯每个父类,查看每个父类中是否有h,直到Object 3. 如果没找到,则出现编译错误。 4. 上面步骤,只要找到h变量,则这个过程终止。 ·构造方法调用顺序: 构造方法第一句总是:super(…)来调用父类对应
阅读全文
摘要:“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。 Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学
阅读全文
摘要:Object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。 【示例】Object类 1 2 3 4 5 6 7 public class Person { ... } //等价
阅读全文
摘要:Object类中定义有public String toString()方法,其返回值是 String 类型。Object类中toString方法的源码为: 1 2 3 public String toString() { return getClass().getName() + "@" + Int
阅读全文
摘要:子类通过重写父类的方法,可以用自身的行为替换父类的行为。方法的重写是实现多态的必要条件。 方法的重写需要符合下面的三个要点: 1.“==”: 方法名、形参列表相同。 2.“≤”:返回值类型和声明异常类型,子类小于等于父类。 3.“≥”: 访问权限,子类大于等于父类。 【示例】方法重写 1 2 3 4
阅读全文
摘要:1.父类也称作超类、基类、派生类等。 2.Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。 3.Java中类没有多继承,接口有多继承。 4.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属
阅读全文
摘要:instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。比如: 【示例】使用instanceof运算符进行类型判断 1 2 3 4 5 6 7 public class Test{ public static void main(
阅读全文
摘要:继承让我们更加容易实现类的扩展。 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可。实现了代码的重用,不用再重新发明轮子(don’t reinvent wheels)。 从英文字面意思理解,extends的意思是“扩展”。子类是父类的扩展。现实世界中的继承无处不在。比如: 图5-1 现实世界
阅读全文
摘要:如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。 注意要点: 1. Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。 2. 如果导入两个同名的类,只能用
阅读全文
摘要:静态导入(static import)是在JDK1.5新增加的功能,其作用是用于导入指定类的静态属性,这样我们可以直接使用静态属性。 【示例】静态导入的使用 1 2 3 4 5 6 7 8 9 10 11 package cn.sxt; //以下两种静态导入的方式二选一即可 import stati
阅读全文
摘要:JDK中的主要包 Java中的常用包 说明 java.lang 包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。 java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建
阅读全文
摘要:我们通过package实现对类的管理,package的使用有两个要点: 1. 通常是类的第一句非注释性语句。 2. 包名:域名倒着写即可,再加上模块名,便于内部管理类。 【示例】package的命名举例 1 2 3 4 5 com.sun.test; com.oracle.test; cn.sxt.
阅读全文
摘要:包机制是Java中管理类的重要手段。 开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理。 包对于类,相当于文件夹对于文件的作用。
阅读全文
摘要:Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。 · 基本数据类型参数的传值 传递的是值的副本。 副本改变不会影响原件。 · 引用类型参数的传值 传递的是值的副本。但是引用类型指的是“对象的地
阅读全文
摘要:构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员。 注意事项: 静态初始化块执行顺序(学完继承再看这里): 1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。 2. 构
阅读全文
摘要:在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点: 1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。 2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共
阅读全文
摘要:· 对象创建的过程和this的本质 构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步: 1. 分配对象空间,并将对象成员变量初始化为0或空 2. 执行属性值的显示初始化 3. 执行构造方法
阅读全文
摘要:建议: 1. 在实际开发中,经常会造成系统的崩溃。如下这些操作我们应该注意这些使用场景。 请大家学完相关内容后,回头过来温习下面的内容。不要求此处掌握相关细节。 如下四种情况时最容易造成内存泄露的场景,请大家开发时一定注意: · 创建大量无用对象 比如,我们在需要大量拼接字符串时,使用了String
阅读全文
摘要:在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC: 1.年老代(Tenured)被写满 2.持久代(Perm)被写满 3.System.gc()被显式调用(程序建议GC启动,不是调用GC) 4.上一次GC之后Heap的各域分配策略动态变化
阅读全文
摘要:分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。 1. 年轻代 所有新生成的对象
阅读全文
摘要:·内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有”不可达”对象的内存空间。 ·垃圾回收过程 任何一种垃圾回收算法一般要做两件基本事情: 1. 发现无
阅读全文
摘要:构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。 【示例4-6】构造方法重载(创建不同用户对象) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class User { int id
阅读全文
摘要:Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解。Java程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率。
阅读全文
摘要:构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。 声明格式: 1 2 3 [修饰符] 类名(形参列表){ //n条
阅读全文
摘要:为了让大家对于面向对象编程有更深入的了解,我们要对程序的执行过程中,内存到底发生了什么变化进行剖析,让大家做到“心中有数”,通过更加形象方式理解程序的执行方式。 建议: 1. 本页是为了让初学者更深入了解程序底层执行情况,为了完整的体现内存分析流程,会有些新的名词,比如:线程、Class对象。大家暂
阅读全文
摘要:【示例】模拟学生使用电脑学习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Computer { String brand; //品牌 } public class SxtStu { // field int id
阅读全文
摘要:方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。 方法定义格式: 1 2 3 [修饰符] 方法返回值类型 方法名(形参列
阅读全文
摘要:属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。 在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。 成员变量的默认值 数据类型 默认值 整型 0 浮点型 0.0 字符型 '\u0000' 布尔型 false 所有引用类型 null 属性定
阅读全文
摘要:【示例】类的定义方式 1 2 3 4 5 6 7 8 9 // 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致! public class Car { } class Tyre { // 一个Java文件可以同时定义多个class } class Engine { }
阅读全文
摘要:我们人认识世界,其实就是面向对象的(此对象可不是男女谈对象的彼对象呀)。比如现在让大家认识一下“天使”这个新事物,天使大家没见过吧,怎么样认识呢?最好的办法就是,给你们面前摆4个天使,带翅膀的美女,让大家看,看完以后,即使我不说,大家下一次是不是就都认识天使了。 图4-1 认识天使 但是,看完10个
阅读全文
摘要:事物的发展总是遵循“量变引起质变”的哲学原则;企业管理和数据管理、甚至社会管理也有很多共通的地方。本节课类比企业发展,让大家更容易理解为什么会产生“对象”这个概念。 ·数据无管理时代 最初的计算机语言只有基本变量(类似我们学习的基本数据类型),用来保存数据。那时候面对的数据非常简单,只需要几个变量即
阅读全文
摘要:面向过程(Procedure Oriented)和面向对象(Object Oriented,OO)都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并
阅读全文
摘要:递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。 利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。 递归结构包括两个部分: 1.定义递归头。解答:什么时候不调用自身方
阅读全文