java学习笔记.docx_第1页
java学习笔记.docx_第2页
java学习笔记.docx_第3页
java学习笔记.docx_第4页
java学习笔记.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 普通变量,数据类型,运算符,流程控制1. 数据类型可以从低精度向高精度自动转换,但是从高精度向低精度转换要用强制类型转换。2. java中,常小数默认的类型是double,因此把常小数赋给float类型变量时,要在该小数后面加个f。例如:float a=2.5f;3. system.in代表标准输入,也就是键盘输入。4. switch语句的case:后面接常量。5. 运算符+能够把两个String对象进行链接并生成一个新的String.6. 标识符有两种书写方式:(1)驼峰法:ClearUp、FindTheMax、getName;(2)下划线法:Clear_up、Find_the_max、get_name。7. :算术右移 :逻辑右移 :取反 &:位与 |:位或 :位异或 &:逻辑与 |:逻辑或二、 类,对象,成员属性,成员方法,构造方法1. 一个java文件只能有一个public类,且该public类的类名必须和所在的java文件名一致。2. 出现“找不到符号”错误的原因是没有引进相关的包。3. 类名的首字母大写;方法名的首字母小写。4. 类的构造方法的特点:方法名和类名相同,后面加一对圆括号,没有返回值(不加void或其他返回类型标识)。5. this是属于一个对象的,而不是属于一个类的,它指的是当前对象;this只能在类定义的方法中使用。this 的作用:(1) 当成员方法的形参名和成员变量名相同时,该方法中使用成员变量就要用this,以区别开成员变量和形参。当不会引起混淆的时候,就不必使用this。比如当前对象的某个成员变量var和成员方法method(),分别可以表示成this.var和this.method()。(2) 如果当前对象所属的类有多个形参不同的构造函数,this还可以用来在成员方法中调用其中任何一个构造方法。例如某个类有两个构造方法a()和a(int i),则可以用this()表示调用a(),this(int i)表示调用a(int i)。6. (1)静态方法(又称类方法)和静态变量(又称类变量)属于类本身,而不属于那个类的某个对象。(2)静态方法既可以用实例来调用,也可以用类名来调用,即:类名.类变量名 或者 任何一个该类的对象名.类变量名,但不能直接调用。(3)类的静态变量是该类的对象所共有的,即是所有对象共享变量。(4)静态方法只能访问类的静态成员,不能访问类的非静态成员。7. java虚拟机在内存中分三大块:栈区、堆区和代码区(数据区)。当创建一个普通变量,该变量就直接存储在栈区;当创建一个对象,则该对象的引用存放在栈区,而对象本身存放在堆区;代码区存放的是在编译时就创建的东西,例如:静态变量和代码信息。因此,类定义的时候,里面的静态区域块就会被执行。8. 包名都是小写的,可以分多层。9. 同一个包中不能有两个类的类名相同,即使这两个类位于不同的java文件中。同一个包中不同java文件可以互相使用对方的类。10. java中所有的类都是java.lang.object的子类。11. 为私有成员变量生成get函数和set函数:选中所有需要生成get函数和set函数的变量,单击右键,依次选择Source-Generate Getters and Setters.,在弹出的对话框中点击Select all和OK。12. 类定义的花括号里面只能定义变量和方法,不能做其他的事(例如:运算、输出等)。如:下面的代码是不对的。class Claint i=0;System.out.println(i);/错误!此语句要放在方法中。三、 抽象,封装,继承,多态1. 四种访问级别的访问范围:访问级别访问控制修饰符同类同包子类不同包公开public受保护protected默认没有修饰符私有private2. 方法重载:两个成员方法的方法名相同,参数不同时,编译器能区分。3. 两个成员方法的方法名和参数都相同,而返回值类型不同时,编译器会报出“不兼容的类型”的错误。因此,同一个类的两个方法的方法名和参数,至少有一个不同,编译才能通过。4. 封装的原则:尽可能把成员属性做成私有(private)的。5. 继承可以是多重的,即子类继承父类,孙子类继承子类。但一个类最多只能继承一个父类;一个类可以实现多个接口。6. 方法覆盖:子类可以覆盖父类的方法。注意:子类方法和父类方法的返回类型、参数、方法名称要完全一样,否则不构成覆盖;子类方法不能缩小父类方法的访问权限。例如,父类某方法的访问权限为public,子类覆盖该方法时,就不能把访问权限设为private。7. super的作用:(1)在子类中调用父类的成员变量和成员方法。例如:子类覆盖了父类的方法method(),但在某处又想调用父类的该方法,就可以用super.method()。(2)在子类的构造方法中调用父类的构造方法。请注意:子类想调用父类的构造方法,只能在子类的构造方法中调用。当父类中有多个形参不同的构造方法时,就要用到super。例如父类中有Father()和Father(int i)两个构造方法,则在子类的构造方法中,用super()来调用Father(),用super(int i)来调用Father(int i)。8. 多态:用父类的引用指向子类的实例,编译器能够自动识别是指向哪个子类。例如,Father类有两个子类Son和Daughter,则下面的代码是合理的:Father a=new Son();/此处对Son的这个对象进行处理。a=new Daughter();/此处对Daughter的这个对象进行处理9. 抽象类:加了修饰符abstract的方法(抽象方法)所在的类也要加修饰符abstract,这种类称为抽象类。但抽象类可以不包含抽象方法。10. 当一个类继承的父类是抽象类,必须在这个类中实现该抽象类中所有的抽象方法。11. 抽象类和接口都不能被实例化。12. 接口的定义格式:interface IntrfcAccessModifier1 ReturnType1 method1();AccessModifier2 ReturnType2 method2();接口里声明的所有方法都没有方法体(不能被实现)。13. 类Cla1实现接口Intrfc的格式:class Cla1 implements IntrfcAccessModifier1 ReturnType1 method1()AccessModifier2 ReturnType2 method2()14. 当一个类实现一个接口,该类必须把该接口的所有方法通通实现。15. 在类Cla2中定义一个成员方法useIntrfc使用接口Intrfc的格式:AccessModifier ReturnType useIntrfc (Intrfc intrfc)intrfc.method1();intrfc.method2();该方法使用该接口(以实现了该接口的一个对象为参数):Cla1 obj1=new Cla1();/Cla1为实现了接口Intrfc的类Cla2 obj2=new Cla2();obj2. useIntrfc (obj1);16. 接口里面的变量不能用private和protected修饰,而且默认为static类型和final类型。17. 接口中的变量访问形式:接口名.变量名。18. 一个接口不能继承其他的类,但可以继承其他接口。19. 修饰词final的作用:(1)若不希望某个类被继承,在该类的定义前面加final;(2)若不希望类的某个变量的值被修改,在该变量的定义语句前加final;(3)若不希望父类的某个方法被子类覆盖,在父类中该方法的定义前加final.20. final修饰的变量可以看做常量(其值不可更改),变量名一般用下划线法。该变量在定义时必须赋值。四、 一维数组,多维数组,字符串1. 数组的声明有两种方法:int a; 或者 int a;2. 数组名.length表示该数组的大小(元素个数)。3. 定义类Cla的一个对象数组Cla obj=new Clan;的时候,数组中存放的不是各个对象,而是指向各个对象的引用,而且目前为空引用。必须用语句for(int i=0;iobj.length;i+)obji=new Cla();来为每个引用创建对象,否则会出现空指针异常。4. int a;或 int a;是数组声明语句;int a=new int3;或 int a;a=new int3; 是初始化数组元素为默认值的语句。int a=1,15,46,36;或int a=new int1,15,46,36;是初始化数组元素为给定值的语句。初始化为给定值时,不能指明数组的大小,数组常量只能在初始化操作中赋给数组。例如下面的语句是错误的:char s=new char5 H,e,l,l,o;或char s=new char5;s=H,e,l,l,o;5. 二维数组的定义:ElemType array=new ElemTypen1n2;6. 二维数组就是以数组为元素的数组,里面的数组维数可以不要求一样。例如:int a=new int1,2,3,4,5,6,7,8,9;7. java中,字符串和字符数组完全不同。字符数组是多个字符形成的无关联序列;字符串是String类的对象,它不仅有多个字符,还有很多系统默认自带的成员变量和成员方法。因此,不能把字符串赋给字符数组,也不能把字符数组赋给字符串。8. java中比较两个字符串是否相等,用其中一个字符串自带的成员函数equals(),以字符串s1、s2为例:若s1和s2相等,则s1.equals(s2)为true,否则为false。s1=s2比较的是s1和s2在内存中的地址是否相等。9. String s1=abcd;String s2=abcd;String s3=abc+d;String s4=abc;s4=s4+d;虽然s1s4最后的内容都为abcd,但s1、s2和s3都指向内存中同一个地址,而s4指向与前面三个不同的地址。在执行s4=s4+d;后,s4指向的地址也不再是原来s4指向的地址。因为java中有个叫“字符串池”的机制,它有指向内存中所有字符串的引用。执行语句String s1=abcd;时,它就查找自己所有的引用,看有没有哪个引用指向的字符串就是abcd。如果有,就把s1指向已经存在的abcd;如果没有,就在内存中重新创建一个字符串abcd,并让s1指向它,字符串池也创建一个新引用,也指向它。但如果是这样声明并初始化字符串:String s1=new String(abcd);String s2=new String(abcd);String s3=abcd;则s1、s2和s3分别指向不同的内存地址。因为用new的方法总是开辟新的内存空间来存放字符串。这种方法没有“字符串池”机制,因此字符串池不会有指向s1和s2指向的abcd的引用。10. s为一个字符串,则s.getBytes()是将s装换成字节数组并返回之。五、 集合,泛型1. 使用集合先要引入java.util包:import java.util.*;2. List类(ArrayList、LinkedList、Vector)集合s的大小:s.size();往集合s中添加对象obj:s.add(obj); 访问集合s中第n个对象:Cla obj=(Cla)s.get(n);因为s.get(n)函数返回类型是Object,所以要用类名Cla强制转换才能让obj接收。删除集合s中第n个对象:s.remove(n )。3. 集合中可以放入已经放入的对象,但不是复制该对象,而是把两个引用都指向一个对象。4. HashMap类的对象hm加入元素用hm.put(); 通过键值查找某元素是否存在用hm.containsKey(); 通过键值取元素用hm.get(key)。5. HashMap中不允许有两个元素的Key值是重复的。6. 遍历HashMap,要用到迭代器Iterator:Iterator it=hm.keySet().iterator();while(it.hasNext()String key=it.next().toString();/取keyElemType elemName=(ElemType)hm.get(key);其中hm.keySet()返回此映射中所包含的键的Set视图;iterator()返回以恰当顺序在此列表的元素上进行迭代的迭代器;hasNext()测试是否还有下一个元素。7. HashMap和Hashtable的主要区别:若Map对象被多进程或多线程同步访问,则用Hashtable以提高安全性;若Map对象被单进程访问,不存在同步问题,则用HashMap以提高访问效率。ArrayList、LinkedList和Vector也有这个区别,ArrayList、LinkedList是异步的,Vector是同步的。8. java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。java中所有类的始祖Object类有个方法名叫getClass(),主要用于java的反射机制。假设某个类ABC有一个对象abc,则函数abc.getClass()返回的是abc的运行时类,可以通过它,在运行时动态获得ABC的类信息。例如,abc.getClass().getName()返回的是ABC的类型名称;abc.getClass().getDeclaredMethods()返回的是一个Method类型的数组,里面每个元素都是ABC的成员函数,由此可以得到这些成员函数的信息(如:函数名、参数类型、返回值类型、修饰符等等)。9. abc.getClass()=ABC.class; 的值为true.10. 当要使用某种数据,但该数据的类型不确定或时常变化,就需要使用泛型。11. 使用泛型的类的定义格式:class Genprivate T t; /定义泛型成员变量public Gen(T t) this.t = t;/对t的其他操作泛型的使用:ElemType elem=new ElemType();Gen gen=new Gen(elem);六、 异常1. 异常处理方法:(1)从异常发生处中断程序并抛出异常。用trycatch(Exception e)语句块。把产生异常的语句放入到第一个中,catch后为(Exception e)可以捕获所有异常(最大捕获);如果原来是什么异常,就把Exception改为什么异常,就只能捕获这一种异常(最小捕获)。后一个中填写对异常的处理,例如填入语句e.printStackTrace();或System.out.println(e.getMessage();都能输出异常原因。若可能有多种异常,且使用最小捕获时,可以把每种异常都写一个catch语句块。(2)把异常抛给调用该方法的方法:在该异常所在的方法的之前加上throws Exception的说明。调用该方法的方法若也不想处理这个异常,可以继续往上级抛出异常。2. trycatch()语句块中,在try中出现异常的地方就终止执行代码,进入到catch语句。3. 在catch()语句块后面加上finally语句块,不管前面有没有异常,finally的中的语句都会被执行。例如:关闭前面打开的文件、链接,释放前面开辟的内存。4. 除了以下四种情况,finally语句块中的语句都会被执行。(1)finally块中发生了异常;(2)程序所在线程死亡;(3)在前面的代码中使用的System.exit();(4)关闭CPU。七、系统自带包和类1. 要从键盘获取一个整数、小树、字符等等,则在package语句后面加上import java.util.Scanner;/或import java.util.*;然后在类中声明一个Scanner对象: Scanner scan=new Scanner(System.in); 最后用 ElemType data=scan.nextElemType();来接收键盘输入的数据。ElemType为int时,接收的就是一个整数;ElemType为float时,接收的就是一个单精度浮点数2. 要调用数学函数,直接使用Math.*()即可,无需引包。3. 从控制台(如:键盘)输入:先在package语句后面加上引包语句import java.io.*;然后在类中加入语句BufferedReader br = new BufferedReader(new InputStreamReader(System.in);读取时,用readline()函数从键盘以字符串的形式读取数据。因此要定义一个字符串来接收数据。String s=br.readline();这时,编译器会报出IO异常,要在该语句所在的函数名后面加上throws Exception,把异常抛给上级(如:该函数的调用者)。例如:public static void main(String args) throws Exception . 若要读取的是一个int类型,则用int i=Integer.parseInt(s);语句将字符串s转换成整数i。若要读取的是一个float类型,则用float f=Float.parseFloat(s);语句将字符串s转换成浮点数f。4. 打印系统时间:先在package语句后面加上:import java.util.*;然后定义一个Calendar变量:Calendar cal;在每个要打印系统时间的地方加上两个语句:cal=Calendar.getInstance();System.out.println(cal.getTime();5. Math.random()函数的返回值是一个01之间的随机双精度浮点数。6. Font(String name, int style, int size)根据指定名称、样式和磅值大小,创建一个新 Font。例如:font=new Font(“宋体”, Font.PLAIN, 16);7.表示颜色可用Color.RED、Color.BLUE等等。也可用RGB法:Color(r,g,b),其中r,g,b都为0.01.0之间的float数据。八、图形用户界面1. swing和awt不是两套独立的图形界面开发工具。swing是对awt的继承和升级。2. JFrame是一个顶层容器类(可以添加其他swing组件的类)。3. 使用JFrame要先引入两个包:java.awt.*和javax.swing.*。(javax表示swing是扩展包)4. jf为JFrame类的一个对象:(1)设置窗口标题:jf.setTitle(String s);(2)设置宽和高(按像素):jf.setSize(int width,int height);(3)设置窗口打开的时候的位置:jf.setLocation(int arg0,int arg1);(4)禁止改变窗口大小:jf.setResizable(false);(5)设置左上角图标(默认为“一杯咖啡”的图标):jf.setIconImage(new ImageIcon(“route of the icon”).getImage();由于参数需要一个Image类型的数据,而ImageIcon(“route of the icon”)得到的是一个ImageIcon,所以用getImage()方法转换一下。(6)要在关闭窗口时,让java虚拟机也退出,就要在窗口参数设置部分添加以下语句:jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);(7)要显示窗体,就要在最后加上以下语句:this.setVisible(true);5. 做swing组件开发时,通常让主类继承JFrame,把需要的swing组件(如:按钮、文本等)的定义部分写到main函数之外。在主类的构造函数中依次创建组件、添加组件、设置窗口参数(标题、大小、显示)等等。例如:public class Dev extends JFrame/继承JFrameJButton jb;/定义按钮组件static public void main(String args) Dev dev=new Dev();public Dev() jb=new JButton(“Press Me”);/创建按钮this.add(jb);/添加按钮this.setTitle(“Hello, World!”);/以下均为设置窗口参数6. 边界布局(BorderLayout):在窗口中添加组件时,按照东西南北中的布局添加。BorderLayout默认是添加到中间部分。例如,在主类的构造函数中,写一个在窗口的南边添加一个按钮jb的语句:this.add(jb,BorderLayout.SOUTH);7. JFrame默认是边界布局的,若要用其他布局方式,则要在构造方法中用方法setLayout()设置布局管理器。8. 流式布局(FlowLayout):按照组件的添加次序将组件按从左到右、从上到下的顺序放置在容器中。流式布局有靠左对齐、靠右对齐和居中对齐三种对齐方式,默认是居中对齐。JFrame使用流式布局,要设置布局管理器为流式布局。若对齐方式不是居中对齐,还要设置对齐方式。例如:this.setLayout(new FlowLayout(FlowLayout.LEFT);9. 网格布局(GridLayout):将容器分割成多行多列,组件以从左到右、从上到下的顺序被填充到每个网格中。使用网格布局时要设置组件分为几行几列,还可以设置组件之间的间隙。例如:this.setLayout(new GridLayout(row, col);或this.setLayout(new GridLayout(row, col,hGap,vGap);其中,参数row、col、hGap、vGap都为整数,分别表示行数、列数、水平间隙、垂直间隙。10. 若要在同一个窗体组合使用多种布局,就要用到面板组件JPanel,它是非顶层容器。JPanel的默认布局管理器是流式布局。11.其他常用组件:(1)按钮组件(见图01):JButton(“按钮名称”);若想在按钮上显示的是一张图片,则用:JButton(new ImageIcon(“route of the image”)。若jb为一个JButton,则jb.setToolTipText(“tip”);语句用来设置该按钮的提示信息(当鼠标停留在按钮上时,会出现该提示信息)。(2)文本框组件(见图01):JTextField(col);其中col为一个整数,表示文本框的长度。(3)密码框组件(见图01):JPasswordField(col);其中col为一个整数,表示密码框的长度。(4)标签组件(见图01):JLabel(“string”);其中string为标签名称。另外,还可以用图片作为标签:JLabel(new ImageIcon(“route of the image”);(5)复选框组件(见图02):JCheckBox();(6)单选框组件(见图02):JRadioButton();注意:同一组单选按钮必须先创建ButtonGroup,然后把单选框组件放入到ButtonGroup中。(7)下拉框组件(见图03):JComboBox;(8)滚动窗格组件(见图03):JScrollPane;(9)列表框组件(见图03):JList;一般列表框组件和滚动窗格组件是结合使用的。结合的方法如下:JList jl=new JList();JScrollPane jsp=new JScrollPane(jl);另外,还要设置滚动窗格中显示多少个选项,注意:这是在列表框中设置,而不是在滚动窗格中设置。设置方法如下:jl.setVisibleRowCount(n);/n为int数据,表示显示的选项个数。图01图02图03(10)分割面板组件(见图04):JSplitPane 用来将窗口分割成两个部分。分割后的窗口每个窗口只能放一个组件,想要放多个组件的话,可以在上面放一个JPanel面板,然后在JPanel上放多个组件。JSplitPane的用法:JSplitPane jsp=new JSplitPane(splitOrientation,component1,component2);this.add(jsp);其中,splitOrientation为int型,它有两个值可取:JSplitPane .HORIZONTAL_SPLIT(水平分割,即分割成左右两块)和JSplitPane .VERTICAL_SPLIT(垂直分割,即分割成上下两块)。component1和component2分别是插入分割后的左、右(或上、下)两个面板中的组件。另外,还可以设置让其中一个版块有收缩和展开功能:jsp.setOneTouchExpandable(true);(11)多行文本组件(见图05):JTextArea();它是一个显示纯文本的多行区域。如果文字太多,超过这个区域能显示的最大行数,把它和JScrollPane结合起来,就可以下拉看到所有文字。(12)选项卡窗格/页签组件(见图06):JTabbedPane。创建和使用选项卡窗格的方法如下:JTabbedPane jtp=new JTabbedPane();jtp.add(“选项卡名称1”, panel1);jtp.add(“选项卡名称2”, panel2);add()的参数为每个选项卡的名称和对应的面板,因此,有多少个选项卡就要有多少个add()语句。(13)菜单栏组件(见图07):JMenuBar;菜单组件(见图07):JMenu;菜单项组件(见图07):JMenuItem;工具条组件(见图07):JToolBar。菜单栏的制作:创建各个组件之后,把同级的菜单项和菜单(可看做继续分级的菜单项)添加到上级菜单,以此类推把一级菜单添加到菜单栏。这些都是用各自的add()方法添加的。最后把菜单栏添加到窗体上,注意:给窗体添加菜单栏不是用add(),而是有专门的方法setJMenuBar()。例如,要把菜单栏jmb添加到窗体jframe上,用下面的语句:jframe.setJMenuBar(jmb);另外,还可以给菜单组件添加助记符(可以用“Alt+助记符”的组合快捷键打开该菜单,如:“文件(F)”可用”Alt+F”打开)。例如,给菜单menu1加助记符x:menu1.setMnemonic(X);/注意用单引号还可以在两个菜单项之间添加分隔线。例如,item4和item5是menu的菜单项,要在item4和item5之间添加分隔线,就在语句menu.add(item4);和menu.add(item5);之间加上一句:menu.addSeparator();工具栏的制作:创建一个工具栏和多个按钮之后,用工具条的add()方法把按钮都添加上去。最后,还是用add()把工具栏添加到面板上。图04图05图06图07(14) 文件选择组件:JFileChooser,用来从磁盘选择文件,以便于对文件进行操作。JFileChooser jfc=new JFileChooser();jfc.setDialogTitle(“请选择文件”); /设置文件选择器对话框的标题jfc.showOpenDialog(null); /弹出一个打开文件的文件选择器对话框jfc.showSaveDialog(null); /弹出一个保存文件的文件选择器对话框jfc.setVisible(true); /这句话不能掉,否则对话框不能显示九、绘图1. Component类使用paint(Graphics g)方法绘制组件,Graphics是绘图的重要类,可以把它理解成一支画笔。要在面板上绘图,一般都是先定义一个继承JPanel类的类,在这个类中重写paint(Graphics g)方法,加入绘图的语句。例如,要画一个圆:import java.awt.*;import javax.swing.*;public class MyPainter extends JFrameMyPanel mp;public static void main(String args) MyPainter mypainter=new MyPainter();public MyPainter()mp=new MyPanel();/此处没有写paint()函数,因为程序会自动调用它。this.add(mp);/以下均为对JFrame的设置。class MyPanel extends JPanelpublic void paint(Graphics g)super.paint(g);/调用父类函数完成初始化,这句不能掉!g.drawOval(100,100,100,100);然后创建一个MyPanel对象,将其添加到JFrame窗体,就乐意在图形界面看到画在面板上的圆了。2. 首次显示组件或组件已损坏并需要修复时,程序会自动调用paint()方法来绘制组件。3. repaint()方法是另外一个重要的绘图方法。它的作用是刷新组件外观。java的动态画面正是由于repaint()在不停的刷新。4. 在以下三种情况,paint()会再次被调用:(1)窗口最小化又最大化;(2)窗口大小发生变化;(3)repaint()函数被调用。5. 用已有的图片生成一个Image类型的数据,然后在Panel上显示:Image img=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(“route of the image”);Toolkit这个类的默认工具集中有一个getImage()方法。图片不能像线条或者填充图那样画在面板上,所以要用Panel这个类的一个方法getResource()把图片的信息加载到img中。6. 在面板上显示文字用drawString()方法。写字之前,可以先设置颜色和字体,例如:g.setColor(Color.RED);g.setFont(“楷体”, Font.BOLD, 20);7. 画图的原则:一般,简单图案(可分解为几何图形)就用普通的画图方法,复杂的图案(无法分解、无法直接画出)才用现成图片。因为用现成图片较耗费资源,容易使java程序运行缓慢。例如坦克大战中的坦克:8. 当要画的图案比较复杂,需要很多语句,最好把这些语句封装到单独的一个方法中。注意:要把画笔Graphics g作为参数传进去。然后在paint(Graphics g)函数中调用该函数。9. 在一个类中创建另一个类的对象,一般在成员变量(或对象)区声明该对象,在构造函数中创建该对象。十、事件处理1. java中,事件是以事件类ActionEvent的对象“事件对象”的形式传递的。当事件源发生一个事件,是将由程序产生的一个事件对象从事件源传递给监听者。2. 要让一个类Cla监听两个事件源actor1、actor2(例如:两个JButton按钮)发生的事件:首先,要让Cla实现监听的功能:在Cla的定义语句的前面加上implements ActionListener,注意要引入java.awt.event.*这个包。然后,为监听者cla注册监听,即给事件源添加监听者。注册之后监听者才能获得事件:actor1.addActionListener(cla);actor2.addActionListener(cla);其中cla为Cla的一个对象。若注册监听语句是在Cla的一个方法内,则把cla改为this。接着,为事件源指定action命令:actor1.setActionCommand(“command1”);actor2.setActionCommand(“command2”);最后,要在监听者Cla的定义中实现接口ActionListener中的对事件的处理方法actionPerformed(ActionEvent e)(ActionEvent为事件类)。有多个事件源时,先判断是哪个事件源发生了事件:if(e.getActionCommand().equals(“command1”) /*事件源actor1给出了命令command1,则内执行command1的具体操作*/else fi(e.getActionCommand().equals(“command2”) ; /*事件源actor2给出了命令command2,则内执行command2的具体操作*/3. 一旦一个类监听了一个事件源,那么这个事件源所发生的事件就会自动传递给这个类,因为监听动作是时刻在进行的。4. 一个事件源可以有多个监听者。这时要为所有监听者都注册监听。一个事件源可能产生多个不同类型的事件5. 一个MyPanel实例通过监听键盘或鼠标事件来采取相应的处理,则MyPanel实例为监听者,而底层的JFrame实例为事件源。注意:在MyPanel的处理语句的最后应该加上一句:this.repaint();否则,无论键盘和鼠标发生什么事,MyPanel都不会有任何变化。6. 监听键盘时,MyPanel要实现KeyListener接口,要实现的方法有:keyPressed(KeyEvent e)(键被按下);keyReleased(KeyEvent e)(键被松开);keyTyped(KeyEvent e)(键的一个值被输入)。其中keyPressed(KeyEvent e)和keyTyped(KeyEvent e)的不同之处用下面的例子来说明:同时按shift和A,在keyPressed(KeyEvent e)看来就是shift和A这两个按键被按下了,在keyTyped(KeyEvent e)看来则是字符A被输入了。在JFrame中添加监听者的语句是:this.addKeyListener(mp); /mp为MyPanel的一个实例重要函数e.getKeyCode()是用来接收键盘输入并返回该键的码值,而KeyEvent类有很多表示键值的字段,可以用来和e.getKeyCode()的值作比较。7. 监听鼠标时,MyPanel要实现MouseListener接口,要实现的方法有:mouseClicked(MouseEvent arg0)(鼠标点击);mouseEntered(MouseEvent arg0)(鼠标进入面板);mouseExited(MouseEvent arg0)(鼠标离开面板);mousePressed(MouseEvent arg0)(鼠标)(鼠标按下);mouseReleased(MouseEvent arg0)(鼠标释放)。8. 常见事件类型:事件类说明ActionEvent通常在按下按钮,或栓剂一个列表项或选中某个菜单时发生AdjustmentEvent当操作一个滚动条时发生ComponentEvent当一个组件隐藏,移动,改变大小时发生ContainerEvent当一个组件从容器中加入或删除时发生FocusEvent当一个组件获得或失去焦点时发生ItemEvent当一个复选框或者列表项被选中时,当一个选择框或者选择菜单被选中时发生KeyEvent当键盘的按键被按下,松开时发生MouseEvent当鼠标被拖动,移动,点击按下时发生TextEvent当文本区和文本域的文本发生改变时发生WindowEvent当一个窗口激活,关闭,失效,恢复,最小化时发生十一、线程1. 在java中,一个类要当做线程类使用有两种方法:(1)继承Thread类,并重写run函数;(2)实现Runnable接口并重写run函数来使该类成为线程类。当一个类已经继承了一个父类,要使之成为一个线程类,就不能用(1)中的方法。因此应该尽可能用第(2)种方法创建线程。2. Thread类本身就实现了Runnable接口。3. 若一个类Cla通过继承Thread类成为线程类,则它的实例cla启动:cla.start(); /这句话会导致run函数的运行若Cla通过实现Runnable接口成为线程类,则cla应该这样启动线程:Thread thr=new Thread(cla);thr.start(); /因为Runnable接口没有start这个方法4. 让线程进入阻塞状态:Thread.sleep(time);这是Thread类的静态方法,其中time为一个长整型数,表示程序运行到这里阻塞多少毫秒。这个语句会产生InterruptedException异常,使用时要用try-catch语句包起来。5. 一个线程对象只能启动一次,即只能运行一次start()。6. java处理线程同步问题,只需要按下面的方法做:synchronized(Object) 需要同步的代码其中,Object称为“对象锁”,它可以是任何类型的对象。因为java的所有对象都有一个标志位,该标志位有0和1两种状态,正好类似于锁的“关”和“开”两种状态。7. run()函数里面的语句若是隔一定时间执行一次(含有Thread.sleep(time);这个语句),要用while循环包起来。十二、IO编程,文件编程1. 文件在程序中是以流的形式来操作的。流:数据在数据源(文件或数据库)和程序(内存)之间经历的路径。输入流:数据从数据源(文件或数据库)到程序(内存)的路径。输出流:数据从程序(内存)到数据源(文件或数据库)的路径。2. java流分为字节流和字符流两种。字节流可用于读写二进制文件及任何类型文件;字符流可以用于读写文本文件。3.字节流字符流输入InputStreamReader输出OutputStreamWriter4. 文件类File是java流中最基础的类。文件实例的创建:File f=new File(“route of the file”);文件的绝对路径:f.getAbsolutePath();文件的大小(以字节为单位):f.length();文件是否可读:f.canRead();文件是否存在:f.exsits();当文件f不存在时,创建该文件:f.createNewFile()(文件存在时,则不创建,也不覆盖原文件);java把文件夹看做是一种特殊的文件。判断f是否为一个文件夹:f.isDirectory();当文件夹f不存在时,创建该文件夹f.mkdir();若文件夹f存在,则将该文件夹下所有文件(包括文件夹)返回到一个文件数组:File lists=f.listFiles();5. File类没有读写文件的功能,所以要借助于其子类来读写文件,如FileInputStream:File f=new File(“route of the file”);FileInputStream fis=null;try/ 打开文件操作会被提示IO异常,所以要用try-catch语句包起来fis=new FileInputStream(f);/* 因为文件f可能很大,所以不能直接把f全部读入内存,因此要分批读取,用一个字节数组来缓存每次读取的内容, 一般将该字节数组大小设为1024. */byte buffer=new byte1024; int n=0; /表示实际读取到buffer中的字节数/循环读取,每次

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论