
JAVA基础重温笔记
文章平均质量分 75
mufeng_慕枫
学会放空自己,每一次都以一个初学者的态度踏上下一个征程!
展开
-
JAVA程序运行时 对象的放置安排及内存的分配
程序运行时,对象是怎样放置安排的呢?特别是内存是怎样分配的呢?对这些方面的了解会对你有很大的帮助。有五个不同的地方可以存储数据: 1.寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象(另一方面,C和C++允许您向编译器建议寄存器的分配方式)。原创 2015-07-16 21:39:59 · 885 阅读 · 1 评论 -
包括继承的类的初始化及类的加载二(附源码)
前言 在许多传统语言中,程序是作为启动过程的一部分立刻被加载的。然后是初始化,紧接着程序开始运行。这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦。例如C++中,如果某个static期望另一个static在被初始化之前就能有效地使用它,那么就会出现问题。 Java就不会出现这个问题,因为它采用了一种不同的加载方式。加原创 2016-07-06 14:34:14 · 1198 阅读 · 0 评论 -
包括继承的类的初始化及类的加载一(附源码)
前言 在许多传统语言中,程序是作为启动过程的一部分立刻被加载的。然后是初始化,紧接着程序开始运行。这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦。例如C++中,如果某个static期望另一个static在被初始化之前就能有效地使用它,那么就会出现问题。 Java就不会出现这个问题,因为它采用了一种不同的加载方式。加原创 2016-07-06 11:33:57 · 1060 阅读 · 0 评论 -
引入多态后构造器的调用顺序
前言 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是有意义的,因为构造器具有一项特殊任务:检查对象是否被正确的构造。导出类只能访问它自己的成员,不能访问基类中的成员(基类成员通常是private类型)。只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此,必须令所有构造器都得到调用,否则原创 2016-07-08 15:35:22 · 1740 阅读 · 0 评论 -
Java之内部类的继承(附源码)
前言 因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,事情会变得有点复杂。问题在于,那个指向外围类对象的“秘密的”引用必须被初始化,而在导出类中不再存在可连接的默认对象。要解决这个问题,必须使用特殊的语法来明确说清它们之间的关系:示例源码package com.mufeng.thetenthchapter;class原创 2016-08-03 15:23:50 · 849 阅读 · 0 评论 -
Java之通过继承来扩展接口
示例源码 通过继承,可以很容易地在接口中添加新的方法声明,还可以通过继承在新接口中组合数个接口。这两种情况都可以获得新的接口,就像在下例中看到的:package com.mufeng.theninthchapter;interface Monster {// 怪物 void menace();// 威胁}interface DangerousMonste原创 2016-07-20 15:57:49 · 3380 阅读 · 0 评论 -
Java之内部类可以被覆盖吗详解(附源码)
前言 如果创建了一个内部类,然后继承其外围类并重新定义此内部类时,会发生什么呢?也就是说,内部类可以被覆盖吗?这看起来似乎是个很有用的思想,但是“覆盖”内部类就好像它是外围类的一个方法,其实并不起什么作用:示例源码1package com.mufeng.thetenthchapter;class Egg { private Yolk y; publ原创 2016-08-04 10:21:54 · 1742 阅读 · 0 评论 -
Java之局部内部类和匿名内部类的区别详解(附源码)
前言 前面提到过,可以在代码块里创建内部类,典型的方式是在一个方法体里面创建。局部内部类不能有访问说明符,因为它不是外围类的一部分;但是他可以访问当前代码块内的常量,以及此外围类的所有成员。下面的例子对局部内部类与匿名内部类的创建进行了比较。示例源码package com.mufeng.thetenthchapter;interface Coun原创 2016-08-04 11:38:10 · 2664 阅读 · 2 评论 -
Java之嵌套接口详解(附源码)
示例源码接口可以嵌套在类或其他接口中。这揭示了许多非常有趣的特性:package com.mufeng.theninthchapter;class A { interface B { void f(); } public class BImp implements B { @Override public void f() { // TODO原创 2016-07-21 11:51:08 · 3999 阅读 · 0 评论 -
Java之接口与工厂详解一(附源码)
前言 接口是实现多重继承的途径,而生成遵循某个接口的对象的典型方式就是工厂方法设计模式。这与直接调用构造器不同,我们在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某个实现的对象。理论上,通过这种方式,我们的代码将完全与接口的实现分离,这就使得我们可以透明地将某个实现替换成另一个实现。下面的实例展示了工厂方法的结构:示例源码package com原创 2016-07-21 16:50:51 · 2293 阅读 · 0 评论 -
Java之接口与工厂详解二(附源码)
前言 如果不是用工厂方法,你的代码就必须在某处指定将要创建的Service的确切类型,以便调用合适的构造器。 为什么我们想要添加这种额外级别的间接性呢?一个常见的原因是想要创建框架:假设你正在创建一个对弈游戏系统,例如,在相同的棋盘上下国际象棋和西洋跳棋:示例代码package com.mufeng.theninthchapter原创 2016-07-21 17:07:45 · 2000 阅读 · 0 评论 -
Java之内部类与向上转型详解(附源码)
前言 当将内部类向上转型为其基类,尤其是转型为一个接口的时候,内部类就有了用武之地。(从实现了某个接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。)这是因为此内部类----某个接口的实现----能够完全不可见,并且不可用。所得到的只是指向基类或者接口的引用,所以能够很方便地隐藏实现细节。示例接口 我们原创 2016-07-26 11:21:11 · 1131 阅读 · 0 评论 -
Java容器类类库基本概念详解
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上原创 2016-08-06 10:07:03 · 1417 阅读 · 0 评论 -
Java如何向容器中添加一组元素详解(附源码)
前言 在java.util包中的Arrays和Collections类中都有很多实用方法,可以在一个Collection中添加一组元素。Arrays.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数),并将其转换为一个List对象。Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的元素列表原创 2016-08-06 15:53:42 · 2726 阅读 · 3 评论 -
Java之用继承进行设计详解(附源码)
前言 学习了多态之后,看起来似乎所有东西都可以被继承,因为多态是一种如此巧妙的工具。事实上,当我们用现成的类来建立新类时,如果首先考虑使用继承技术,反倒会加重我们的设计负担,使事情变得不必要地复杂起来。 更好的方法是首先选择“组合”,尤其是不能十分确定应该使用哪一种方式时。组合不会强制我们的程序设计进入继承的层次结构中。而且,组合更加灵活,因为它可以动态选择类型原创 2016-07-16 12:00:04 · 1432 阅读 · 0 评论 -
Java之协变返回类型详解(附源码)
前言 Java SE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型:示例源码package com.mufeng.theeighthchapter;class Grain { @Override public String toString() { // TODO Auto-generated me原创 2016-07-16 11:25:20 · 1255 阅读 · 0 评论 -
构造器内部的多态方法的行为详解(附源码)
前言 构造器调用的层次结构带来了一个有趣的两难问题。如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,那会发生什么情况呢?在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的那个类,还是属于那个类的导出类。 如果要调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。然而,这个调用的效果可能相当难于预料,原创 2016-07-15 16:02:32 · 1051 阅读 · 0 评论 -
Java对象赋值原理详解(下)附实例源码
上节我们探讨了Java中对象的赋值原理,在此基础上引出了“别名现象”这一概念。本节将要讲解的是“方法调用中的别名问题”,将一个对象传递给方法时,也会产生别名问题。下面的这个例子将向大家阐释这一点:package assignment;class Letter { char c;}public class PassObject { static void f(Letter y)原创 2015-07-18 11:07:35 · 1243 阅读 · 1 评论 -
Java对象赋值原理详解(上)附实例源码
对基本数据类型的赋值是很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另一个地方。例如对基本数据类型使用a=b,那么b的内容就复制给a。若接着修改了a,而b根本不会受到这种修改的影响。作为程序员,这正是大多数情况下我们所期望的。 但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是对对原创 2015-07-18 10:06:14 · 2039 阅读 · 1 评论 -
关系操作符(测试对象的等价性:判断对象的引用相等或对象的实际内容相等)附带源码
关系操作符生成的是一个boolean(布尔)结果,它们计算的是操作数的值之间的关系。如果关系是真实的,关系表达式会生成true(真);如果关系不真实,则生成false(假)。关系操作符包括小于()、大于(>)、小于或等于()、大于或等于(>=)、等于(==)以及不等于(!=)。等于和不等于适用于所有的基本数据类型,而其他比较符不适用于boolean类型。因为boolean值只能为true或fals原创 2015-07-19 21:50:19 · 964 阅读 · 0 评论 -
操作符--自动递增和递减(前缀式和后缀式的区别、i++和++i区别)
递增和递减运算是两种相当 不错的快捷运算(常称为“自动递增”和“自动递减”运算)。其中,递减操作符是“--”,意为“减少一个单位”;递增操作符是“++”,意为“增加一个单位”。举个例子来说,假设a是一个int(整数)值,则表达式++a就等价于(a=a+1)。递增和递减操作符不仅改变了变量,并且以变量的值作为生成的结果。 这两个操作符各有两种使用方式,通常称为“前缀式”和“后缀式原创 2015-07-19 20:56:39 · 2614 阅读 · 1 评论 -
Java之内部类语法详解(附源码)
前言 可以将一个类的定义放在另一个类的定义内部,这就是内部类。 内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。然而必须要了解,内部类与组合是完全不同的概念,这一点很重要。 在最初,内部类可能看起来比较奇怪,而且要花些时间才能在设计中轻松地使用它们。对内部类的需求并非总是很明显的,但是在描述完原创 2016-07-23 09:58:00 · 861 阅读 · 0 评论 -
Java之内部类的初级应用详解(附源码)
示例源码 在本节中我们将讲述内部类应用中的一个更典型的情况:外部类将有一个方法,该方法返回一个指向内部类的引用,就像在to()和contents()方法中看到的那样。package com.mufeng.thetenthchapter;public class Parcell2 { class Contents { private int i = 11原创 2016-07-23 10:29:44 · 942 阅读 · 0 评论 -
Java之内部类链接到外部类(外围类)详解(附源码)
前言 到目前为止,内部类似乎还只是一种名字隐藏和组织代码的模式。这些是很有用,但还不是最引人注目的,它还有其他用途。当生成一个内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。下面的例子说明了这点:示例源码package com.mufeng原创 2016-07-23 15:34:57 · 2114 阅读 · 0 评论 -
JAVA复用类之组合语法的使用(附源码)
前言 复用代码是Java众多引人注目的功能之一。但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。 上述方法常为C这类过程型语言所使用,但收效并不是很好。正如Java中所有事物一样,问题解决都是围绕类展开的。可以通过创建新类来复用代码,而不必再从头开始编写。可以使用别人业已开发并调试好的类。原创 2016-07-01 11:13:37 · 2940 阅读 · 0 评论 -
JAVA代码重用机制复用类之继承语法(附源码)
前言 继承是所有OOP语言和Java语言不可缺少的组成部分。当创建一个类时,总是在继承,因此,除非已明确指出要从其他类中继承,否则就是在隐式地从Java的标准根类Object进行继承。 组合的语法比较平实,但是继承使用的是一种特殊语法。在继承过程中,需要先声明“新类与旧类相似”。这种声明是通过在类主体的左边花括号之前,书写后面紧随基类名称的关键字exten原创 2016-07-01 16:11:58 · 3308 阅读 · 0 评论 -
Java中包含继承关系时对象的创建与销毁顺序详解(附源码)
前言 通过组合和继承方法来创建新类时,永远不必担心对象的清理问题,子对象通常都会留给垃圾回收器进行处理。如果确实遇到清理的问题,那么必须用心为新类创建dispose()方法(在这里我选用此名称,读者可以提出更好的)。并且由于继承的缘故,如果我们有其他作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖dispose()方法。当覆盖被继承类的dispose()方法时,务必记原创 2016-07-13 11:52:16 · 2459 阅读 · 0 评论 -
java中break和continue的区别详解(附源码)
序言 在自己学习java语言的过程中,很容易把break和continue的用法混淆。为了便于以后快速查阅及温习,在此特留学习笔记一份。简述 在任何迭代语句的主体部分,都可以用break和continue控制循环的流程。其中,break用于强行退出循环,不执行循环中剩余的语句。而continue则停止执行当前迭代,然后退回循环起始处,开始下一次迭代。原创 2016-06-16 09:33:27 · 3028 阅读 · 2 评论 -
Java 中break和continue结合标签标示符中断循环示例详解(附源码)
臭名昭著的goto 编程语言中一开始就有goto关键词了。事实上,goto起源于汇编语言的程序控制:“若条件A成立,则跳到这里;否则跳到那里”。如果阅读由编译器最终生成的汇编代码,就会发现程序控制里包含了许多跳转。(Java编译器生成它自己的“汇编代码”,但是这个代码是运行在Java虚拟机上的,而不是直接运行在CPU硬件上。) goto语句是在源码级上的跳转,这使其原创 2016-06-16 16:07:19 · 3683 阅读 · 3 评论 -
Java中共享对象的创建与销毁详解(附源码)
前言 在上一篇文章的示例中还应该注意到,Frog对象拥有其自己的成员对象。Frog对象创建了它自己的成员对象,并且知道它们存活多久(只要Frog存活着),因此Frog对象知道何时调用dispose()去释放其成员对象。然而,如果这些成员对象中存在于其他一个或者多个对象共享的情况,问题就变得更加复杂了,你就不能简单地假设你可以调用dispose()了。在这种情况下,也就必需使用原创 2016-07-15 10:52:28 · 920 阅读 · 1 评论 -
Java递归删除目录及目录下的文件
我们知道File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除,具体代码示例如下: /** * 递归删除目录下的所有文件及子目录下的所有文件 * * @param file 将要删除的文件目录 * @return 如果所有文件都删除成功则返回true, 有一个文件删除失败就停止删除并返原创 2017-03-20 10:08:06 · 3276 阅读 · 1 评论