1、第 1 章 Java 基本概念及环境配置 .1 FAQ1.01 什么是面向对象程序设计? 1 FAQ1.02 面向对象程序设计的基本特征有哪些? 2 FAQ1.03 Java 语言是如何产生和发展的? 3 FAQ1.04 Android 与 Java 语言有什么关系? 4 FAQ1.05 Java SE. Java EE 和 Java ME 有什么区别? 5 FAQ1.06 Java 语言的运行机制如何? 6 FAQ1.07 什么是 JVM?有什么作用?工作机制如何? 8 FAQ1.08 什么是 JRE(或 J2RE)? 9 FAQ1.09 什么是 JDK? 10 FAQ1.10 JDK. J
2、RE 和 JVM 之间有什么区别? 11 FAQ1.11 什么是 GC?GC 的工作原理如何? 12 FAQ1.12 如何安装 Java 基本开发环境 JDK? 13 FAQ1.13 为何在 JDK 安装路径下存在两个 JRE? 16 FAQ1.14 JDK 安装时设置 PATH 和 CLASSPATH 环境变量有何作用? 17 FAQ1.15 如何编译 . 运行 Java 应用程序? 18 FAQ1.16 如何将程序中的文档注释提取出来生成说明文档? 20 FAQ1.17 怎样制作鼠标双击就可以运行的 Jar 文件? 23 FAQ1.18 怎样给 main(String args)方法的 a
3、rgs 指定参数值? 26 第 2 章 Java 编程基础 28 FAQ2.01 Java 中的标识符如何命名?可以用中文吗? 28 FAQ2.02 Java 中有哪些关键字? 29 FAQ2.03 用 public. protected 和 private 修饰方法有什么区别? 30 FAQ2.04 this 关键字有什么含义?在哪些情况下应用? 31 FAQ2.05 super 关键字有什么含义?在哪些情况下应用? 32 FAQ2.06 static 关键字有什么含义?具体如何应用?能修饰构造方法吗? 34 FAQ2.07 final 关键字有什么含义?具体如何应用? 36 FAQ2.08
4、 instanceof 关键字有什么含义?如何应用? 37 FAQ2.09 Java 中有哪些数据类型? 38 FAQ2.10 如何解决 double 和 float 精度不准的问题? 40 FAQ2.11 int 和 Integer 都可以作为整数类型, 那么它们有什么区别? 43 FAQ2.12 float f=3.4 语句是否正确? 44 FAQ2.13 成员变量和局部变量有什么区别? 45 FAQ2.14 变量之间传值时可分为值传递和引用传递, 那么它们有何区别? 46 FAQ2.15 Java 中有哪些运算符?优先级如何? 48 FAQ2.16 在实现 x 和 y 相加时, x+=y
5、 和 x=x+y 两种实现方式有区别吗? 50 FAQ2.17 在执行与运算时 , 运算符public void teach(int a);public void teach(String a)为三种不同的方法。Overloading 方法是从低向高转。Byteshortfloatintlongdouble。在构造方法中,this 表示本类的其他构造方法:student();student(string n)this();/表示调用 student()如果调用 student(int a)则为 this(int a)。特别注意:用 this 调用其他构造方法时, this 必须为第一条语句,然
6、后才是其他语句。This 表示当前对象。Public void printNum()Int number=40;System.out.println(this.number); 此时打印的是实例变量,而非局部变量,即定义在类中而非方法中的变量。This.number 表示实例变量。谁调用 this.number 那么谁即为当前(this)对象的 number 方法。封装:使对象的属性尽可能私有,对象的方法尽可能的公开。用 private 表示此成员属性为该类的私有属性。Public 表示该属性(方法)公开;Private 表示该属性(方法)为只有本类内部可以访问(类内部可见) 。(想用 pri
7、vate 还要用 set 和 get 方法供其他方法调用,这样可以保证对属性的访问方式统一,并且便于维护访问权限以及属性数据合法性)如果没有特殊情况,属性一定私有,方法该公开的公开。如果不指明谁调用方法,则默认为 this。区分实例变量和局部变量时一定要写 this。11.29继承:父类(SuperClass)和 子类(SonClass ) 。父类的非私有化属性和方法可以默认继承到子类。Class Son extends Father而如果父类中的私有方法被子类调用的话,则编译报错。父类的构造方法子类不可以继承,更不存在覆盖的问题。 (非构造方法可以)如果子类访问父类的构造方法,则在编译的时候
8、提示访问不到该方法。JAVA 中不允许多继承,一个类有且只有一个父类(单继承) 。JAVA 的数据结构为树型结构,而非网状。 (JAVA 通过接口和内部类实现多继承)方法的覆盖(overriding)方法的重载并不一定是在一个类中:子类可以从父类继承一个方法,也可以定义一个同名异参的方法,也称为 overloading。当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。 (注意返回值类型也必须相同,否则编译出错。 )如果方法不同,则成重载。对于方法的修饰词,子类方法要比父类的方法范围更加的宽泛。父类为 public,那么子类为 private
9、 则出现错误。之所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的。以下范围依次由严到宽:private :本类访问;default :表示默认,不仅本类访问,而且是同包可见。Protected:同包可见 +不同包的子类可见Public :表示所有的地方均可见。当构造一个对象的时候,系统先构造父类对象,再构造子类对象。构造一个对象的顺序:(注意:构造父类对象的时候也是这几步) 递归地构造父类对象; 顺序地调用本类成员属性赋初值语句; 本类的构造方法。Super()表示调用父类的构造方法。Super()也和 this 一样必须放在第一行。This()用于调用本类的构造方法。如果没有定义构
10、造方法,那么就会调用父类的无参构造方法,即 super()。要养成良好的编程习惯:就是要加上默认的父类无参的构造方法。思考:可是如果我们没有定义无参的构造方法,而在程序中构造了有参的构造方法,那么如果方法中没有参数,那么系统还会调用有参的构造方法么?应该不会。多态:多态指的是编译时类型变化,而运行时类型不变。多态分两种: 编译时多态:编译时动态重载; 运行时多态:指一个对象可以具有多个类型。对象是客观的,人对对象的认识是主观的。例:Animal a=new Dog();查看格式名称;Dog d=(Dog)a。声明父类来引用子类。(思考上面的格式)运行时多态的三原则:(应用时为覆盖)1、 对象不
11、变;(改变的是主观认识)2、 对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。在上面的例子中:Animal a=new Dog();对象 a 的编译时类型为 Animal,运行时类型为 dog。注意:编译时类型一定要为运行时类型的父类(或者同类型) 。对于语句:Dog d=(Dog)a。将 d 强制声明为 a 类型,此时 d 为 Dog(),此时 d就可以调用运行时类型。注意:a 和 d 指向同一对象。3、 在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。关系运算符:instanceofa instanceof Animal;(这个式子的结果是一个布
12、尔表达式)a 为对象变量,Animal 是类名。上面语句是判定 a 是否可以贴 Animal 标签。如果可以贴则返回 true,否则返回 false。在上面的题目中: a instanceof Animal 返回 True,a instanceof Dog 也返回 True,instanceof 用于判定是否将前面的对象变量赋值后边的类名。Instanceof 一般用于在强制类型转换之前判定变量是否可以强制转换。如果 Animal a=new Animal();Dog d=Dog()a;此时编译无误,但运行则会报错。Animal a=new Dog()相当于下面语句的功能:Animal a=g
13、etAnimal();Public static Animal.getAnimal;Return new Dog();封装、继承、多态为面向对象的三大基石(特性) 。运行时的动态类型判定针对的是方法。运行程序访问的属性仍为编译时属性。Overloading 针对的是编译时类型,不存在运行时的多态。习题:建立一个 shape 类,有 circle 和 rect 子类。Shape 类有 zhouchang()和 area()两种方法。(正方形)squ 为 rect 子类,rect 有 cha()用于比较长宽的差。覆盖时考虑子类的 private 及父类的 public(考虑多态) ,之所以这样是避
14、免调用 A 时出现实际调用 B 的情况。而出现错误。11.29 下午讲的是教程上的 Module6Module6-7 包括:面向对象高级、内部类、集合、反射(暂时不讲) 、例外。面向对象高级、集合和例外都是面向对象的核心内容。面向对象高级: 修饰符:static:可修饰变量(属性) ;可修饰方法;可修饰代码块。Static int data 语句说明 data 为类变量,为一个类的共享变量,属于整个类。Int data 为实例变量。例:static int data;m1.data=0;m1.data+的结果为 1,此时 m2.data 的结果也为 1。Static 定义的是一块为整个类共有的
15、一块存储区域,其发生变化时访问到的数据都时经过变化的。其变量可以通过类名去访问:类名.变量名。与通过访问对象的编译时类型访问类变量为等价的。Public static void printData()表明此类方法为类方法(静态方法)静态方法不需要有对象,可以使用类名调用。静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象的概念。This.data 是不可用的。一般情况下,主方法是静态方法,所以可调用静态方法,主方法为静态方法是因为它是整个软件系统的入口,而进入入口时系统中没有任何对象,只能使用类调用。覆盖不适用于静态方法。静态方法不可被覆盖。 (允许在子
16、类中定义同名静态方法,但是没有多态,严格的讲,方法间没有多态就不能称为覆盖)当 static 修饰代码块时(注:此代码块要在此类的任何一个方法之外) ,那么这个代码块在代码被装载进虚拟机生成对象的时候可被装载一次,以后再也不执行了。一般静态代码块被用来初始化静态成员。Static 通常用于 Singleton 模式开发:Singleton 是一种设计模式,高于语法,可以保证一个类在整个系统中仅有一个对象。11.30final 可以修饰类、属性、方法。当用 final 修饰类的时候,此类不可被继承,即 final 类没有子类。这样可以用final 保证用户调用时动作的一致性,可以防止子类覆盖情况
17、的发生。当利用 final 修饰一个属性(变量)的时候,此时的属性成为常量。JAVA 利用 final 定义常量(注意在 JAVA 命名规范中常量需要全部字母都大写):Final int AGE=10;常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。Final 可以配合 static 使用。 ?Static final int age=10;在 JAVA 中利用 public static final 的组合方式对常量进行标识(固定格式) 。对于在构造方法中利用 final 进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效。常量(这里的常量指的是实例常量:即
18、成员变量)赋值:在初始化的时候通过显式声明赋值。Final int x=3;在构造的时候赋值。局部变量可以随时赋值。利用 final 定义方法:这样的方法为一个不可覆盖的方法。Public final void print();为了保证方法的一致性(即不被改变) ,可将方法用 final 定义。如果在父类中有 final 定义的方法,那么在子类中继承同一个方法。如果一个方法前有修饰词 private 或 static,则系统会自动在前面加上final。即 private 和 static 方法默认均为 final 方法。注:final 并不涉及继承,继承取决于类的修饰符是否为private、d
19、efault、protected 还是 public。也就是说,是否继承取决于这个方法对于子类是否可见。Abstract(抽象)可以修饰类、方法如果将一个类设置为 abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。Abstract 可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。Abstract 虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。Final 和 abstract 永远不会同时出现。当 abstract 用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。注意
20、比较:private void print();此语句表示方法的空实现。Abstract void print(); 此语句表示方法的抽象,无实现。如果一个类中有一个抽象方法,那么这个类一定为一个抽象类。反之,如果一个类为抽象类,那么其中可能有非抽象的方法。如果让一个非抽象类继承一个含抽象方法的抽象类,则编译时会发生错误。因为当一个非抽象类继承一个抽象方法的时候,本着只有一个类中有一个抽象方法,那么这个类必须为抽象类的原则。这个类必须为抽象类,这与此类为非抽象冲突,所以报错。所以子类的方法必须覆盖父类的抽象方法。方法才能够起作用。只有将理论被熟练运用在实际的程序设计的过程中之后,才能说理论被完
21、全掌握!为了实现多态,那么父类必须有定义。而父类并不实现,留给子类去实现。此时可将父类定义成 abstract 类。如果没有定义抽象的父类,那么编译会出现错误。Abstract 和 static 不能放在一起,否则便会出现错误。 (这是因为 static 不可被覆盖,而 abstract 为了生效必须被覆盖。 )例:(本例已存在CODINGabstractTestClass.java 文件中)public class TestClasspublic static void main(String args)SuperClass sc=new SubClass();Sc.print();Abst
22、ract class SuperClassAbstract void print();class SubClass extends SuperClass()void print()System.out.println(“print”);JAVA 的核心概念:接口(interface )接口与类属于同一层次,实际上,接口是一种特殊的抽象类。如:interface IApublic interface:公开接口与类相似,一个文件只能有一个 public 接口,且与文件名相同。在一个文件中不可同时定义一个 public 接口和一个 public 类。一个接口中,所有方法为公开、抽象方法;所有的属性都
23、是公开、静态、常量。一个类实现一个接口的格式:class IAImple implements IA;一个类实现接口,相当于它继承一个抽象类。类必须实现接口中的方法,否则其为一抽象类。实现中接口和类相同。接口中可不写 public,但在子类中实现接口的过程中 public 不可省。(如果剩去 public 则在编译的时候提示出错:对象无法从接口中实现方法。 )注: 一个类除继承另外一个类,还可以实现接口;class IAImpl extends java.util.Arrylist implement IA继承类 实现接口这样可以实现变相的多继承。 一个类只能继承另外一个类,但是它可以继承多个
24、接口,中间用“, ”隔开。Implements IA,IB所谓实现一个接口,就是指实现接口中的方法。 接口和接口之间可以定义继承关系,并且接口之间允许实现多继承。例:interface IC extends IA,IB;接口也可以用于定义对象IA I=new IAImpl();实现的类从父类和接口继承的都可做运行时类型。IAImple extends A implement IA,IBIB I=new IAImple();I instance of IAImple;I instance of A;I instance of IA;I instance of IB;返回的结果均为 true.接口
25、和多态都为 JAVA 技术的核心。接口往往被我们定义成一类 XX 的东西。接口实际上是定义一个规范、标准。 通过接口可以实现不同层次、不同体系对象的共同属性;通过接口实现 write once as anywhere.以 JAVA 数据库连接为例子:JDBC 制定标准;数据厂商实现标准;用户使用标准。接口通常用来屏蔽底层的差异。接口也因为上述原因被用来保持架构的稳定性。JAVA 中有一个特殊的类: Object。它是 JAVA 体系中所有类的父类(直接父类或者间接父类) 。此类中的方法可以使所的类均继承。以下介绍的三种方法属于 Object:(1) finalize 方法:当一个对象被垃圾回收
26、的时候调用的方法。(2) toString():是利用字符串来表示对象。当我们直接打印定义的对象的时候,隐含的是打印 toString()的返回值。可以通过子类作为一个 toString()来覆盖父类的 toString()。以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖 toString()。(3)equal首先试比较下例:String A=new String(“hello”);String A=new String(“hello”);A=B(此时程序返回为 FALSE)因为此时 AB 中存的是地址,因为创建了新的对象,所以存放的是不同的地址。附加知
27、识:字符串类为 JAVA 中的特殊类,String 中为 final 类,一个字符串的值不可重复。因此在 JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串。如果遇到 String a=”hello”时(注意没有 NEW,不是创建新串) ,系统在字符串池中寻找是否有”hello”,此时字符串池中没有”hello”,那么系统将此字符串存到字符串池中,然后将”hello”在字符串池中的地址返回 a。如果系统再遇到 String b=”hello”,此时系统可以在字符串池中找到 “hello”。则会把地址返回 b,此时a 与 b 为相同。String a=”hello”;System.ou
28、t.println(a=”hello”);系统的返回值为 true。故如果要比较两个字符串是否相同(而不是他们的地址是否相同) 。可以对 a 调用 equal:System.out.println(a.equal(b);equal 用来比较两个对象中字符串的顺序。 a.equal(b)是 a 与 b 的值的比较。注意下面程序:student a=new student(“LUCY”,20);student b=new student(“LUCY”,20);System.out.println(a=b);System.out.println(a.equal(b);此时返回的结果均为 false。
29、以下为定义 equal(加上这个定义,返回 ture 或 false)public boolean equals(Object o)student s=(student)o;if (s.name.equals(this.name)如果 equals()返回的值为以下为实现标准 equals 的流程:public boolean equals(Object o)if (this=o) return trun; /此时两者相同if (o=null) return false;if (! o instanceof strudent) return false; /不同类studeng s=(stud
30、ent)o; /强制转换if (s.name.equals(this.name)else return false;以上过程为实现 equals 的标准过程。练习:建立一个 employee 类,有 String name,int id,double salary.运用 get 和set 方法,使用 toString,使用 equals。封装类:JAVA 为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object 来装载。除了 int 和 char,其余类型首字母大写即成封装类。转换字符的方式:int I=10;String s=I+” ”;String s1=String.v
31、alueOf(i);Int I=10;Interger I_class=new integer(I);看 javadoc 的帮助文档。附加内容:“=”在任何时候都是比较地址,这种比较永远不会被覆盖。程序员自己编写的类和 JDK 类是一种合作关系。 (因为多态的存在,可能存在我们调用 JDK 类的情况,也可能存在 JDK 自动调用我们的类的情况。 )注意:类型转换中 doubleintergerstring 之间的转换最多。12.01内部类:(注:所有使用内部类的地方都可以不用内部类,使用内部类可以使程序更加的简洁,便于命名规范和划分层次结构) 。内部类是指在一个外部类的内部再定义一个类。内部类
32、作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 PROTECTED 和 PRIVATE 修饰。 (而外部类不可以:外部类只能使用 PUBLIC 和 DEFAULT) 。内部类的分类:成员内部类、局部内部类、静态内部类、匿名内部类(图形是要用到,必须掌握) 。 成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列。内部类和外部类的实例变量可以共存。在内部类中访问实例变量:this.属性在内部类访问外部类的实例变量:外部类名.this.属性。成员内部类的优点:内部类作为外部类的成员,可以访问外部类的私有成员或属性。 (即使将外部类声明为 PRIVATE,但是对于处于
33、其内部的内部类还是可见的。 )用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的 private 还要小的访问权限。注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为 outer 的外部类和其内部定义的名为 inner 的内部类。编译完成后出现 outer.class 和 outer$inner.class 两类。(编写一个程序检验:在一个 TestOuter.java 程序中验证内部类在编译完成之后,会出现几个 class.)成员内部类不可以有静态属性。 (为什么?)如果在外部类的外部访问内部类,使用 out.inner.建立内部类对象时应
34、注意:在外部类的内部可以直接使用 inner s=new inner();(因为外部类知道 inner 是哪个类,所以可以生成对象。 )而在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用) ,然后在生成一个内部类对象。Outer.Inner in=Outer.new.Inner()。错误的定义方式:Outer.Inner in=new Outer.Inner()。注意:当 Outer 是一个 private 类时,外部类对于其外部访问是私有的,所以就无法建立外部类对象,进而也无法建立内部类对象。 局部内部类:在方法中定义的内部类称为局部内部类。与局部变量类
35、似,在局部内部类前不加修饰符 public 和 private,其范围为定义它的代码块。注意:局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部变量(但此时要求外部类的局部变量必须为 final)?在类外不可直接生成局部内部类(保证局部内部类对外是不可见的) 。要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。 静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量)静态内部类定义在类中,任何方法外,用 static 定义。静态内部类只能访问外部类的静态成员。生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部
36、类的对象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。静态内部类不可用 private 来进行定义。例子:对于两个类,拥有相同的方法:Peoplerun();Machinerun();此时有一个 robot 类:class Robot extends People implement Machine.此时 run()不可直接实现。注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。 匿名内
37、部类(必须掌握):匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。IA 被定义为接口。IA I=new IA();注:一个匿名内部类一定是在 new 的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因其为局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。匿名内部类在编译的时候由系统自动起名 Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。(下午:)Exception(例外/异常) (教程上的 MODEL7)对于程序可能出现的错误
38、应该做出预案。例外是程序中所有出乎意料的结果。 (关系到系统的健壮性)JAVA 会将所有的错误封装成为一个对象,其根本父类为 Throwable。Throwable 有两个子类:Error 和 Exception。一个 Error 对象表示一个程序错误,指的是底层的、低级的、不可恢复的严重错误。此时程序一定会退出,因为已经失去了运行所必须的物理环境。对于 Error 错误我们无法进行处理,因为我们是通过程序来应对错误,可是程序已经退出了。我们可以处理的 Throwable 对象中只有 Exception 对象(例外/ 异常) 。Exception 有两个子类:Runtime exception
39、(未检查异常)非 Runtime exception(已检查异常)(注意:无论是未检查异常还是已检查异常在编译的时候都不会被发现,在编译的过程中检查的是程序的语法错误,而异常是一个运行时程序出错的概念。 )在 Exception 中,所有的非未检查异常都是已检查异常,没有另外的异常!未检查异常是因为程序员没有进行必要的检查,因为他的疏忽和错误而引起的异常。一定是属于虚拟机内部的异常(比如空指针) 。应对未检查异常就是养成良好的检查习惯。已检查异常是不可避免的,对于已检查异常必须实现定义好应对的方法。已检查异常肯定跨越出了虚拟机的范围。 (比如“未找到文件” )如何处理已检查异常(对于所有的已检
40、查异常都要进行处理):首先了解异常形成的机制:当一个方法中有一条语句出现了异常,它就会 throw(抛出)一个例外对象,然后后面的语句不会执行返回上一级方法,其上一级方法接受到了例外对象之后,有可能对这个异常进行处理,也可能将这个异常转到它的上一级。对于接收到的已检查异常有两种处理方式:throws 和 try 方法。注意:出错的方法有可能是 JDK,也可能是程序员写的程序,无论谁写的,抛出一定用 throw。例:public void print() throws Exception.对于方法 a,如果它定义了 throws Exception。那么当它调用的方法 b 返回异常对象时,方法
41、a 并不处理,而将这个异常对象向上一级返回,如果所有的方法均不进行处理,返回到主方法,程序中止。 (要避免所有的方法都返回的使用方法,因为这样出现一个很小的异常就会令程序中止) 。如果在方法的程序中有一行 throw new Exception(),返回错误,那么其后的程序不执行。因为错误返回后,后面的程序肯定没有机会执行,那么 JAVA 认为以后的程序没有存在的必要。对于 trycatch 格式:try 可能出现错误的代码块 catch(exception e)进行处理的代码 ;对象变量的声明用这种方法,如果代码正确,那么程序不经过 catch 语句直接向下运行;如果代码不正确,则将返回的异
42、常对象和 e 进行匹配,如果匹配成功,则处理其后面的异常处理代码。 (如果用 exception 来声明 e 的话,因为 exception 为所有 exception 对象的父类,所有肯定匹配成功) 。处理完代码后这个例外就完全处理完毕,程序会接着从出现异常的地方向下执行(是从出现异常的地方还是在 catch 后面呢?利用程序进行验证) 。最后程序正常退出。Try 中如果发现错误,即跳出 try 去匹配 catch,那么 try 后面的语句就不会被执行。一个 try 可以跟进多个 catch 语句,用于处理不同情况。当一个 try 只能匹配一个 catch。我们可以写多个 catch 语句,
43、但是不能将父类型的 exception 的位置写在子类型的 excepiton 之前,因为这样父类型肯定先于子类型被匹配,所有子类型就成为废话。JAVA 编译出错。在 try,catch 后还可以再跟一子句 finally。其中的代码语句无论如何都会被执行(因为 finally 子句的这个特性,所以一般将释放资源,关闭连接的语句写在里面) 。如果在程序中书写了检查(抛出)exception 但是没有对这个可能出现的检查结果进行处理,那么程序就会报错。而如果只有处理情况(try)而没有相应的 catch 子句,则编译还是通不过。如何知道在编写的程序中会出现例外呢1调用方法,查看 API 中查看方
44、法中是否有已检查错误。2在编译的过程中看提示信息,然后加上相应的处理。Exception 有一个 message 属性。在使用 catch 的时候可以调用:Catch(IOException e)System.out.println(e.message();Catch(IOException e)e.printStackTrace();上面这条语句回告诉我们出错类型所历经的过程,在调试的中非常有用。开发中的两个道理:如何控制 try 的范围:根据操作的连动性和相关性,如果前面的程序代码块抛出的错误影响了后面程序代码的运行,那么这个我们就说这两个程序代码存在关联,应该放在同一个 try 中。 对
45、已经查出来的例外,有 throw(积极)和 try catch(消极)两种处理方法。对于 try catch 放在能够很好地处理例外的位置(即放在具备对例外进行处理的能力的位置) 。如果没有处理能力就继续上抛。当我们自己定义一个例外类的时候必须使其继承 excepiton 或者RuntimeException。Throw 是一个语句,用来做抛出例外的功能。而 throws 是表示如果下级方法中如果有例外抛出,那么本方法不做处理,继续向上抛出。Throws 后跟的是例外类型。断言是一种调试工具(assert)其后跟的是布尔类型的表达式,如果表达式结果为真不影响程序运行。如果为假系统出现低级错误,
46、在屏幕上出现 assert 信息。Assert 只是用于调试。在产品编译完成后上线 assert 代码就被删除了。方法的覆盖中,如果子类的方法抛出的例外是父类方法抛出的例外的父类型,那么编译就会出错:子类无法覆盖父类。结论:子类方法不可比父类方法抛出更多的例外。子类抛出的例外或者与父类抛出的例外一致,或者是父类抛出例外的子类型。或者子类型不抛出例外。如果父类型无 throws 时,子类型也不允许出现 throws。此时只能使用 try catch。练习:写一个方法:int add(int a,int b)return a+b;当 a+b=100;抛出 100 为异常处理。12.02集合(从本部
47、分开始涉及 API)集合是指一个对象容纳了多个对象,这个集合对象主要用来管理维护一系列相似的对象。数组就是一种对象。 (练习:如何编写一个数组程序,并进行遍历。 )java.util.*定义了一系列的接口和类,告诉我们用什么类 NEW 出一个对象,可以进行超越数组的操作。(注:JAVA1.5 对 JAVA1.4 的最大改进就是增加了对范型的支持)集合框架接口的分类:(分 collection 接口 和 map 接口)Collection 接口 Map 接口List 接口 Set 接口 SortedMap 接口SortedSet 接口JAVA 中所有与集合有关的实现类都是这六个接口的实现类。Co
48、llection 接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构。List 接口代表按照元素一定的相关顺序来组织(在这个序列中顺序是主要的) ,List 接口中数据可重复。Set 接口是数学中集合的概念:其元素无序,且不可重复。 (正好与 List 对应)SortedSet 会按照数字将元素排列,为“可排序集合” 。Map 接口中每一个元素不是一个对象,而是一个键对象和值对象组成的键值对(Key-Value) 。Key-Value 是用一个不可重复的 key 集合对应可重复的 value 集合。 (典型的例子是字典:通过页码的 key 值找字的 value 值)
49、。例子:key1value1;key2value2;key3value3.SortedMap:如果一个 Map 可以根据 key 值排序,则称其为 SortedMap。 (如字典)!注意数组和集合的区别:数组中只能存简单数据类型。Collection 接口和 Map接口只能存对象。以下介绍接口:List 接口:(介绍其下的两个实现类:ArrayList 和 LinkedList)ArrayList 和数组非常类似,其底层 也用数组组织数据, ArrayList 是动态可变数组。 底层:指存储格式。说明 ArrayList 对象都是存在于数组中。注:数组和集合都是从下标 0 开始。ArrayList 有一个 add(Object o)方法用于插入数组。ArrayList 的使用:(完成这个程序)先 import java.util.*;用 ArrayList 在一个数组中添加数据,并遍历。ArrayList 中数组的顺序与添加顺序一致。只有 List 可用 get 和 siz