Java语法基础(异常,swing,集合,反射,Annotation)
一、异常
1.异常概述:
在程序中,错误可能产生于程序员没有预料到的各种情况,或者是因为超出了程序员控制之外的环境因素,如用户的坏数据、试图打开一个根本不存在的文件等。在Java中这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
2.处理程序异常错误:
①错误:
异常产生后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整型,可以通过Integer类的parseInt()方法来实现。但如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将停留在出现异常的位置,不再执行下面的语句。
②捕获异常:
Java语言的异常捕获结构由try、catch和finally 3部分组成。其中,try语句块存放的是可能发生异常的Java语句;catch程序块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try块中的代码如何退出,都将执行finally块。
3.Java常见异常:
4.自定义异常类:
在程序中使用自定义异常类,大体可分为以下几个步骤:
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
5.在方法中抛出异常:
①使用throws声明抛出异常:
throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。
②使用throw语句抛出异常:
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句。
6.运行时异常:
RuntimeException异常是程序运行过程中产生的异常。Java类库中的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和RuntimeException之外的异常。
7.异常的使用原则:
在程序中使用异常,可以捕获程序中的错误,但是异常的使用也要遵循一定的规则,下面是异常类的几项使用原则。
不要过多的使用异常,这样会增加系统的负担。
在方法中使用try-catch捕获异常时,要对异常作出处理。
try-catch语句块的范围不要太大,这样不利于对异常的分析。
一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常。
二、Swing、窗体、面板、组件等
1.Swing概述:
①:Swing特点:
原来的AWT组件来自java.awt包,当含有AWT组件的Java应用程序在不同的平台上执行时,每个平台的GUI组件的显示会有所不同,但是在不同平台上运行使用Swing开发的应用程序时,就可以统一GUI组件的显示风格,因为Swing组件允许编程人员在跨平台时指定统一的外观和风格。
②Swing包:
为了有效地使用Swing组件,必须了解Swing包的层次结构和继承关系,其中比较重要的类是Component类、Container类和JComponent类。
③常用Swing组件概述:
下表列举了常用的Swing组件及其含义。
2.常用窗体:
①JFrame框架窗体:
JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载这些Swing组件的容器。在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体,在这个窗口中添加组件,同时为组件设置事件。由于该窗体继承了JFrame类,所以它拥有一些最大化、最小化、关闭的按钮。
②JDialog窗体:
JDialog窗体的功能是从一个窗体中弹出另一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。JDialog窗体实质上就是另一种类型的窗体,它与JFrame窗体类似,JDialog窗体在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。
3.标签组件与图标:
①标签的使用:
标签由JLabel类定义,它的父类为JComponent类。
标签可以显示一行只读文本、一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单地显示文本和图片,但是可以使用标签的特性指定标签上文本的对齐方式。
JLabel类提供了多种构造方法,这样可以创建多种标签,如显示只有文本的标签、只有图标的标签或是包含文本与图标的标签。
②图标的使用:
Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。
Ⅰ.创建图标
Ⅱ.使用图片图标
4.常用布局管理器:
①绝对布局:
在Swing中,除了使用布局管理器之外也可以使用绝对布局。绝对布局,顾名思义,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。
使用绝对布局的步骤如下:
(1)使用Container.setLayout(null)方法取消布局管理器。
(2)使用Component.setBounds()方法设置每个组件的大小与位置。
②流布局管理器:
流布局管理器是布局管理器中最基本的布局管理器。流布局管理器在整个容器中的布局正如其名,像“流”一样从左到右摆放组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行上都是居中排列的,但是通过设置也可以更改组件在每一行上的排列位置。
FlowLayout类中具有以下常用的构造方法:
public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment,int horizGap,int vertGap)
构造方法中的alignment参数表示使用流布局管理器后组件在每一行的具体摆放位置。
③边界布局管理器:
在默认不指定窗体布局的情况下,Swing组件的布局模式是BorderLayout布局管理器。边界布局管理器可以将容器划分为东、南、西、北、中5个区域,可以将组件加入到这5个区域中。容器调用Container类的add()方法添加组件时可以设置此组件在边界布局管理器中的区域,区域的控制可以由BorderLayout类中的成员变量来决定,这些成员变量的具体含义如下表所示。
④网格布局管理器:
网格布局管理器将容器划分为网格,所以组件可以按行和列进行排列。在网格布局管理器中,每一个组件的大小都相同,并且网格中的空格的个数由网格的行数和列数决定,例如一个两行两列的网格能产生4个大小相等的网格。组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件也会随之而改变大小。
⑤网格组布局管理器:
由GridBagLayout类实现的布局管理器称为网格组布局管理器,它实现了一个动态的矩形网格,这个矩形网格由无数个矩形单元格组成,每个组件可以占用一个或多个这样的单元格。所谓动态的矩形网格,就是可以根据实际需要随意增减矩形网格的行数和列数。
在向由GridBagLayout类管理的容器中添加组件时,需要为每个组件创建一个与之关联的GridBagConstraints类的对象,通过该类中的属性可以设置组件的布局信息,例如组件在网格组中位于第几行、第几列,以及需要占用几行几列等。
通过GridBagLayout类实现的矩形网格的绘制方向由容器决定,如果容器的方向是从左到右,则位于矩形网格左上角的单元格的列索引为0,此时组件左上角的点为起始点;如果容器的方向是从右到左,则位于矩形网格右上角的单元格的列索引为0,此时组件右上角的点为起始点。
gridx和gridy属性
这两个属性用来设置组件起始点所在单元格的索引值。需要注意的是,属性gridx设置的是X轴(即网格水平方向)的索引值,所以它表示的是组件起始点所在列的索引;属性gridy设置的是Y轴(即网格垂直方向)的索引值,所以它表示的是组件起始点所在行的索引,如下图所示。
gridwidth和gridheight属性
这两个属性用来设置组件占用网格组的行数和列数。属性gridwidth为组件占用网格组的列数,也可以理解为以单元格为单位组件的宽度;属性gridheight为组件占用网格组的行数,也可以理解为以单元格为单位组件的高度,如下图所示。
anchor属性
属性anchor用来设置组件在其所在显示区域的显示位置。通常将显示区域从方向上划分为9个方位,分别为北方(NORTH)、东北(NORTHEAST)、东方(EAST)、东南(SOUTHEAST)、南方(SOUTH)、西南(SOUTHWEST)、西方(WEST)、西北(NORTHWEST)和中心(CENTER),如下图所示:
fill属性
属性fill用来设置组件的填充方式。当单元格显示区域的面积大于组件面积时,或者一个组件占用多个单元格时,显示组件可能不必占用所有显示区域,在这种情况下可以通过fill属性设置组件的填充方式。
insets属性
属性insets用来设置组件四周与单元格边缘之间的最小距离。该属性的类型为Insets,Insets类仅有一个构造方法Insets(int top, int left, int bottom, int right),它的4个入口参数依次为组件上方、左侧、下方和右侧的最小距离,单位为像素,如下图所示,默认为没有距离。
ipadx和ipady属性
这两个属性用来修改组件的首选大小。属性ipadx用来修改组件的宽度,属性ipady用来修改组件的高度。如果为正数,则在首选大小的基础上增加指定的宽度和高度,如图所示,如果为负数,则在首选大小的基础上减小指定的宽度和高度,如右图所示。
5.常用面板:
①JPanel面板:
JPanel面板可以聚集一些组件来布局。读者首先应该明确的是面板也是一种容器,因为它也继承自java.awt.Container类。
②JScrollPane面板:
在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况,这时可以使用JScrollPane面板。JScrollPane面板是带滚动条的面板,它也是一种容器,但是JScrollPane只能放置一个组件,并且不可以使用布局管理器。如果需要在JScrollPane面板中放置多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane组件上。
6.按钮组件:
①提交按钮组件:
Swing中的提交按钮由JButton对象表示,其构造方法主要有如下几种形式。
public JButton()
public JButton(String text)
public JButton(Icon icon)
public JButton(String text,Icon icon)
通过使用上述构造方法,在Swing按钮上不仅能显示文本标签,还可以显示图标。上述构造方法中的第一个构造方法可以生成不带任何文本组件的对象和图标,可以以后使用相应方法为按钮设置指定的文本和图标;其他构造方法都在初始化时指定了按钮上显示的图标或文字。
②单选按钮组件:
在默认情况下,单选按钮显示一个圆形图标,并且通常在该图标旁放置一些说明性文字,而在应用程序中,一般将多个单选按钮放置在按钮组中,使这些单选按钮表现出某种功能,当用户选中某个单选按钮后,按钮组中其他按钮将被自动取消。单选按钮是Swing组件中JRadioButton类的对象,该类是JToggleButton的子类,而JToggleButton类又是AbstractButton类的子类,所以控制单选按钮的诸多方法都是AbstractButton类中方法。
③复选框组件:
复选框在Swing组件中使用也非常广泛,它具有一个方块图标,外加一段描述性文字。与单选按钮唯一不同的是复选框可以进行多选设置,每一个复选框都提供“选择”与“不选择”两种状态。复选框由JCheckBox类的对象表示,它同样继承于AbstractButton类,所以复选框组件的属性设置也来源于AbstractButton类。
7.列表组件:
①下拉列表框组件:
初次使用Swing中的下拉列表框时,会感觉到该此类下拉列表框与Windows操作系统中的下拉列表框有一些相似,实质上两者并不完全相同,因为Swing中的下拉列表框不仅可以从中选择项目,同时也提供用户编辑项目中的内容。
下拉列表框是一个带条状的显示区,它具有下拉功能,在下拉列表框的右方存在一个倒三角形的按钮,当用户单击该按钮,下拉列表框中的项目将会以列表形式显示出来。
②列表框组件:
列表框与下拉列表框的区别不仅仅表现在外观上,当激活下拉列表框时,会出现下拉列表框中的内容,但列表框只是在窗体上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放入滚动面板中。用户在选择列表框中的某一项时,按住Shift键并选择列表框中的其他项目,其他项目也将被选中;也可以按住Ctrl键并单击列表框中的项目,这样列表框中的项目处于非选择状态。
8.文本组件:
①文本框组件:
文本框用来显示或编辑一个单行文本,在Swing中通过javax.swing.JTextField类对象创建,该类继承了javax.swing.text.JTextComponent类。下面列举了一些创建文本框常用的构造方法。
public JTextField()
public JTextField(String text)
public JTextField(int fieldwidth)
public JTextField(String text,int fieldwidth)
public JTextField(Document docModel,String text,int fieldWidth)
在上述构造方法中可以看出,定义JTextField组件很简单,可以在初始化文本框时设置文本框的默认文字、文本框的长度等。
②密码框组件:
密码框与文本框的定义与用法基本相同,唯一不同的是密码使用户输入的字符串以某种符号进行加密。密码框对象是通过javax.swing.JPasswordField类来创建,JPasswordField类的构造方法与JTextField类的构造方法非常相似。下面列举几个常用的构造方法。
public JPasswordField()
public JPasswordFiled(String text)
public JPasswordField(int fieldwidth)
public JPasswordField(String text,int fieldwidth)
public JPasswordField(Document docModel,String text,int fieldWidth)
③文本域组件:
Swing中任何一个文本区域都是JTextArea类型的对象。JTextArea常用的构造方法如下:
public JTextArea()
public JTextArea(String text)
public JTextArea(int rows,int columns)
public JTextArea(Document doc)
public JTextArea(Document doc,String Text,int rows,int columns)
在上述构造方法中,可以在初始化文本域时提供默认文本以及文本域的长与宽。
9.常用事件监听器:
①监听事件简介:
在Swing事件模型中由3个分离的对象完成对事件的处理,分别为事件源、事件以及监听程序。事件源触发一个事件,它被一个或多个“监听器”接收,监听器负责处理事件。
所谓事件监听器,实质上就是一个“实现特定类型监听器接口”的类对象。也许有些读者对此有些迷惑,下面就来解释一下。事件几乎都以对象来表示,它是某种事件类的对象,事件源(如按钮)会在用户作出相应的动作(如按钮被按下)时产生事件对象,如动作事件对应ActionEvent类对象,同时要编写一个监听器的类必须实现相应的接口,如ActionEvent类对应的是ActionListener接口,需要获取某个事件对象就必须实现相应的接口,同时需要将接口中的方法一一实现。最后事件源(按钮)调用相应的方法加载这个“实现特定类型监听器接口”的类对象,所有的事件源都具有addXXXListener()和removeXXXListener()方法(其中“XXX”方法表示监听事件类型),这样就可以为组件添加或移除相应的事件监听器。
②动作事件监听器:
动作事件(ActionEvent)监听器是Swing中比较常用的事件监听器,很多组件的动作都会使用它监听。
③焦点事件监听器:
焦点事件(FocusEvent)监听器在实际项目开发中应用也比较广泛,如将光标焦点离开一个文本框时需要弹出一个对话框,或者将焦点返回给该文本框等。
三、集合
1.集合类概述:
Java语言的java.util包中提供了一些集合类,这些集合类又被称为容器。提到容器不难会想到数组,集合类与数组不同之处是,数组的长度是固定的,集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合有List集合、Set集合、Map集合,其中List与Set实现了Collection接口。各接口还提供了不同的实现类。
2.Collection接口:
Collection接口是层次结构中的根接口。构成Collection的单位,被称之为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List集合与Set集合是通用的。
3.List集合:
①List接口:
List接口继承了Collection接口,因此包含Collection中的所有方法,此外,List接口还定义了以下两个非常重要的方法。
get(int index):获得指定索引位置的元素。
set(int index , Object obj):将集合中指定索引位置的对象修改为指定的对象。
②List接口的实现类:
List接口的常用实现类有ArrayList与LinkedList。
ArrayList类实现了可变的数组,允许所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢。
LinkedList类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用LinkedList类实现的List集合的效率较好;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率较慢。
使用List集合时通常声明为List类型,可通过不同的实现类来实例化集合。
4.Set集合:
Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。
5.Map集合:
①Map接口:
Map接口提供了将key映射到值的对象。一个映射不能包含重复的key,每个key最多只能映射到一个值。Map接口中同样提供了集合的常用方法,除此之外还包括如下表所示的常用方法。
②Map接口的实现类:
Map接口常用的实现类有HashMap和TreeMap。建议使用HashMap类实现Map集合,因为由HashMap类实现的Map集合对于添加和删除映射关系效率更高。HashMap是基于哈希表的Map接口的实现,HashMap通过哈希码对其内部的映射关系进行快速查找;而TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的对象也存在一定的顺序,应该使用TreeMap类实现Map集合。
四、Class类与Java反射
1.访问构造方法:
在通过下列一组方法访问构造方法时,将返回Constructor类型的对象或数组。每个Constructor对象代表一个构造方法,利用Constructor对象可以操纵相应的构造方法。
getConstructors()
getConstructor(Class<?>… parameterTypes)
getDeclaredConstructors()
getDeclaredConstructor(Class<?>… parameterTypes)
如果是访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。
2.访问成员变量:
在通过下列一组方法访问成员变量时,将返回Field类型的对象或数组。每个Field对象代表一个成员变量,利用Field对象可以操纵相应的成员变量。
getFields()
getField(String name)
getDeclaredFields()
getDeclaredField(String name)
3.访问方法:
在通过下列一组方法访问方法时,将返回Method类型的对象或数组。每个Method对象代表一个方法,利用Method对象可以操纵相应的方法。
getMethods()
getMethod(String name, Class<?>… parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name, Class<?>… parameterTypes)
如果是访问指定的方法,需要根据该方法的名称和入口参数的类型来访问。
五、使用Annotation功能
1.定义Annotation信息:
在定义Annotation类型时,也需要用到用来定义接口的interface关键字,不过需要在interface关键字前加一个“@”符号,即定义Annotation类型的关键字为@interface,这个关键字的隐含意思是继承了java.lang.annotation.Annotation接口。
2.访问Annotation信息:
如果在定义Annotation类型时将@Retention设置为RetentionPolicy.RUNTIME,那么在运行程序时通过反射就可以获取到相关的Annotation信息,如获取构造方法、字段和方法的Annotation信息。
类Constructor、Field和Method均继承了AccessibleObject类,在AccessibleObject中定义了3个关于Annotation的方法,其中方法isAnnotationPresent(Class<? extends Annotation> annotationClass)用来查看是否添加了指定类型的Annotation,如果是则返回true,否则返回false;方法getAnnotation(Class annotationClass)用来获得指定类型的Annotation,如果存在则返回相应的对象,否则返回null;方法getAnnotations()用来获得所有的Annotation,该方法将返回一个Annotation数组。
本文地址:https://blog.csdn.net/Air_dreamer/article/details/108031727