继承,异常,日志,断言和调试,集合

javase核心技术(基础知识部分的个别内容)

[关于 继承,异常,日志,断言和调试,集合的相关内容]


第五章:继承

一:反射
1, 反射库(reflection library)
反射库(reflection library)提供了一个非常丰富并且精心设计的工具类,以便编写能够动态操纵Java代码的程序,该功能被大量的应用到JavaBean心中,它是Java组件的体系结构。
反射(reflective):能够分析类能力的程序。
2,Class类
程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类足迹。虚拟机利用运行时信息选择相应的方法执行,可以通过专门的Java类访问这些信息,保存这些信息的类被称为Class,Object类中的getClass()方法将返回一个Class类型的实例。最常用Class的方法是getName(),将返回类的名字。
3,关于反射:利用反射分析类的能力:(反射机制最重要的内容——检查类结构)
介绍:
在java.lang.reflect包中有三个类Field,Method和Constructor分别用于描述类的域,方法和构造器。这三个类都有一
个叫getName的方法,用来反悔项目的名称。Field类有一个getType方法,用来返回描述域所属类型的Class对象。Method和Constructor类又能够报告参数类型的方法,Method类还有一个可以报告返回类型的方法。这三个类还有一个getModifiers(),返回一个整形数值,用不同的位开关描述public和static这样的修饰符使用状况。另外,可以利用java.lang.reflect包中的Modifier类的静态方法分析geMOdifier返回的整型数值。例如,可以使用Modifier类中的isPublic,isPrivate,,isFinal判断方法或构造器是否是public,private,final.我们需要做的全部工作就是调用Modifier类的相应方法,并对返回的整型数值进行分析。另外,还可以利用Modifier.toString方法将修饰法打印出来。
Class类中的getFields,getMethods,getConstructors方法将分别返回类提供的public域,方法,和构造器数组,其中包括超类的公有成员。Class类的getDeclareFields,getDeclareMethods,getDeclaredConstrucors方法将分别返回类中声明的全部域,方法和构造器,其中包括私有和受保护成员,但不包括超类的成员。
例5—6(见文件ReflectionTest.txt)显示了打印一个类的全部信息的方法:
这个程序将提醒用户输入类名,然后输出类中所有的方法和构造器的签名,以及全域名。假如用户输入:java.lang.Double
程序将会输出:
Public class java.lang.Double extends java.lang.Number
{
Public java.lang.Double(java.lang.String);
Public java.lang.Double(double);

Public int hashCode();
Public int compareTo(java.lang.Object);
Public int compareTo(java.lang.Double);

............................
}

注意:这个程序可以分析Java解释器能够加载的任何类,而不仅仅是编译程序时可以使用的类。

二,继承设计的技巧(7个)
1,将公共操作和域放在超类
2,不要使用受保护的域
(将实例域定义为producted可以使子类才能够在需要的时候直接访问它们,然而,producted机制并不能够带来更好的保护,原因:1, 子类集合是无限制的,任何一个人都能够有某个类派生一个子类,并编写代码直接访问producted的实例域,从而破坏了封装性;二,在Java程序设计语言中,在同一个包中所有的类都可以访问producted域,而不论它是否是这个类的子类)
3,使用继承实现“is-a”关系
(不符合“is-a”关系的不用继承)
4,除非所有继承的方法都有意义,否则不要用继承
5,再覆盖方法时,不要改变预期的行为
(置换原则不仅适用于语法,而且可以引用于行为。再覆盖一个方法时不应该毫无原由得改变行为的内涵。再设计子类时,不要遍历最初的设计想法)
6,使用多态,而非类型信息
(定义接口,通过接口去接受implements接口的类或超类去接受extends的类,可以省去类型的判断而使用多态性提供的动态分配机制执行相应的动作。使用动态方法或接口编写的代码比使用对多种类型进行检测的代码更加易于维护和扩展)
7,不要过多的使用反射
(反射机制使人们可以通过在运行时查看域和方法,让人们编写出更具有通用性的程序。这种功能对于编写系统程序来说极其实用,但是通常不适合于编写应用程序。反射是脆弱的,即编译器很难帮助人们发现程序中的错误。任何错误只有在运行时才能被发现,并导致异常!)

第十一章:异常,日志,断言和调试
11.1处理异常
11.1.1:异常分类
所有的异常类都由Throwable继承而来,被分解为Error和Exception。
关于Error:
Error类层次结构:描述了Java运行时系统的内部错误和资源耗尽错误。(应用程序不应该抛出这种类型的对象,如果出现了这样的内部错误,应通告用户并尽力使程序安全的终止)
关于Exception:
在设计Java程序时,需要关注Exception层次结构。这个层次结构有分解为两个分支:一个分支派生于RuntimeException,(由程序错误导致的异常)另一个分支包含其他异常(程序本身没有问题,但由于象I/O错误这类问题导致的异常属于其他异常)。
派生于RuntimeException的异常包含以下几种情况:
错误的类型转换;
数组访问越界;
访问空指针;
不是派生于RuntimeException的异常包括:
试图在文件尾部后面读取数据;
试图打开一个错误格式的URL;(不同的浏览器可以处理不同类别的URL,所以,“具有错误格式”取决于具体的环境,而不仅仅是程序代码 )
试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在;

注意:如果出现RuntimeException异常,那么就一定是你的问题。
Java语言规范:
将派生于Error类或RuntimeException类的所有异常统称为未检查(unchecked)异常,所有其他类型的异常称为已检查(checked)异常(IOException)。
11.1.2:声明已检查异常
方法应在其首部声明所有可能抛出的异常(可以从首部反映出这个方法可能抛出哪些类已检查异常)。
在发生异常时可以根据声明抛出相应的异常对象,然后运行时系统就会开始搜索异常处理器,以便知晓如何处理相应的异常对象。
应该抛出异常的四种情况:
1,调用一个抛出已检查异常的方法,例如:FileInputStream构造器;
2,程序运行过程中发现错误,并利用trrow语句抛出一个已检查异常;
3,程序出现错误,例如:数组越界导致的异常;
4,Java虚拟机和运行时库出现的内部异常。

注意:
注意:如果出现前两种异常,必须告诉调用这个方法的程序员有可能抛出的异常。(因为任何一个抛出异常的方法都有可能是一个死亡陷阱,如果没有处理器捕获这个异常,当前执行的线程就会结束)

对于可能被他人调用的Java方法,应根据异常规范(exception specification),在方法的首部声明这个方法可能抛出的异常,如有多个,用逗号将异常类隔开。但是,不需要声明Java的内部错误,即从Error继承的错误(任何程序代码都有抛出那些异常的潜能,而我们对其没有任何控制能力),也不应该声明从RuntimeException继承的未检查异常(这些运行时错误完全在我们的控制之下)。

小结:
一个方法必须声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么就该避免发生(RuntimeException).如果方法未声明所以可能发生的已检查异常,编译器就会给出一个错误消息。
如果类中的一个方法声明将会抛出一个异常,而这个异常是某个特定类的实例时,则这个方法就有可能抛出开一个这个类的异常,或者这个类的任意一个子类的异常。
11.1.3:如何抛出异常
对于已存在的异常类:
1,找到合适的异常类;
2,创建这个类的一个对象;
3,将对象抛出;
(一旦方法抛出了异常,方法就不能返回到调用者。即,不必为返回的默认值或错误代码担忧)
11.1.4:创建异常类
没有可用的能够充分描述清楚问题的标准异常类,可以创建自己的异常类,定义派生于Exception的类,或者派生于Exception子类的类。习惯上,定义的类包含两个构造器,一个是默认的构造器,一个是带有详细描述信息的构造器(超类Throwable的toString()方法将会打印出这些详细信息,这在调试中非常有用)。
java.lang.Throwable 1.0.

11.2捕获异常


第十三章:集合

1,接口集合:Vector,Stack,HashTable,BitSet,Enumeration接口(提供用于访问任意容器中各个元素的抽象机制)
1.1 queue队列
队列接口,在尾部添加元素,头部删除,查找个数。收集对象并要按照先进先出规则时就是用队列;
实现方式:循环数组,链表;
循环数组比链表更高效:循环数组时有界集合,容量有限;而链表没有数量上限;
1.2java类库中的集合接口和迭代器接口
集合类接口:Collection;
boolean add(E element)向集合添加元素,成功返回true,如果已存在则等于添加不成功,返回false,集合中不允许有重复的值;
Iterator<E> iterator();返回一个实现了Iterator接口的对象,可用该对象来依次访问集合中的元素;
迭代器包含三个方法:
E next();通过反复调用来访问集合中的每个元素,但,到了尾部会抛出NoSuchElementException,但可以用
boolean hashNext();判断;
Collection接口扩展了Iterable接口;,所有,对于标准类库中的任何集合都可以用“foreach”循环;
Collection和Iterator都是泛型接口,可编写操作任何集合类型的实用方法。检测任何集合是否包含某个指定元素的方法:boolean Contains(Collection<E> c,Object obj)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值