• 1. Java程序设计语言
  • 2. 昨天重点内容回顾Java语言概述 Java语言基础(数据类型、运算符、语句及控制流) 第一个Java Application和Java Applet 数组等 面向对象概念 方法重载(overloading)与方法覆盖(overridden)
  • 3. 今天内容安排高级类的特性(static、final关键字,抽象类、内部类、接口等) 异常处理技术(声明、抛出、捕获、实例讲解等)。 基于文本的应用程序(字符串、系统属性、集合类、字符串、实例讲解) Java Application及Applet编程(原理、格式、实例讲解)
  • 4. 面向对象及高级类的特性
  • 5. 信息隐藏对类的成员施以一定的访问权限限定,实现类中成员在一定范围内的信息隐藏 同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private ★ default ★ ★ protected ★ ★ ★ public ★ ★ ★ ★
  • 6. 继承性继承性是面向对象程序设计语言的另一基本特征,通过继承可以实现代码的复用。 继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。 Java中不支持多重继承。
  • 7. 代码复用的两种形式Has a class Person { MyDate birthDate; … } Is a Class Student extends Person
  • 8. 创建子类通过在类的声明中加入extends子句来创建一个类的子类: class SubClass extends SuperClass { ……} 如果缺省extends子句,则该类为java.lang.Object的子类。 子类可以继承父类中访问权限设定为public、 protected、 default的成员变量和方法。但是不能继承访问权限为private的成员变量和方法。
  • 9. 成员变量的隐藏和方法的重写class SuperClass{ int x; …… void setX( ){ x = 0; } …… }
  • 10. 成员变量的隐藏和方法的重写class SubClass extends SuperClass{ int x; //hide x in SuperClass …… void setX( ){//override method setX( ) in SuperClass x = 5; } …… }
  • 11. 引用父类成员Java中通过super来实现对父类成员的访问。 1. 用来访问父类被隐藏的成员变量,如: super.variable 2. 用来调用父类中被重写的方法,如: super.Method ( [paramlist] ); 3. 用来调用父类的构造函数,如: super( [paramlist] );
  • 12. Object类Object类 ==运算符和equals方法 实例讲解
  • 13. 多态性多态性是指在程序中需要使用父类对象的地方,都可以用子类对象来代替。 例如: public class Employee extends Object{……} public class Manager extends Employee{……} 则: Employee e = new Manager();//合法语句
  • 14. 覆盖方法的调用对于覆盖的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。 class A{ void callme( ){ System.out.println("Inside A's callme( ) method"); } }
  • 15. 覆盖方法的调用class B extends A{ void callme( ){ System.out.println("Inside B's callme( ) method"); } } public class Dispatch{ public static void main( String args[ ] ){ A a = new B( ); a.callme( ); } }
  • 16. 覆盖方法的调用C:\>java Dispatch Inside B's callme( ) method
  • 17. 方法覆盖时应遵循的原则覆盖后的方法不能比被覆盖的方法有更严格的访问权限 覆盖后的方法不能比被覆盖的方法产生更多的例外 实例讲解
  • 18. 对象状态的确定在Java语言中,提供了操作符instanceof用来判断对象是否属于某个类的实例。 public void method (Employee e) { if ( e instanceof Manager ) { …//do something as a Manager } else if ( e instanceof Contractor ) { …}//do something as a Contractor else { … //do something else } }
  • 19. final关键字final 修饰变量,变量就变成了常量; final 修饰方法,方法就不能再重写; final 修饰类,类就不能再继承。
  • 20. 实例成员和类成员用static关键词修饰的成员,叫类成员(静态成员)。 实例变量和类变量 以static修饰的成员变量,叫类变量;否则,叫实例变量。 实例方法和类方法 以static修饰的成员方法,叫类方法;否则,叫实例方法。
  • 21. static关键字被类的所有实例所共享,因而又称为类变量或类成员函数
  • 22. 类变量类变量的生存期不依赖于对象,相当于C语言中全局变量的作用。 public class Count{ private int serialNumber; private static int counter=0; public Count(){ counter++; serialNumber=conter; } }
  • 23. 类变量的使用 public class StaticVar{ public static int number; } public class OtherClass{ public void method(){ int x = StaticVar.number; } }
  • 24. 类方法的使用 public class GeneralFunction{ public static int addUp(int x,int y){ return x+y; } public class UseGeneral{ public void method(){ int a =9; int b =10; int c = GeneralFunction.addUp(a,b); } }
  • 25. 实例变量的使用 public class Wrong{ int x; public static void main(String args[]){ x=9; //compiler error } }
  • 26. 抽象类(abstract class)用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。 abstract类必须被继承,abstract方法必须被覆盖。 抽象类不能被实例化。 抽象方法只需声明,而不需实现。 abstract returnType abstractMethod( [paramlist] );
  • 27. abstract class A{ abstract void callme( ); void metoo( ){ System.out.println("Inside A's metoo( ) method"); } } class B extends A{ void callme( ){ System.out.println("Inside B's callme( ) method"); } }
  • 28. public class Abstract{ public static void main( String args[ ] ){ A c = new B( ); c.callme( ); c.metoo( ); } } 运行结果为: C:\>java Abstract Inside B's callme( ) method Inside A's metoo( ) method
  • 29. 接口(interface)接口就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
  • 30. 接口的作用通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。 通过接口可以指明多个类需要实现的方法。 通过接口可以了解对象的交互界面,而不需了解对象所对应的类。
  • 31. 接口例子
  • 32. 接口的定义[public] interface interfaceName [extends listOfSuperInterface]{ …… //常量定义和方法定义 }
  • 33. 接口定义interface Collection { int MAX_NUM=100; void add (Object obj); void delete (Object obj); Object find (Object obj); int currentCount ( ); }
  • 34. 接口的实现用implements子句来表示一个类使用某个接口。 在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。 一个类可以实现多个接口,在implements子句中用逗号分隔。
  • 35. class FIFOQueue implements Collection{ void add ( Object obj ){ …… } void delete( Object obj ){ …… } Object find( Object obj ){ …… } int currentCount{ …… } }
  • 36. 一个重要问题Java语言中的变量在使用之前必须进行赋值,否则编译出错 Java语言中的变量(类的成员变量)在没有赋初值的情况下,按下表所给出的数据进行初始化 实例
  • 37. 类变量的初始化
  • 38. 八种基本数据类型及其封装类
  • 39. 内部类JDK1.1加入 允许将一个类的声明放在另一个类的声明中 一个内部类的对象可访问创建它的那个对象的实行情况——包括除私有数据外的数据
  • 40. 内部类1
  • 41. 内部类2
  • 42. 内部类3
  • 43. Exception 异常处理
  • 44. 什么是异常异常就是在程序的运行过程中所发生的异常事件,它中断指令的正常执行。
  • 45. 异常示例import java.io.*; class ExceptionDemo1{ public static void main( String args[ ] ){ FileInputStream fis = new FileInputStream( "text" ); int b; while( (b=fis.read())!=-1 ){ System.out.print( b ); } fis.close( ); } }
  • 46. 异常示例C:\>javac ExceptionDemol.java ExceptionDemo1.java:6: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. FileInputStream fis = new FileInputStream( "text" ); ^ ExceptionDemo1.java:8: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. while( (b=fis.read())!=-1 ){ ^ 2 errors
  • 47. 异常示例class ExceptionDemo2{ public static void main( String args[ ] ){ int a = 0; System.out.println( 5/a ); } }
  • 48. 异常示例C:\>javac ExceptionDemo2.java C:\>java ExceptionDemo2 java.lang.ArithmeticException: / by zero at ExceptionDemo2.main(ExceptionDemo2.java:4)
  • 49. 异常处理机制在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。 生成的异常对象将传递给Java运行时系统,这一例外的产生和提交过程称为抛弃(throw)异常。
  • 50. 异常处理机制当Java运行时系统得到一个例外对象时,它将会寻找处理这一例外的代码。找到能够处理这种类型的例外的方法后,运行时系统把当前例外对象交给这个方法进行处理,这一过程称为捕获(catch)异常。 如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
  • 51. 异常(Throwable)分类Error 动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类异常,也不会抛弃这种异常。 Exception 运行时异常 继承于RuntimeException。Java编译器允许程序不对它们做出处理。 非运行时异常 除了运行时异常之外的其他由Exception继承来的异常类。Java编译器要求程序必须捕获或者声明抛弃这种异常。
  • 52. 异常分类
  • 53. 捕获例外 捕获例外是通过try-catch-finally语句实现的。 try{ ...... }catch( ExceptionName1 e ){ ...... }catch( ExceptionName2 e ){ ...... } ...... }finally{ ...... }
  • 54. try 捕获例外的第一步是用try{…}选定捕获例外的范围,由try所限定的代码块中的语句在执行过程中可能会生成例外对象并抛弃。
  • 55. catch 在catch块中是对例外对象进行处理的代码,每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的例外事件。 在catch块中是对例外对象进行处理的代码,与访问其它对象一样,可以访问一个例外对象的变量或调用它的方法。getMessage( )是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。
  • 56. try{ FileInputStream fis = new FileInputStream( "text" ); int b; while( (b=fis.read())!=-1 ){ System.out.print( b ); } fis.close( ); }catch( FileNotFoundException e ){ System.out.println( e ); System.out.println( "massage: "+e.getMessage() ); e.printStackTrace( System.out ); }catch( IOException e ){ System.out.println( e ); }
  • 57. finally 捕获例外的最后一步是通过finally语句为例外处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。 Call stack 机制
  • 58. 声明抛弃例外如果在一个方法中生成了一个例外,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃例外,使得例外对象可以从调用栈向后传播,直到有合适的方法捕获它为止。
  • 59. 声明抛弃例外声明抛弃例外是在一个方法声明中的throws子句中指明的。例如: public int read () throws IOException{ ...... } throws子句中同时可以指明多个例外,说明该方法将不对这些例外进行处理,而是声明抛弃它们。
  • 60. 抛弃例外抛弃例外首先要生成例外对象,生成例外对象是通过throw语句实现的。 IOException e=new IOException(); throw e ; 可以抛弃的例外必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误: throw new String("want to throw");
  • 61. 自定义例外可以根据程序运行的需要,定义自己的例外类型,一般从Exception派生一个子类。 public class ServerTimedOutException extends Exception { private int port; public ServerTimedOutException( String message, int port) { super( message); this. port = port; } public int getPort() { return port; } }
  • 62. public void connectMe( String serverName) throws ServerTimedOutException { int success; int portToConnect = 80; success = open( serverName, portToConnect); if (success == -1) { throw new ServerTimedOutException(" Could not connect", portToConnect); } }
  • 63. public void findServer() { try { connectMe( defaultServer); } catch (ServerTimedOutException e) { System. out. println(" Server timed out, trying alternative"); try { connectMe( alternativeServer); } catch (ServerTimedOutException e1) { System. out. println(" Error: " + e1. getMessage() + " connecting to port " + e1. getPort()); } } }
  • 64. 方法覆盖时的异常处理派生类中覆盖的方法要求抛出与基类中定义的方法相同的异常 派生类中覆盖的方法可以抛出基类中定义的方法抛出的异常的子类 如果抛出多个类,覆盖的方法必须是基类的方法抛出类的子集
  • 65. 关于异常处理的实例讲解HelloWorld.java 方法覆盖时的异常处理的情况
  • 66. 基于文本的应用程序
  • 67. 命令行参数任何Java Application可以使用命令行参数 输入的参数放在一个数组中 Public static void main(String args[]) 实例TestArgs.java
  • 68. 系统属性java.util.Properties类 System.getProperties()方法 使用-D选项加入新的属性 实例TestProperties讲解
  • 69. Math类java.lang.Math 类中包含的是一些静态成员 截断函数ceil,floor,round max.min,abs sin,cos,tan,asin,acos,atan,toDegrees,toRadians log,exp sqrt, pow, random 常量PI和E
  • 70. 字符串的表示Java语言中,把字符串作为对象来处理,类String和StringBuffer都可以用来表示一个字符串。 字符串常量 字符串常量是用双引号括住的一串字符。 "Hello World!"
  • 71. 用String表示字符串 String(String ); String(StringBuffer ); String( char chars[ ] ); String( char chars[ ], int startIndex, int numChars ); String( byte ascii[ ], int hiByte ); String( byte ascii[ ], int hiByte, int startIndex, int numChars );
  • 72. 用StringBuffer表示字符串StringBuffer( ); StringBuffer( int len ); StringBuffer( String s );
  • 73. 访问字符串类String中提供了length( )、charAt( )、indexOf( )、lastIndexOf( )、getChars( )、getBytes( )、toCharArray( )等方法。 类StringBuffer提供了 length( )、charAt( )、getChars( )、capacity()等方法。
  • 74. 修改字符串String 类String表示不变字符串,因此不能直接对它的内容进行修改,而是通过生成String类对象的一个拷贝,同时完成对字符串的修改。
  • 75. 修改字符串String类提供的方法: concat( ) replace( ) substring( ) toLowerCase( ) toUpperCase( )
  • 76. 修改字符串StringBuffer类提供的方法: append( ) insert( ) setCharAt( )
  • 77. 字符串的比较String中提供的方法: equals( )和equalsIgnoreCase( ) 它们与运算符‘= =’实现的比较是不同的。运算符‘= =’比较两个对象是否引用同一个实例,而equals( )和equalsIgnoreCase( )则比较两个字符串中对应的每个字符值是否相同。
  • 78. 字符串的转化java.lang.Object中提供了方法toString( )把对象转化为字符串。
  • 79. 字符串“+”操作运算符‘+’可用来实现字符串的连接: String s = “He is ”+age+” years old.”; 其他类型的数据与字符串进行“+”运算时,将自动转换成字符串。
  • 80. 实用工具javadoc以及jarjavadoc –d doc/api/public DocExample.java javadoc –private –d doc/api/private DocExample.java
  • 81. Jar的使用用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... 选项: -c 创建新的存档 -x 展开存档中的命名的(或所有的〕文件 -v 生成详细输出到标准输出上 -f 指定存档文件名 jar cvf class.jar A.class B.class jar xvf class.jar
  • 82. Deprecation(不提倡使用)javac –deprecation MyFile.java 实例讲解DateConverter.java