2018-01-16

第01章 JAVA简介第02章 基础语法第02章 递归补充第03章 面向对象第04章 异常处理第05章 数组第06章 常用类第07章 容器第08章 IO第09章 线程第10章 网络第11章 GUI第01章 JAVA简介01_开班简介[课程内容]  1、JAVA概述  2、JAVA语言基础  3、面向对象编程  4、JAVA异常处理机制  5、数组  6、JAVA常用类  7、JAVA容器类  8、JAVA流技术  9、JAVA多线程机制  10、JAVA网络编程  11、GUI编程03_JDK初步与HelloWorld[课程简介]  本教程自从发布以来,已经被下载了2000多万次,创造了国内视频教程的记录。该教程是尚学堂老师上课时真实录制而成, 充分展现了讲师的风采,高超的技术、幽默的授课风格、深入浅出的分析。  本教程从最基本的数据类型开始讲解,直到多线程等技术要点,很多要点都做了内存分析,真正做到了深入浅出,让学习者 更容易入门,更容易把握JAVA的本质。  随着技术的发展,我们将在随后,发布更多JAVASE方面的新课程。敬请关注!  [课程内容]  1、计算机语言的历史以及Java语言的历史地位  2、Java自身的发展史  3、Java体系  4、Java的特点  5、Java的运行机制  6、Java运行环境的安装与配置  7、第一个程序HelloWorld一、计算机语言发展史及Java的历史地位  1.第一代语言  ◇打孔机—纯机器语言  2.第二代语言  ◇汇编  3.第三代语言  ◇C、Pascal、Fortran面向过程的语言  ◇C++面向过程I面向对象  ◇Java跨平台的纯面向对象的语言  ◇.NET跨语言的平台二、Java发展史与java体系  95年,Sun发布JDK1.0  98年, JDK1.2, 更名为Java2  后续JDK1.3、 1.4  目前JDK1.5, 更名为Java 5.0 C最新为1.6 Beta版)  我们使用5.0三、Java语言的特点  一种面向对象的语言。  一种平台无关的语言, 提供程序运行的解释环境。  一种健壮的语言, 吸收了CIC++语言的优点, 但去掉了其影响程序健壮性的部分(如:指针、 内存的申请与释放等)。四、Java程序运行机制及运行过程Java两种核心机制:Java 虚拟机( Java Virtual Machine ) 垃圾收集机制( Garbage collection )五、核心机制之Java虚拟机Java虚拟机可以理解成一个以字节码为机器指令的CPU。 对于不同的运行平台,有不同的虚拟机。 Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”六、核心机制之垃圾收集不再使用的内存空间应回收一垃圾收集。 在C/C++等语言中,由程序员负责回收无用内存。 Java语言消除了程序员回收无用内存空间的责任;它提供一种系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储器空间。 垃圾收集在Java程序运行过程中自动进行,程序员无法精确控制和千预。七、Java开发环境的下载安装配置1、配置Java开发环境步骤(WindowsXP) 令下载并安装最新版本的J2SDK。2、设置Windows环境变量。 3、选择合适的文本编辑器或使用集成开发环境。1、下裁 http://javasun.com2、安装 3、配置 path & classpath◇path: windows系统执行命令时要搜寻的路径 ◇classpath: java在编译和运行时要找的class所在的路径4、验证◇java运行java程序◇javac编译java程序Java Application初步    1、Java源文件以“java”为扩展名。源文件的基本组成部分是类(class),如本例中的HelloWorld 类。    2、一个源文件中最多只能有一个public类。其它类的个数不限,如果源文件 文件包含一个public类,它必需按该类名命名。    3、Java应用程序的执行入口是main()方法。它有固定的书写格式:    4、Java语言严格区分大小写。    5、Java方法有一条条语句构成,每个语句以分号结束。    6、Java语言有三种注释方式:04_HelloWorld解释与程序员的设置 [源码]05_HelloWorld常见问题与classpath配置[课程截图]  [源码]06_总结1、总结第一个程序1)构建程序自己的环境2)运用 copy3)掌握 path 和 classpath4)熟悉常见的错误5)熟悉 java程序简单规则6)熟悉java程序的编译和运行2、常见Java开发环境编辑器:UltraEditEditPlus集成开发环境(IDE):JBuilder (http://www.borland.com)Eclipse (http://www.eclipse.org)Sun One Studio (http://java.sun.com)WSAD (http://www.ibm.com)3、课堂练习 [源码]07_UltraEdit遗留问题第02章 基础语法01_标识符_关键字_数据类型_1 [课程内容]1、标识符2、关键字3、Java基本数据类型4、运算符5、表达式和语句6、分支7、循环8、方法9、变量的作用域10、递归调用1、标识符Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符〇凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则Java标识符命名规则:〇标识符由字母、下划线·_"、美元符·$"或数字组成〇标识符应以字母、下划线、美元符开头〇 Java标识符大小写敏感,长度无限制约定俗成: Java标识符选取因注“见名知意”且不能与 Java语言的关键字重名   2、关键字Java中一些赋以特定的含义,用做专门用途的字符串称为关键字(keyword)〇大多数编辑器会将关键字用特殊方式标出所有Java关键字都是小写英文goto和const虽然从未使用,但也作被为Java关键字保留3、Java常量Java的常量值用字符串表示,区分为不同的数据类型〇如整型常量123〇实型常量3.14〇字符常量'a''〇逻辑常量true、 false〇字符串常量•helloworld"注意:区分字符常量和字符串常量注意: “常量”这个名词还会用在另外其它语境中表示值不可变的变量〇参见final关键字 4、Java变量Java变量是程序中最基本的存惟单元,其要素包括变量名,变量类型和作用域Java程序中每一个变量都属子特定的数据类型,在使用前必须对其声明,声明格式为:例如:从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,,因此,每一个变量使用前必须要先申请(声明) ,然后必须进行赋值(填充内容) ,才能使用5、Java变量的分类按被声明的位置划分:〇局部变量:方法或语句块内部定义的变量〇成员变量:方法外部、类的内部定义的变量〇注意:类外面(与类对应的大括号外面)不能有变量的声明按所属的数据类型划分:〇基本数据类型变量〇引用数据类型变量 6、Java局部变量与成员变量方法体内部声明的变量(包括形参)称为局部变量:〇方法体内部是指与方法对应的大括号内部在方法体外,类体内声明的变量成为成员变量注:以上程序目前还不能编译7、Java数据类型的划分8、Java基本数据类型Java中定义了4类8种基本数据类型。〇逻辑型-boolean〇文本型-char〇整数型-byte,short,int,long〇浮点数型-float,double9、逻辑型Boolean〇boolean类型适子逻辑运算, 一般用子程序流程控制〇boolean类型数据只允许取值true或 false,不可以 0或非 0的整数替代true 和 false,这点和C语言不同。〇用法举例:10、字符型charchar型数据用来表示通常意义上“字符”字符常量为用单引号括起来的单个字符,例如:Java字符采用 Unicode编码,每个字符占两个字节,因而可用十六进制编码形式表示,例如:〇char cl ='\u0061';〇注: Unicode是全球语言统一编码Java语言中还允许使用转义字符'\'来将其后的字符转变为其它的含义,例如:char c2 = '\n'〇//‘\n’代表换行符补充: 2进制、10进制、16进制之间的转换01_标识符_关键字_数据类型_2整数类型Java各整数类型有固定的表数范围和字段长度,其不受具体操作系统的影响,以保证Java程序的可移植性Java语言整型常量的三种表示形式:〇十进制整数,如: 12,-314,0〇八进制整数,要求以0开头,如: 012〇十六进制数,要求0x或0X开头,如: 0x12Java语言的整型常量默认为int型,声明long型常量可以后加'| '或'L' ,如:〇 int ii =600;//正确   long|1 =88888888888L;//必须加|否则会出错浮点类型与整数类型类似, Java浮点类型有固定的表数范围和字段长度,不受平台影响,Java浮点类型常量有西种表示形式〇十进制数形式,例如:3.14     314.0    314〇科学记数法形式,如3.14e2    3.14E2    100E-2Java浮点型常量默认为 double型,如要声明一个常量为 float型,则需在数字后面加 f或F,如:〇 doubled= 12345.6;//正确  floatf= 12.3f;//必须加f否则会出错下面列出Java的各种浮点类型:[源码]03_数据类型转换_1基本数据类型转换boolean类型不可以转换为其他的数据类型整形,字符型,浮点型的数据在、1昆合运算中相互转换,转换时遵循以下原则:〇容量小的类型自动转换为容量大的数据类型;数据类型按容量大小排序为  byte,short,char->int->long->float->double  byte,short,char之间不会互相转換,他们三者在计算时首先回转換为int类型〇容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出; 使用时要格外注意〇有多种类型的数据混合运算时, 系统首先自动的将所有数据转换成容量最大的那一种数据类型, 然后再进行计算〇实数常量(如: 1.2)默认为double〇整数常量(如: 123)默认为int课堂练习[源码]04_数据类型转换_2public class TestConvert2 {    public static void main(String[] args) {        int i=1,j=12;    float f1=(float)0.1;  //0.1f    float f2=123;    long l1 = 12345678,l2=8888888888L;    double d1 = 2e20,d2=124;    byte b1 = 1,b2 = 2,b3 = 127;    j = j+10;    i = i/10;    i = (int)(i*0.1);    char c1='a',c2=125;    byte b = (byte)(b1-b2);    char c = (char)(c1+c2-1);    float f3 = f1+f2;    float f4 = (float)(f1+f2*0.1);    double d = d1*i+j;    float f = (float)(d1*5+d2);      }}05_程序格式 格式应该注意的问题1、大括号对齐2、遇到{ 缩进,Tab/Shift + Tab3、程序块之间加空行4、并排语句之间加空格5、运算符两侧加空格    有特定条件6、{ 前面有空格7、成对编程 06_运算符    运算符        自加和自减运算符         逻辑运算符            赋值运算符与扩展赋值运算符            字符串连接符        〇“+”除用子算术加法运算外,还可用子对字符串进行連接操作        int id= 800+ 90;        String s= "hello" + "world";    〇 “+”运算符两側的操作数中只要有一个是字符串(String)类型, 系统会自动将另一个操作数转换为字符串然后再进行连接 。        intc= 12;        System.out.println("c=" + c);    〇当进行打印时,无论任何类型,都自动转为字符串进行打印    〇 System.out.println(c);    表达式        三目条件运算符    07_if分支与for循环语句        条件语句一根据不同条件,执行不同语句    〇 if    〇 if_else    〇 if_else if    〇 if_ else if_ else if_ else    〇 switch    循环语句一重复执行某些动作    〇 for(JDK15语法)    〇 while    〇 do_ while;    if语句        for循环语句        [源码]08_练习   [源码]    09_练习补充[源码]10_while_break_continuewhile & dowhile 语句    break&Continue语句[源码]11_循环语句举例 循环语句举例12_switch语句 Switch语句(条件语句补充)    [源码]13_方法方法    [源码]        14_当天复习第02章 递归补充01_递归_1  递归调用02_递归_2 递归调用  递归调用指在方法执行过程中出现该方法本身的调用例如:  求Fibonacci数列:1,1,2,3,5,8,...第40个数的值。数列满足递推公示:    F1=1,F2=1     Fn= Fn-1 + Fn-2( n>2 )03_递归_3    [课程内容] 04_递归_4递归调用  递归调用指在方法执行过程中出现该方法本身的调用例如:  求Fibonacci数列:1,1,2,3,5,8,...第40个数的值。数列满足递推公示:    F1=1,F2=1     Fn= Fn-1 + Fn-2( n>2 )05_非递归_506_总结    总结  1、标识符•  不用记规则,动手  2、关键字•  if else switch for while do while break continue void  3、局部变量VS成员变量•  变量作用域•  内存布局  4、基础类型变量•  4类8种 互相转换  5、分支、循环 if switch for while do while  6、方法•  形参、实参、返回值、返回值类型•  递归调用(画图理解)第03章 面向对象01_面向对象设计思想_重要_1 [课程内容]  1、编程语言的发展  2、面向过程的设计思想  3、对象和类的概念  4、类之间的关系  5、对象和引用  6、Java类的定义  7、构造函数  8、对象的创建和使用  9、this关键字  10、static关键字  11、package和import语句  12、访问控制  13、类的继承  14、方法的重写  15、final关键字  16、Object类  17、对象转型  18、多态  19、抽象类  20、接口  编程语言的发展  机器语言一直接由计算机的指令组成,指令、数据、地址都以“0”和“1”的符合串 组成;可以被计算机直接执行。  汇编语言一用容易理解和记忆的符号表示指令、数据以及寄存器等,抽象层次很低,程序员需要考虑大量的机器细节。  高级语言一屏蔽了机器细节,提高了语言的抽象层次接近于人的自然语言,60 年代出现的结构化编程语言提出了结构化数据和语句,数据和过程抽象等概念。  面向对象的语言一与己往的各种语言的根本不同是,它的设计出发点就是为了 更能直接的描述问题域中客观存在的事物。  面向过程的设计思想和面向对象的设计思想  我要去新疆      面向过程  我开车,我挂档,我踩油门,我过河北,我过陕西...      面向对象          我命令车去新疆          车怎么去不关我事          ◇信息封装在车这个类的内部          ◇我不用去了解车整个开动的过程  面向对象的设计思想  面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的的自然思维方式。  面向对象更加强调运用人类在日常的思维逻辑中经常采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。  对象和类的概念  对象用计算机语言对问题域中事物的描述,对象通过“属性(attribute) ”和“方法 (method) ”来分别对应事物所具有的静态属性和动态属性。  类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所因具有的静态和动态属性。  类可以看成一类对象的模板,对象可以看成该类的一个具体实例。  类(对象)之间的关系 之 关联关系  继承关系(一般和特殊)  聚合关系(整体和部分)  实现关系  多态  课堂练习02_面向对象设计思想_重要_2Java与面向对象  对象是Java程序的核心,在Java程序中“万事万物皆对象”。  对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体。  类是用来创建同一类型的对象的“模板”,在一个类中定义了该类对象所应具有的 成员变量以及方法。  J2SDK提供了很多类供编程人员使用,编程人员也可定义自己的类。  我们的语言:成员变量=属性 方法=函数  为什么用对象?    1、面向对象的编程 —— 一组对象互相配合通过沟通完成特定功能      1)所有的paradigm都是对现实问题的抽象          △汇编是对机器语言的抽象          △面向过程的语言是对汇编的抽象          △对象更加符合对于现实问题的抽象  2、对象都有对外服务的接口      2)通过继承可以复用  3、对象隐藏内部服务的实现      3)通过聚合可以复用  4、面向对象更加容易使我们达到这些年来苦苦追求的境界      4)Reusable、Extensibility、维护和替换更加方便、...  5、组件——比对象更高的层次上的抽象(二进制级别)      5)EJB、Web Service、CORBA、COM、…  Java类的定义  •类的定义主要有两方面组成一成员变量和方法。  •声明成员变量的格式为:[< modifiers>] type < attr_name>[=defaultValue];  例如: private int id; private int age = 20;  • 声明方法的格式为:  [< modifiers>] < modifiers>([]) {[〈statements〉]  } 例如:public int getAge (){return age; }  [源码]03_JAVA中的面向对象与内存解析_1 Java面向对象基本概念-引用  对象的创建和引用  必须使用new关键字创建对象。  使用对象(引用成员变量或来引用对象的成员变量。  使用对象(引用)方法(参数列表)来调用对象的方法。  同一类的每个对象有不同的成员变量存储空间。  同一类的每个对象共享该类的方法。  方法(复习)   类和对象的关系  [源码]04_JAVA中的面向对象与内存解析_2  构造方法(构造函数)  • 使用new +构造方法创建一个新的对象。  • 构造函数是定义在Java类中的一个用来初始化对象的函数。  • 构造函数与类同名且没有返回值。  • 例如:Person类的构造函数:  构造函数(一)  > 创建对象时,使用构造函数初始化对象的成员变量。    构造函数(二)  >当没有指定构造函数时,编译器为类自动添加形如 类名( ) { } 的构造函数。  >例如:  [源码]05_约定俗成命名规则 约定俗成的命名规则  类名的首字母大写  变量名和方法名的首字母小写  运用驼峰标识  [源码]06_内存解析_1实例 (1)07_内存解析_2 实例(2)  调用过程  [源码]08_内存解析_3  [课程内容]  [源码]09_练习课堂练习 10_答案答案]11_内存解析[课程内容]  [源码]12_方法重载与内存解析  方法的重载方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。 调用时,会根据不同的参数表选择对应的方法。例如:在Person类中添加如下方法:  构造方法的重载>与普通方法一样,构造方法也可以重载:>例如:修改Person类的构造方法为:  课堂练习  [源码]13_对象创建与使用_复习与练习复习:对象的创建和使用1、必须使用new关键字创建对象。2、使用对象引用.成员变量或来引用对象的成员变量。3、使用对象引用.方法(参数列表)来调用对象的方法。4、同一类的每个对象有不同的成员变量存储空间。5、同一类的每个对象共享该类的方法。△非静态方法是针对每个对象进行调用  [源码]14_TestCircle程序分析_1[课程内容]  [源码]15_TestCircle程序分析_2[课程内容]  [源码]16_TestCircle程序分析_3 课堂练习  [源码] this关键字  在类的方法定义中使用的this关键字代表使用该方法的对象的引用。  当必须指出当前使用方法的对象是谁时要使用this。  有时使用this可以处理方法中成员变量和参数重名的情况。  this可以看作是一个变量,它的值是当前对象的引用。18_static关键字_1  1、在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所以对象来说,static成员变量只有一份。  2、用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。      ◇静态方法不再是针对于某个对象调用,所以不能访问非静态成员  3、可以通过对象引用或类名(不需要实例化)访问静态成员。  [源码]19_static_关键字_2 static关键字  1、在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所以对象来说,static成员变量只有一份。  2、用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。      ◇静态方法不再是针对于某个对象调用,所以不能访问非静态成员  3、可以通过对象引用或类名(不需要实例化)访问静态成员。  [源码]20_package和import语句_1  package 和 import语句  >为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间。  >package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。 (若缺省该语句,则指定为无名包)。  >它的格式为:      package pkg1[.pkg2[.pkg3...]];  >Java编译器把包对应于文件系统的目录管理,package语句中,用'.'来指明包 (目录)的层次,例如使用语句      package com.sxt;          则该文件中所以的类位于.\com\sxt目录下  [源码]21_package和import语句_2package import 总结  1、如果想将一个类放入包中,在这个类源文件第一句话写package  2、必须保证该类的class文件位于正确目录下      1)该类的源码可能会产生影响          △删除或转移到另外的目录  3、另外的类想访问的话:      1)写全名      2)引入          △*          △具体类名      3)访问位于同一个包中的类不需要引入  4、必须class文件的最上层包的父目录位于classpath下  5、执行一个类需要写全包名  [源码]22_package和import语句_3  J2SDK中主要的包介绍  java.lang—包含一些Java语言的核心类,如String、Math、Integer、System和 Thread,提供常用功能。  java.awt—包含了构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。  java.applet—包含applet运行所需的一些类。  java.net—包含执行与网络相关的操作的类。  java.io—包含能提供多种输入/输出功能的类。  java.util—包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。23_package和import语句_424_继承和权限控制_1  类的继承与权限控制  1、Java中使用extends关键字实现类的继承机制,其语法规则为:      < modifier> class < name> [extends < superclass〉]{... ...}  2、通过继承,子类自动拥有了基类 (superclass)的所有成员(成员变量和方法)。  3、Java只支持单继承,不允许多继承:      ◇一个子类只能有一个基类一个基类可以派生出多个子类25_继承和权限控制_2访问控制1、Java权限修饰符public protected private置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。2、对于class的权限修饰只可以用public和default。◇public类可以在任意地方被访问。◇default类只可以被同一个包内部的类访问。  [源码]  1、TestPerson.java2、TestAccess.java  3、TestProtected.java26_重写  方法的重写在子类中可以根据需要对从基类中继承来的方法进行重写。重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。重写方法不能使用比被重写方法更严格的访问权限。  [源码]27_super关键字  Super关键字    >在Java类中使用super来引用基类的成分,例如:    [源码]28_继承中的构造方法_1 继承中的构造方法  1、子类的构造的过程中必须调用其基类的构造方法。  2、子类可以在自己的构造方法中使用super(argumentjst)调用基类的构造方法。      △使用this(argumentjist)调用本类的另外的构造方法      △如果调用super,必须写在子类构造方法的第一行  3、如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法。  4、如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。  [源码]29_练习_1课堂练习30_练习_2    实例(1)  实例(3)  >分析输出结果和对象的构造过程:31_练习_3 实例(1)  实例(3)  >分析输出结果和对象的构造过程:32_练习_4    课堂练习    [代码]33_JDK_API文档查询 Object 类  1、Object类是所有Java类的根基类  2、如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类  3、等价于:34_Object类之toString方法Object 类  1、Object类是所有Java类的根基类  2、如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类  3、等价于:  [源码]35_hashcode解释    [课程内容]36_Object类之equals方法equals方法  Object类中定义有:1、public boolean equals(Object obj)方法      △提供定义对象是否“相等”的逻辑。2、Object的equals方法定义为:x.equals(y)当x和y是同一个对象的应用时返回true否则返回false3、J2SDK提供的一些类,如String,Date等,重写了Object的equals方法,调用这些类的equals方法,x.equals(y),当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同玢象), 返回true否则返回false。4、可以根据需要在用户自定义类型中重写equals方法。  [源码]37_对象转型_1 对象转型(casting)1、一个基类的引用类型变量可以“指向”其子类的对象。2、一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。3、可以使用引用变量instanceof类名来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。4、子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)    对象转型实例I(1)    对象转型实例I(2)38_对象转型_2[课程内容] 39_多态_1 动态绑定和多态1、TestPolymoph/Test.java2、动态绑定是指“在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。3、上面例子中,根据Lady对象的成员变量pet所引用的不同的实际类型而调用相应的enjoy方法。  [源码]40_多态_2课堂练习 41_抽象类   抽象类  用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。  含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。  抽象类不能被实例化。  抽象方法只需声明,而不需实现。42_final关键字   Final关键字  1、final的变量的值不能够被改变      ◇final的成员变量      ◇final的局部变量(形参)  2、final的方法不能够被重写  3、final的类不能够被继承    [源码]43_interface_1  接口1、接口(interface)是抽象方法和常量值的定义的集合。2、从本质上讲,接口是一种特殊的抽象类,这种抽象类中之包含常量和方法的定义,而没有变量和方法的实现。3、接口定义举例:    [源码]44_interface_2   [课程内容]    [源码]45_总结    第三章总结•  内存分析贯穿始终•  对象和类的概念•  类(对象)之间的关系•  面向对象设计思想•  class•  new▪     引用的概念▪     构造方法的概念•  方法重载▪  构造方法重载•  this•  static•  package&import•  private default protected public•  extends•  overwrite•  final•  Object▪  toString▪  equals•  upcasting downcasting•  polymophysm/dynamic binding/late•  abstract class•  interface▪  implements    课堂练习01_异常的概念_11、Java异常概念2、Java异常的分类3、异常的捕获和处理■运行期出现的错误●观察错误的名字和行号最重要    异常的概念Java异常是Java提供的用于处理程序中错误的一种机制。所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常。当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。    [源码]02_异常的概念_2import java.io.*; public class TestEx {    public static void main(String[] args) {                 try {            new TestEx().f2();        } catch (IOException e) {            e.printStackTrace();        }                 /*        int[] arr = {1, 2, 3};        System.out.println(arr[2]);        try {            System.out.println(2/0);        } catch (ArithmeticException e) {            System.out.println("系统正在维护,请与管理员联系");            e.printStackTrace();        }        */                 //TestEx te = new TestEx();        //te.m(0);                 /*        try {            new TestEx().m(0);        } catch (ArithmeticException ae) {            ae.printStackTrace();            System.out.println("出错了");        }        */                          FileInputStream in = null;             try {        in = new FileInputStream("myfile.txt");        int b;        b = in.read();        while (b != -1) {            System.out.print((char) b);            b = in.read();        }    } catch (IOException e) {      System.out.println(e.getMessage());            } catch (FileNotFoundException e) {        e.printStackTrace();            } finally {        try {          in.close();      } catch (IOException e) {          e.printStackTrace();      }    }           }         void m(int i) throws ArithmeticException {        if(i==0)             throw new ArithmeticException("被除数为0");    }         void f() throws FileNotFoundException , IOException {        FileInputStream in = new FileInputStream("myfile.txt");    int b;    b = in.read();    while (b != -1) {        System.out.print((char) b);        b = in.read();    }    }         void f2() throws IOException {        /*        try {            f();        } catch (FileNotFoundException e) {            System.out.println(e.getMessage());        } catch (IOException e) {            e.printStackTrace();        }        */        f();    }     } 03_异常的分类  异常的概念    异常的分类      J2SDK中定义了很多异常类,这些类对应了各种各样可能出现的异常事件。 04_finally语句  异常的捕获和处理(1)    异常的捕获和处理(2)    try语句1、try{...} 语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。2、在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。3、如果没有例外产生,所有的catch代码段都被略过不执行。    catch语句1、在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。2、在catch中声明的异常对象(catch(SomeException e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。3、例如:•getMessage()方法,用来得到有关异常事件的信息。•printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容。    finally语句1、finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。2、无论try所指定的程序块中是否抛出例外,finally所指定的代码都要被执行。3、通常在finally语句中可以进行资源的清除工作,如:•关闭打开的文件•删除临时文件•...    [源码]    异常的捕获和处理06_异常的其他问题    使用自定义的异常      1. 通过继承java.lang.Exception类声明自己的异常类。  2. 在方法适当的位置生成自定义异常的实例,并用throw语句抛出。  3. 在方法的声明部分用throws语句声明该方法可能抛出的异常。    声明并抛出异常    >注意:    重写方法需要抛出与原方法所抛出类型一致异常或不抛出异常。    >例如:07_总结 第四章总结    •  一个图•  五个关键字•  先逮小的,再逮大的•  异常和重写的关系第05章 数组01_一维数组内存分析[本章内容]      一维数组的声明和初始化  数组元素的引用  二维数组的声明和使用  数组拷贝    数组概述      数组可以看成是多个相同类型数据组合,对这些数据的统一管理。  数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。  数组中的元素可以是任何数据类型,包括基本类型和引用类型。 02_数组元素的创建和使用动态初始化  数组定义与为数组元素分配空间和赋值的操作分开进行,例如:  静态初始化  在定义数组的同时就为数组元素分配空间并赋值,例如:03_练习_1数组元素的引用      1、定义并用运算符new为之分配空间后,才可以引用数组中的每个元素,数组元素的引用方式为:  1)index为数组元素下标,可以是整型常量或整型表达式。如:  2)数组元素下标从0开始;长度为n的数组的合法下标取值范围为  2、每个数组都有一个属性length指明它的长度,例如:  3)a.length的值为数组a的长度(元素个数)    [源码]04_练习_205_练习_3public class TestArray {    public static void main(String[] args) {        int[] a = {2, 4, 6, 7, 3, 5, 1, 9, 8};        /*        for(int i=0; i角度toRadians(double angdeg)角度->弧度    File类java.io.File类代表系统文件名(路径和文件名)。File类的常见构造方法:public File(String pathname)以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。public File(String parent,String child)以parent为父路径,child为子路径创建File对象。File的静态属性String sqparator存储了当前系统的路径分隔符。    [源码]11_递归列出目录结构[源码]12_Enum   java.lang.Enum枚举类型      1、枚举类型:•      只能够取特定值中的一个•      使用enum关键字•      是java.lang.Enum类型  2、举例:•      TestEnum.java    [源码]13_总结   总结  1、String相关      1)正则表达式  2、基础类型包装类  3、Math  4、File      2)递归  5、枚举类型  要经常的查询API文档第七章容器01_容器API_Collection_1 阅读如下程序:    容器:Java API 所提供的一系列类的实例,用于在程序中存放对象。02_Collection_2    Collection方法举例    输出结果:    [源码]02_Collection_2Collection方法举例    输出结果:    [源码]03_Collection_304_Collection_405_Iterator  Iterator接口  1、所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。  2、Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。  3、Iterator接口定义了如下方法:•  boolean hasNext(); //判断游标右边是否有元素•  Object next(); //返回游标右边的元素并将游标移动到下一个位置•  void remouve(); //删除游标左面的元素,在执行完next之后该操作只能执行一次06_EnhancedFor_and_Set    JDK1.5增强的for循环      1、增强的for循环对于遍历array或Collection的时候相当简便      1)示例EnhancedFor.java  2、缺陷:      2)数组:      1. 不能方便的访问下标值      3)集合:      2. 与使用iterator相比,不能方便的删除集合中的内容•      在内部也是调用iterator  3、总结:      4)除了简单遍历并读出其中的内容外,不建议使用增强for    Set接口  Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复。  Set容器可以与数学中“集合”的概念相对应。  J2SDK API中所提供的Set容器类有HashSet, TreeSet等。07_List_and_Collections List接口08_Comparable      List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复。  List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。  J2SDK所提供的List容器类有ArrayList, LinkedList等。 Comparable 接口问题:上面的算法根据什么确定容器中对象的“大小”顺序?所有可以“排序”的类都实现了java.lang.Comparable 接口,Comparable接口中只有一个方法public int compareTo(Object obj);该方法:返回 0 表示this == obj返回正数表示this > obj返回负数表示this < obj实现了Comparable接口的类通过实现 comparaTo 方法从而确定该类对象的排序方式。    [源码]09_Map_1 如何选择数据结构*  衡量标准:读的效率和改的效率•  Array读快改慢•  Linked改快读慢•  Hash两者之间    Map接口  实现Map接口的类用来存储键-值对。  Map接口的实现类有HashMap和TreeMap等。  Map类中存储的键-值对通过键来标识,所以键值不能重复。10_Auto_Boxing_Unboxing Auto-boxing/unboxing在合适的时机自动打包、解包自动将基础类型转换为对象自动将对象转换为基础类型TestMap2.java    [源码]11_示例_1    [源码]12_示例_213_泛型_1JDK1.5泛型1、起因:1)JDK1.4以前类型不明确:1. 装入集合的类型都被当作Object对待,从而失去自己的实际类型。2. 从集合中取出时往往需要转型,效率低,容易产生错误。2、解决办法:1)在定义集合的时候同时定义集合中对象的类型2)示例:BasicGeneric.java1. 可以在定义Collection的时候指定2. 也可以在循环时用Iterator指定3、好处:1)增强程序的可读性和稳定性    [源码]14_泛型_2import java.util.*;public class TestArgsWords2 {  private static final int ONE = 1;  public static void main(String args[]) {    Mapm = new HashMap();

    for (int i = 0; i < args.length; i++) {


      if (!m.containsKey(args[i])) {

          m.put(args[i], ONE);

      }

      else {

          int freq = m.get(args[i]);

          m.put(args[i], freq + 1);

      }


    }

    System.out.println

        (m.size() + " distinct words detected:");

    System.out.println(m);

  }

}

15_总结

总结

  1136

      1)一个图

      2)一个类

      1. Collections

      3)三个知识点

      1. For

      2. Generic

      3. Auto-boxing/ unboxing

      4)六个接口

第八章 IO

01_IO初步

 1、Java流式输入/输出原理

  2、Java流类的分类

  3、输入/输出流类

  4、常见的节点流和处理流

  5、文件流

  6、缓冲流

  7、数据流

  8、转换流

  9、Print流

  10、Object流

    Java流式输入/输出原理

  02_FileInputStream_FileOutputStream    节点流类型

    Writer的基本方法

  //向输出流中写入一个字符数据,该字节数据为参数b的低16位

  void write(int c) throws IOException

  //将一个字符类型的数组中的数据写入输出流,

  void write(char[] cbuf) throws IOException

  //将一个字符类型的数组中的从指定位置(offset)开始的

  //length个字符写入到输出流

  void write(char[] cbuf,int offset, int length)

              throws IOException

  //将一个字符串中的字符写入到输出流

  void write(String string) throws IOException

  //讲一个字符串从offset开始的length个字符写入到输出流

  void write(String string, int offset, int length)

              throws IOException

  //关闭流释放内存资源

  void close() throws IOException

  //将输出流中缓冲的数据全部写出到目的地

  void flush() throws IOException

03_FileReader_FileWriter

   [源码]

04_BufferedIO

 处理流类型

  05_IO_faqimport java.io.*;

public class TestFileInputStream {

  public static void main(String[] args) {

    int b = 0;

    FileInputStream in = null;

    try {

      in = new FileInputStream("d:\\share\\java\\io\\TestFileInputStream.java");

    } catch (FileNotFoundException e) {

      System.out.println("找不到指定文件"); 

      System.exit(-1);

    }


    try {

      long num = 0;

      while ((b=in.read())!=-1){

        System.out.print((char)b);

        num++;

      }

      in.close();  

      System.out.println();

      System.out.println("共读取了 "+num+" 个字节");

    } catch (IOException e1) {

      System.out.println("文件读取错误"); System.exit(-1);

    }

  }

}

06_TransformIO

   缓冲流

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。

J2SDK提供了四种缓冲流,其常用的构造方法为:

• 缓冲输入流支持其父类的mark和reset方法。

• BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔)。

• BufferedWriter提供了newLine用于写入一个行分隔符。

• 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。

    转换流

• InputStreamReader 和 OutputStreamWriter用于字节数据到字符数据之间的转换。

• InputStreamReader 需要和 InputStream “套接”。

• OutputStreamWriter 需要和 OutputStream “套接”。

• 转换流在构造时可以指定其编码集合,例如:

InputStream isr = new InputStreamReader

(System.in,"ISO8859_1")

    [源码]

07_DataIO_and_ByteArrayIO   数据流

• DataInputStream 和 DataOutputStream 分别继承自 InputStream 和 OutputStream,它属于处理流,需要分别“套接”在 InputStream 和 Outputstream 类型的节点流上。

• DataInputStream 和 DataOutputStream 提供了可以存取与机器无关的Java原始类型数据(如:int, double 等) 的方法。

• DataInputStream 和 DataOutputStream的构造方法为:

• 1. DataInputStream ( InputStream in )2.DataOutputStream ( OutputStream out )

    [源码]

08_PrintIO  Print 流

• PrintWriter 和 PrintStream 都属于输出流,分别针对于字符和字节。

• PrintWriter 和 PrintStream 提供了重载的print

• Println方法用于多种数据类型的输出。

• PrintWriter 和 PrintStream 的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。

• PrintWriter 和 PrintStream 有自动flush功能。

    [源码]

09_ObjectIO Object流

  直接将Object写入或读出

• TestObjectIO.java

• transient关键字

• serializable接口

• externalizable接口

    [源码]

10_总结

  Inputstream/Outputstream

  Reader/Writer

  FileInputStream/FileoutputStream

  FileReader/FileWriter

  BufferedInputstream/bo

  BufferedReader/BufferedWriter

  BytearrayInputstream/bytearrao

  Inputstreamreader/Outputstreamwriter

  DataInputstream/Out

  PrintStream/PrintWriter

  ObjectInputstream/Out

第九章 线程

01_线程的基本概念

  线程的基本概念

  1、线程是一个程序内部的顺序控制流。

  2、线程和进程的区别

•   每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。

•   线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。

•   多进程:在操作系统中能同时运行多个任务(程序)

•   多线程:在同一应用程序中有多个顺序流同时执行

  Java的线程是通过java.lang.Thread类来实现的。

  VM启动时会有一个由主方法(public static void main(){})所定义的线程。

  可以通过创建Thread的实例来创建新的线程。

  每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。

  通过调用Thread类的start()方法来启动一个线程。

    [源码]

02_Sleep方法

   线程状态转换

    线程控制基本方法

  sleep / join / yield 方法

  sleep方法

可以调用Thread的静态方法:

public static void sleep(long millis) throws InterruptedException

使得当前线程休眠(暂时停止执行millis毫秒)。

由于是静态方法,sleep可以由类名直接调用:

Thread.sleep(...)

  join方法

合并某个线程

  yield方法

让出CPU,给其他线程执行的机会

    [源码]

03_Join_Yield_Priority

线程的优先级别

  1、Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。

  线程调度器按照线程的优先级决定应调度哪个线程来执行。

  2、线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。

  3、使用下述线方法获得或设置线程对象的优先级。

    [源码]

04_举例

线程的优先级别

  1、Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。

  线程调度器按照线程的优先级决定应调度哪个线程来执行。

  2、线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。

  3、使用下述线方法获得或设置线程对象的优先级。

    [源码]

05_线程同步_1 [源码]

07_线程同步_3   线程同步

1、在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。 每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问该对象。

2、关键字synchronized来与对象的互斥锁联系。 当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。

  synchronized的使用方法:

synchronized还可以放在方法声明中,表示整个方法为同步方法,例如:

synchronized public void add(String name){...}

    [源码]

08_线程同步_4

[源码]

09_线程同步_5

public class TT implements Runnable {

    int b = 100;


    public synchronized void m1() throws Exception{

        //Thread.sleep(2000);

        b = 1000;

        Thread.sleep(5000);

        System.out.println("b = " + b);

    }


    public synchronized void m2() throws Exception {

        Thread.sleep(2500);

        b = 2000;

    }


    public void run() {

        try {

            m1();

        } catch(Exception e) {

            e.printStackTrace();

        }

    }


    public static void main(String[] args) throws Exception {

        TT tt = new TT();

        Thread t = new Thread(tt);

        t.start();


        tt.m2();

        System.out.println(tt.b);

    }

}

10_线程同步_6

11_线程同步_7_生产者消费者问题

 [课程内容]

    [源码]

public class ProducerConsumer {

public static void main(String[] args) {

SyncStack ss = new SyncStack();

Producer p = new Producer(ss);

Consumer c = new Consumer(ss);

new Thread(p).start();

new Thread(p).start();

new Thread(p).start();

new Thread(c).start();

}

}

class WoTou {

int id; 

WoTou(int id) {

this.id = id;

}

public String toString() {

return "WoTou : " + id;

}

}

class SyncStack {

int index = 0;

WoTou[] arrWT = new WoTou[6];

public synchronized void push(WoTou wt) {

while(index == arrWT.length) {

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

this.notifyAll();

arrWT[index] = wt;

index ++;

}

public synchronized WoTou pop() {

while(index == 0) {

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

this.notifyAll();

index--;

return arrWT[index];

}

}

class Producer implements Runnable {

SyncStack ss = null;

Producer(SyncStack ss) {

this.ss = ss;

}

public void run() {

for(int i=0; i<20; i++) {

WoTou wt = new WoTou(i);

ss.push(wt);

System.out.println("生产了:" + wt);

try {

Thread.sleep((int)(Math.random() * 200));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

class Consumer implements Runnable {

SyncStack ss = null;

Consumer(SyncStack ss) {

this.ss = ss;

}

public void run() {

for(int i=0; i<20; i++) {

WoTou wt = ss.pop();

System.out.println("消费了: " + wt);

try {

Thread.sleep((int)(Math.random() * 1000));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

第八章 网络

01_网络基础_IP_TCP_UDP

网络基础概念

  什么是计算机网络:

  把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。

  计算机网络的主要功能

  资源共享

  信息传输与集中处理

  均衡负荷与分布处理

  综合信息服务(www/综合业务数字网络 ISDN)

网络基础概念

  什么是计算机网络:

  把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。

  计算机网络的主要功能

  资源共享

  信息传输与集中处理

  均衡负荷与分布处理

  综合信息服务(www/综合业务数字网络 ISDN)

03_TCP_Socket_2

  TCP Socket 通信模型

    [源码]

04_TCP_Socket_3import java.io.*;

import java.net.*;

import java.applet.Applet;

public class talkserver

{

    public static void main(String args[])

    {

        try

        {

            ServerSocket server = null;

            try

            {

                server = new ServerSocket(4700);

            }catch(Exception e)

            {

                System.out.println("can not listen to:" + e);

            }

            Socket socket = null;

            try

            {

                socket = server.accept();

            }catch(Exception e)

            {

                System.out.println("Error:" + e);

            }

            String line;

            BufferedReader is = new BufferedReader(new InputStreamReader(

                socket.getInputStream()));

            PrintWriter os = new PrintWriter(socket.getOutputStream());

            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

            System.out.println("Client:" + is.readLine());

            line = sin.readLine();

            while (!line.equals("bye"))   

            {

                os.println(line);

                os.flush();

                System.out.println("Server:" + line);

                System.out.println("Client:" + is.readLine());

                line = sin.readLine();

            }


            is.close();

            os.close();

            socket.close();

            server.close();

        }catch(Exception e)

        {

            System.out.println("Error" + e);

        }

    }

}

05_UDP_1

UDP

  1、不可靠的

  2、效率高

  3、数据报/非连接

      1)音频

      2)视频

      ...

  4、例:

  TestUDPServer.java

  TestUDPClient.java

    [源码]

06_UDP_2

[源码]

07_UDP_3[源码]

08_总结

总结

•   网络协议分层思想

•   IP的概念

•   TCP/UDP的概念

•   TCP/UDP程序的写法

  知识点的融会贯通 + 流的运用

第九章 GUI

01_GUI_初步_Frame_and_Panel

  AWT

  AWT(Abstract Window Toolkit)包括了很多类和接口,用于Java Application 的GUI(Graphics User Interface 图形用户界面)编程。

  GUI的各种元素(如:窗口,按钮,文本框等)由Java类来实现。

  使用AWT所涉及的类一般在java.awt包及其子包中。

  Container和Component是AWT中的两个核心类。

02_GUI_初步_Frame_and_Panel_Frame

  1、Frame是Windows的子类,由Frame或其子类创建的对象为一个窗体。

  2、Frame的常用构造方法:

      1)Frame()

      2)Frame(String s)创建标题栏为字符串s的窗口。

    Panel

  1、Panel对象可以看成可以容纳Compoent的空间

  2、Panel对象可以拥有自己的布局管理器

  3、Panel类拥有从其父类继承来的

  4、Panel的构造方法为:

03_布局管理器_1布局管理器

  1、Java语言中,提供了布局管理器类的对象可以管理

      1)管理Component在Container中的布局,不必直接设置Component位置和大小。

      2)每个Container都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Container的setLayout方法改变其布局管理器对象。

  2、Awt提供了5中布局管理器类:

•   FlowLayout

•   BorderLayout

•   GridLayout

•   CardLayout

•   GridBagLayout

BorderLayout布局管理器

  BorderLayout是Frame类的默认布局管理器。

  BorderLayout将整个容器的布局划分成

•   东(EAST)

•   西(WEST)

•   南(SOUTH)

•   北(NORTH)

•   中(CENTER)五个区域,组件只能被添加到指定的区域。

  如不指定组件的加入部位,则默认加入到CENTER区。

  每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。  布局管理器总结

  1、Frame是一个顶级窗口,Frame的缺省布局管理器为BorderLayout

  2、Panel无法单独显示,必须添加到某个容器中。

  3、Panel的缺省布局管理器为FlowLayout。

  4、当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。

  5、使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件大小和位置属性,如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。

  如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:

•   setLayout(null)

06_事件模型_ActionEvent

 事件监听

    [源码]

/*  范例名称:Java事件处理举例

 *    源文件名称:TestActionEvent2.java

 * 要  点:

 *   1. 一个事件源组件上可以同时注册多个监听器

 *     2. 一个监听器对象可以同时注册到多个事件源组件上

 *     3. 事件源的信息可以随它所触发的事件自动传递到所有注册过的监听器

 */


import java.awt.*;

import java.awt.event.*;

public class TestActionEvent2 {

    public static void main(String args[]) {

            Frame f = new Frame("Test");

            Button b1 = new Button("Start");

            Button b2 = new Button("Stop");

            Monitor2 bh = new Monitor2();

            b1.addActionListener(bh);       

            b2.addActionListener(bh);

            b2.setActionCommand("game over");

            f.add(b1,"North");       

            f.add(b2,"Center");

            f.pack();              

            f.setVisible(true);

    }

}


class Monitor2 implements ActionListener {

    public void actionPerformed(ActionEvent e) {

        System.out.println("a button has been pressed," + 

        "the relative info is:\n " + e.getActionCommand());    

    }

}

08_TextField_ActionEvent_1

TextField类

  1、java.awt.TextField类用来创建文本框对象。

  2、TextField有如下常用方法:

    [源码]

09_持有对方引用

import java.awt.*;

import java.awt.event.*;


public class TFMath {

    public static void main(String[] args) {

        new TFFrame().launchFrame();

    }

}


class TFFrame extends Frame {

    TextField num1, num2, num3;

    public void launchFrame() {

        num1 = new TextField(10);

        num2 = new TextField(10);

        num3 = new TextField(15);

        Label lblPlus = new Label("+");

        Button btnEqual = new Button("=");

        btnEqual.addActionListener(new MyMonitor());

        setLayout(new FlowLayout());

        add(num1);

        add(lblPlus);

        add(num2);

        add(btnEqual);

        add(num3);

        pack();

        setVisible(true);

    }


    private class MyMonitor implements ActionListener  {

        public void actionPerformed(ActionEvent e) {

            int n1 = Integer.parseInt(num1.getText());

            int n2 = Integer.parseInt(num2.getText());

            num3.setText("" + (n1+n2));

        }

    }


}



//class MyMonitor implements ActionListener {

    //TextField num1, num2, num3;

    /*

    public MyMonitor(TextField num1, TextField num2, TextField num3) {

        this.num1 = num1;

        this.num2 = num2;

        this.num3 = num3;

    }

    */

/* 

    TFFrame tf = null;


    public MyMonitor(TFFrame tf) {

        this.tf = tf;

    }


    public void actionPerformed(ActionEvent e) {

        int n1 = Integer.parseInt(tf.num1.getText());

        int n2 = Integer.parseInt(tf.num2.getText());

        tf.num3.setText("" + (n1+n2));


    }

}


*/10_内部类

内部类

  好处:

  可以方便的访问包装类的成员

  可以更清楚的组织逻辑,防止不应该被其它类访问的类进行访问。

  何时使用:

  该类不允许或不需要其它类进行访问时

    [源码]

11_Paint_方法

Graphics类 Paint方法

  每个Component都有一个paint(Graphics g)用于实现绘图目的,每次重画该Component时都自动调用paint方法。

  Graphics类中提供了许多绘图方法,具体请查询API文档

    [源码]

12_Adapter_and_repaint 鼠标事件适配器

  抽象类java.awt.event.MouseAdapter实现了MouseListener,可以使用其子类作为MouseEvent的监听器,只要重写其相应的方法即可。

  对于其他的监听器,也有对应的适配器。

  使用适配器可以避免监听器类定义没有必要的空方法。

  GUI/MyMouseAdapter.java 鼠标适配器

  repaint - update() - paint();

13_WindowEvent_and_匿名类

Window事件

  1、Window事件所对应的事件类为WindowsEvent,所对应的事件监听接口为WindowListener。

  2、WindowListener定义的方法有:

  与WindowListener对应的适配器为WindowAdapter。

•   GUI/TestWindowClose.java

•   GUI/TestAnonymous2.java

    [源码]

14_KeyEvent_1

/*  范例名称:匿名类在事件处理中的使用

 *    源文件名称:TestAnonymous2.java

 * 要  点:

 *     1. 匿名类只能是内部类

 *     2. 匿名类的两种创建方式----既可以继承父类、也可以单重实现接口

 */


import java.awt.*;

import java.awt.event.*;


public class TestAnonymous2 {

    Frame f = new Frame("Test");

    TextField tf = new TextField(10);

    Button b1 = new Button("Start");


    public TestAnonymous2(){

        f.add(b1,"North");

        f.add(tf,"South");


        b1.addActionListener(new ActionListener(){

            private int i;

            public void actionPerformed(ActionEvent e) {

               tf.setText(e.getActionCommand() + ++i);    

            }

        });


        f.addWindowListener(new WindowAdapter(){

            public void windowClosing(WindowEvent e){

                System.exit(0);

            }  

        });


        f.pack();          

        f.setVisible(true);    

    }  

    public static void main(String args[]) {

        new TestAnonymous2();

    }

}

15_KeyEvent_2

import java.awt.*;

import java.awt.event.*;


public class TestKey {

    public static void main(String[] args) {

        new KeyFrame().launchFrame();

    }

}


class KeyFrame extends Frame {

    public void launchFrame() {

        setSize(200, 200);

        setLocation(300,300);

        addKeyListener(new MyKeyMonitor());

        setVisible(true);

    }


    class MyKeyMonitor extends KeyAdapter {

        public void keyPressed(KeyEvent e) {

            int keyCode = e.getKeyCode();

            if(keyCode == KeyEvent.VK_UP) {

                System.out.println("UP");

            }

        }

    }

}16_j2se_总结

你可能感兴趣的:(2018-01-16)