![](https://img-blog.csdnimg.cn/20190226173956178.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《Java编程思想》新知
细读《Java编程思想》
Alan-zzx
燕雀安知鸿鹄之志哉
展开
-
二十三、泛型语法基础详解
泛型概述一般的类和方法,只能使用具体的类型,如基本类型(int,double等),或者自定义的类。如果想要编写更为通用的代码,这种形式会带来一定的束缚。Java 中的多态实际上已经可以实现一些场景下的通用代码编写,但是多态必须基于继承体系,这使得它也会受一定束缚。一个方法参数为某个接口,那么我们可以将这个接口实现的所有类的对象作为参数,而其他没有实现这个接口的类则无法作为参数。Java SE...原创 2019-07-11 21:32:39 · 386 阅读 · 0 评论 -
二十二、运行时类型信息进阶:反射与动态代理
反射反射是作用于类型信息的,从字面上理解容易想到有反必有正,对于类型信息的操作,常规情况当然是直接拿到这个类,从而创建对象,使用对象。那么相对的,反其道而行之会怎么样呢?首先我们可以在编译时不知道具体的类,甚至是类的原始信息,其次我们应该是通过某种通用工具在运行时去获取类的信息,进行分析拆解和使用。反射所使用的工具 Java 类库中已经提供,在 java.lang.reflect 包下,结合...原创 2019-07-04 21:18:56 · 117 阅读 · 0 评论 -
二十一、运行时类型信息表示:RTTI
RTTIJava 作为面向对象编程语言,运行时的类型信息(RTTI)可以解决很多面向对象编程时的问题。例如现在有一个基类Shape,子类Circle、Square和Triangle均继承自基类Shape,我们可以使用基类的引用来达到一些操作,这样的话如果有扩展新的子类,也不会存在任何问题。这个例子中最大的问题就是为什么我们可以用基类的引用来操纵子类对象,JVM 是如何得知基类和子类的继承关系...原创 2019-07-02 22:20:49 · 169 阅读 · 0 评论 -
二十、内容输入解析器:Scanner
扫描输入文本内容一段程序,可以处理很多类型的数据,因此,在程序开始的阶段,必须要有数据源,简单的情况可以是从控制台输入,也可能是从文本读取,亦或者直接定义字符串读取。在读取文本内容时,如何进行区分各种数据类型呢?因为文本内容均是以字符串存储,若是以字符串读入,那必定需要进行分词,如下代码所示,比较麻烦:public class test { public static Buffere...原创 2019-04-28 22:12:50 · 229 阅读 · 0 评论 -
十九、字符串的格式化输出与正则表达式
格式化输出在 C 语言中,使用 printf 函数将字符串输出到控制台,而 printf 函数支持格式化输出,例如:int main(){ int arr[1,2,3,4,5]; for(int i=0; i<5; i++){ printf("%-4d",arr[i]); }}/*output:1 2 3 4 5 */...原创 2019-04-25 21:12:12 · 1270 阅读 · 0 评论 -
十八、为什么在循环中使用运算符+拼接字符串性能低下
String 类型Java 中自带 String 类型,用于存储字符串,在操作字符串的时候,String 对象实际上是不变的,有点类似 final 修饰的效果。public class test { public static void main(String[] args) { String a = "abc"; String b = fun(a);...原创 2019-04-16 21:50:23 · 482 阅读 · 0 评论 -
十七、浅析Java异常机制
捕获所有异常Java 中异常的超类是 Throwable 类,而除运行时异常外,程序能抛出的异常都属于 Exception 类的子类,因此可以使用 Exception 类来捕获所有程序中抛出的异常。Exception 类自身以及继承自 Throwable 类的常用方法的使用如下:public class text { public static void main(String []...原创 2019-04-11 22:26:28 · 220 阅读 · 0 评论 -
十六、使用自定义异常来定义程序中的错误
概述不管是大型网站、应用还是一个几十行的程序,运行时都会出现一些问题,有的问题比较严重可能导致服务器宕机,而有的问题,并不会导致服务器宕机,但是若是处理不当,很可能会产生数据库数据紊乱,从而发生未知的问题。针对后一种问题,Java 使用了异常来正确处理这些问题。单独使用异常通常可以使错误处理代码简化。相比较而言,C 语言的异常处理并不属于语言本身的一部分,而是需要开发者们约定俗称一套机制,例如...原创 2019-03-20 21:09:02 · 495 阅读 · 0 评论 -
十五、持有对象__Java容器体系
概述Java 类库中的各种容器类是最常用的类之一,上图中展示了 Java 容器类体系结构,其中虚线框代表接口,实线框代表类,实心箭头表示一个类的对象可以产生另一个类的对象,例如 Map 集合可以通过方法得到集合中的键的集合或值的集合。通常容器类分为两个体系和一组工具类:Collection 体系Map体系Collections 和 Arrays 工具类在程序开发中,需要的对象数量...原创 2019-03-12 22:47:21 · 186 阅读 · 0 评论 -
十四、内部类详解(下)
为什么要使用内部类一般情况,内部类是一个接口或者类的实现,并且可以作为外围类的一个窗口,即通过内部类对象提供的接口方法操作外围类私有的成员。如果只是需要实现一个接口,那么为什么不直接用外围类实现该接口,而需要使用内部类呢?这个问题其实说明了我们在选择的时候,是选择直接实现接口,还是使用内部类,实际情况下,如果通过直接实现接口比较方便,那么就不用内部类。现在我们只考虑内部类实现方式,这个方式...原创 2019-03-05 23:22:57 · 167 阅读 · 0 评论 -
十三、内部类使用详解(上)
概述将一个类的定义放在一个类的内部,这就是内部类。内部类可以实现将一些逻辑相关的类组合在一起,并且可以控制类中的类的可视性。举个栗子,在面向对象思维中,一个类即是一种类型,用类可以定义对象,现实中任何事物都可以被抽象为类与对象,例如,我们平时用的计算机,可以抽象为computer类,如果想要一台计算机,则new一个即可,这里我们要关注的是这个类的组成,现实中,计算机由各种零件组成(CPU、内存...原创 2019-02-27 22:33:24 · 202 阅读 · 0 评论 -
十二、使用接口实现继承体系中的完全解耦
抽象类使用关键字abstract可以定义一个抽象类,定义抽象类的好处是可以使类的抽象性更加明确,举个栗子,现在的场景是要将各种乐器演奏起来,那么我们可以创建一个乐器类作为所有乐器的超类,创建具体某个乐器(如:鼓,弦乐等)的类,并使其继承乐器类,不管是超类还是具体的类都带有演奏方法(play()方法),事实上,乐器类的play()方法并不需要具体实现,因为创建一个乐器类对象是没有意义的,抽象类就是...原创 2019-02-19 23:24:26 · 548 阅读 · 0 评论 -
十一、Java多态原理与使用详解
概述Java 中最常见的一种操作是封装,封装是将特征和行为合并起来形成一种新的数据类型,可以实现将细节隐藏、私有化。使用者可以看到该看到的,看不到不该看到的,可以有效的避免一些误操作。其次,Java 中的继承,可以实现类的扩展,也就是将一个笼统的类通过继承机制产生更多的细分类,例如,动物类是笼统的,具有所有动物的特性和行为,而老虎类,蚂蚁类均继承自动物类,它们本质是动物类,但是在动物类的基础上...原创 2019-02-14 23:24:34 · 306 阅读 · 0 评论 -
十、final 关键字详解
概述final 的意思是恒定不变的,和 C 语言中的 const 关键字类似,指的是恒定不变的量。根据其修饰的主体的不同,含义会有一定差异,Java 中一共可以修饰三种情况,即数据、方法和类。final 数据使用 final 修饰的数据通常是指一个常量,例如:public final int i = 9;上面代码中的变量 i 在运行时的值是不可变的。使用 final 关键字有两个目...原创 2019-02-12 22:21:04 · 525 阅读 · 0 评论 -
九、浅谈 Java 继承机制原理
Java 的继承机制是一种复用类的技术,从原理上来说,是更好的使用了组合技术,因此要理解继承,首先需要了解类的组合技术是如何实现类的复用的。使用组合技术复用类假设现在的需求是要创建一个具有基本类型,String 类型以及一个其他非基本类型的对象。该如何处理呢?对于基本类型的变量,在新类中成员变量处直接定义即可,但对于非基本类型变量,不仅需要在类中声明其引用,并且还需要手动初始化这个对象。这...原创 2019-01-30 22:33:41 · 2706 阅读 · 0 评论 -
八、Java 中的库单元与环境变量 CLASSPATH
在Java开发中,开发者不仅仅会使用自己写好的类,也会使用一些别人写好的类库中的类,那么当我们自己写的类名与别人写的类名冲突时,该如何处理呢?或者说如何避免类名的冲突。原创 2019-01-21 21:25:20 · 347 阅读 · 0 评论 -
七、Java 如何保证所有变量在使用前都初始化?
局部变量与成员变量的初始化对于方法体内的局部变量,Java用一个编译时错误来提醒初始化:void fun(){ int x; x++;//报错:i not initialized}对于类中的成员变量,在声明类的对象时,每个基本类型的变量都会有一个初始值。public class initClass{ boolean bool; char c; byte b; short s...原创 2019-01-14 22:58:15 · 1634 阅读 · 0 评论 -
六、终结处理 finalize() 与垃圾回收机制 GC
finalize()与析构函数C++中由于没有垃圾回收器,所以,每个对象需要考虑销毁的情况,当一个对象中包含有其他对象,在销毁这个对象之前需要首先将其包含的其他对象销毁,再执行这个对象的销毁动作。这里,销毁对象内部其他对象,或者在销毁当前对象前需要做的额外工作,都可以放在一个叫做析构函数的内部。#include&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;a原创 2019-01-08 23:58:11 · 531 阅读 · 0 评论 -
五、通过 this 关键字理解 static 的含义
this关键字class A{ void fun(int i){....};}public static void main(String [] args){ A obj1 = new A(); A obj2 = new A(); obj1.fun(1); obj2.fun(2);}上述代码中,class A只有一个fun方法,当obj1与obj2分别调用时,Java虚拟机...原创 2019-01-07 19:32:11 · 184 阅读 · 0 评论 -
四、程序控制:goto,break与continue详解
break与continuebreak:用于强行退出循环,不执行循环中的剩余语句。continue:停止当前这次跌代,退回到循环开始处,继续下一次迭代。pubilc class BreakAndContinue(){ pbulic void main(String [] args){ for(int i=0; ; i++){ if(i == 9){ break; ...原创 2018-12-28 22:05:34 · 349 阅读 · 0 评论 -
三、Java中的命名空间与静态域
命名空间当一个Java工程中存在大量的类,包括自定义的类,第三方类库的类以及Java自带类库的类等,必定会出现类名重复的情况,那么,存在相同类名的类时,编译器如何才能确定调用的是哪个类呢?C++中通过类包含函数来避免与其他类中的函数名冲突,但是C++依然允许全局数据和全局函数的存在,因此还是需要一种办法来解决函数名冲突,C++的做法是通过几个关键字引入命名空间的概念。名字可见性Java中使...原创 2018-11-27 23:20:17 · 395 阅读 · 0 评论 -
二、一切皆对象:论对象的一生一世
一切皆对象在面向对象程序设计中,所有的行为、数据等都需要基于对象,Java中一切都被视为对象,因此在操纵对象上可以采用单一固定的语法。在《对象导论:从面向过程到面向对象的转变》那篇文章中,我们知道,对象即为服务提供者、数据的载体。现在我们类比现实世界中的对象,来看看一个对象应该具有哪些属性。首先,我们需要给对象取名字(引用),再则,有的对象长得一样有的则完全不一样,我们需要对他们进行归类(数...原创 2018-11-20 22:51:59 · 287 阅读 · 0 评论 -
一、对象导论:从面向过程到面向对象的转变
抽象过程面向对象程序设计五个基本特性:1.万物皆为对象面对具体某个问题时,首先考虑该问题涉及哪些事物或元素,并将其视为一种奇特的变量:不仅具有存储数据的功能,还具有一些特定行为。2.每个对象都有由其他对象构成的存储简单的说,就是对象a中存在对象b,这样的对象嵌套现象。因此,可以在程序中构建复杂的体系结构。3.程序是对象的集合,它们通过发送消息来告知彼此应该做什么一个程序可以理解为一个...原创 2018-11-15 19:38:49 · 918 阅读 · 1 评论