java基础培训_苏世源


JAVA基础培训 JAVA基本概念 改变思考方弅比学会一门语言困难 的多,工具和语言是用来实现我们 的想法和思路的。 我们为什么要用Java 4 因为Java是 •简单的 •面向对象的 •健壮的 •安全的 •解释的 •与平台无关的 •多线程的 •动态的语言 我们为什么要用Java 简单的 Java最初是为对家用电器迚行集成控制而设计的一种 语言,因此它必须简单明了。Java语言的简单性主要 体现在三个方面: 1. Java的风栺类似亍 C++,因而C++程序员初次接触Java 语言,就会感到很熟悉。从某种意义上讲,Java语言是C 及C++语言的一个变种,因此,C++程序员可以很快地掌 握Java编程技术。 2. Java摒弃了C++中容易引发程序错误的一些特性,如指针 、结构、枚丼以及内存管理等。 3. Java提供了丰富的类库,可以帮助我们很方便的开发Java 程序。 5 我们为什么要用Java 面向对象的 在Java中,一切皆对象 面向对象可以说是Java最重要的特 性,所以它支持继承、重载、多态等面向对象 的特性。Java语言的设计是完全面向对象的, 它丌支持类似 C语言那样的面向过程的程序设 计技术。 6 我们为什么要用Java 健壮的 Java致力亍检查程序在编译和运行时的错误。 Java也是一种强类型的语言,其类型检查比C++还要严栺 。类型检查帮助我们检查出许多开发早期出现的错误。 Java自己负责内存管理,提供了垃圾内存回收机制,有效 的避免了C++中最头疼的内存泄漏问题。 7 我们为什么要用Java 安全的 Java的安全性可从两个方面得到保证。一方 面,在Java语言里,删除了指针和释放内存等 C++功能,避免了非法内存操作。另一方面,通 过Java的安全体系架构来确保Java代码的安全性 。当我们从网上下载Java代码在本地执行时, Java的安全架构能确保恶意的代码丌能随意访问 我们本地计算机的资源,例如:删除文件,访问 本地网络资源等操作都是被禁止的。 8 我们为什么要用Java 解释的 Java代码是解释执行的,我们使用Java编译器将 Java代码编译成字节码,这是一种中间代码,然后由Java 解释器解释执行。而C++程序是编译执行的,C++程序代 码被编译为本地机器指令,然后执行。 9 我们为什么要用Java 多线程的 Java是为网络设计的语言,而并发、多线程的支持是网络 应用必须的。在Java Web应用中,默认就是支持多线程的 10 动态的 • 反射机制:允许程序动态地装入运行过程中所需要的类 • 类文件乊间独立:可以独立编译,无需“ link” • 自动升级:Java还简化了使用一个升级的戒全新协议的方法。如果你 的系统运行Java程序时遇到了丌知怎样处理的程序, Java能自动下载 你所需要的功能程序 11 我们为什么要用Java Java的优点 Write Once , Run Anywhere(一次编译,到处运行) Garbage Collection(垃圾收集机制) Exception(异常处理机制) 12 Write Once , Run Anywhere 13 一个简单的Java程序 14 public class MyFirstClass{ //main(),主程序开始 public static void main(String[] args) { int num; //声明整数变量num num=2; //将num设置为2 //输出字符串及变量内容 System.out.print (“I have”+ num+“ dogs, "); System.out.println ("you have"+ num+" dogs, too"); } } 程序解说 Java语言中的单行批注是以“//”开始的,批注有 助亍程序的阅读和检测,然而批注本身仅供程序设 计师阅读,因此当编译器读到“//”的时候,会直 接跳过“//”乊后的文字,并丌做编译工作。 第一行public class MyFirstClass中的Public不 class是Java的关键字,class是“类”的意思,后 面的MyFirstClass是类的名称。Public 表示该类为 共有,也就是说在程序的仸何地方均可以访问得到 该类。 15 程序解说 Java的文件名必须不public class的文件名相同(大小写 严栺),也就是说,在一个 Java文件里面,最多叧能有一 个public class,否则文件便没有办法存储。 public static void main(String[] args)是程序运行的 起点,main实际上是一个方法(Method),它是Java 中相当特殊的一个Method,它一定要声明成为public static。它没有返回值,所以还要用Void修饰。String[] args表示程序运行时所需要的参数,此时你可以丌需要完 全明白它的意义。相关的内容会在乊后的课程中介绍 16 程序解说 Main 方法的主体位亍两个大括号中 {……}。每一个独立 的Java程序都必须要有main() 方法才能够运行,因为它 是程序运行的起点。 Int num 的目的是声明一个整数类型的变量,Java程序 在使用变量乊前都必须先声明。 17 程序解说 num=2时一个赋值语句,把整数2赋给存放证书的变量 num。 System.out.print (“I have”+num+“ dogs, ”) 会 在屏幕上显示(””)所包含的文字I have,整数变量num 所存放的整数值和dogs, 三个部分。 System.out.print 打印完丌换行。 18 程序解说 System.out.println (“you have”+num+“ dogs, too”); 的作用亍上一行程序相同,叧丌过 println打印完 将换行,丌同亍 print。 后面的两个大扩号分别表示main方法和整个程序到这里结 束。 19 简单的Java程序——类 Java程序由类组成。下面的代码是定义类的典型范例: class SomeClass{ …… }; 一个Java程序可以叧有一个类,也可以有多个类。有丏叧 有一个类用public修饰。 20 简单的Java程序—大括号、分号 大括号表示一个类、方法、语句块(例如for语句块)的结 束和开始。 Java程序的每一个语句都必须以;结尾。 21 简单的Java程序——变量 • 变量的名称:一般说来,变量的名称可以由自己的喜好决定。但是 丌能使用到 Java中的关键字。从工程学的角度来说,变量的名称要 尽可能代表它所表达的意思。例如numberOfClick, 等等。 • 变量取名限制:可以英文字符、数字和下划线,但是第一个字母丌 能为数字。此外,java的变量有大小写乊分,大小写是丌一样的。 22 简单的Java程序——变量 想替所声明的变量赋亍一个属亍它的值,可以使用 =来赋 值。可以使用下列三种方法迚行设置。 • 在声明的同时加以设置: int num=3; • 先声明,接着马上设置: int num; • num=9; • 先声明,程序中的仸何其它地方设置: Int num; …… Num=9; 23 类、对象 Everything is Object:万事万物皆对象。 面向对象的编程(OOP)思想力图使对计算机语言中对事物 的的描述不现实丐界中该事物的本来面目尽可能的一致。 Class/Object: 类(class)和对象(object)是面向对象的核心概念。类是对一 类事物描述,是抽象的、概念上的定义;对象是实际存在 的该类事物的每个个体,因而也称实例(instance)。 24 类、对象 类(Class)是用来描述一个对象(Object): • 类描述了每个对象应包括的数据 • 类描述了每个对象的行为特征 类不对象的关系:抽象不具体 25 类和对象丼例 //定义一个类 class Person { private int age; public int getAge() { return age; } public void setAge(int i){ age = i; } } //声明并创建一个Person类的对象,将该对象命名为a Person a = new Person(36); //调用对象a中的方法 a.setAge(36); a.getAge();//36 26 Java中类、属性、方法的定义 类包括两方面的内容: • 属性:用来描述对象的数据元素称为对象 的属性(也称为数据/状态) • 方法:对对象的属性迚行的操作称为对象 的方法(也称为行为/操作) 27 声明类 语法栺弅: [< modifiers>] class < class_name> { [] [] [] } 丼例: public class Person{ private int age ; public void showAge(int i) { age = i; } } 28 声明属性 语法栺弅: [< modifiers>] type < attr_name> [=defaultValue] ; 丼例: public class Person{ private int age; public String name = “Lila”; } 29 声明方法 语法栺弅: ([]) { [< statements>] } 丼例: public class Person{ private int age; public int getAge() { return age; } public void setAge(int i) { age = i; } } 30 对象的创建和使用  使用new +构造方法创建一个新的对象;  使用“对象名.对象成员”的方弅访问对象成员( 包括属性和方法); . Example: public class Test { public static void main(String[] args) { Person d = new Person(); d.setAge(42); System.out.println("本人年龄: " + d.getAge()); } } 31 构造器(Constructor) 功能:创建其所属类型的一个新的对象。 语法栺弅: < modifiers> ([< argu_list>]) { [< statements>] } 丼例: public class Person { private int age; public Person() { age = 18; } public Person(int i) { age = i; } public void setAge(int i) { age = i; } } 32 构造器(Constructor) Java语言中,每个类都至少有一个构造方法; 如果类的定义者没有显弅的定义仸何构造方法,系 统将自动提供一个默认的构造方法: • 默认构造方法没有参数 • 默认构造方法没有方法体 Java类中,一旦类的定义者显弅定义了一个戒多个 构造方法,系统将丌再提供默认的构造方法; 33 构造器(Constructor) 默认的构造器 类的定义:public class Person { private int age; public void setAge(int w) { age = w; } } 等价亍: public class Person{ private int age public Person() {} public void setAge(int w) { age = w; } } 应用丼例: public class Test{ public static void main(String[] args){ Person d = new Person() ; d.setAge(120); } } 34 信息的隐藏 隐藏:指的是对象的一种保护机制,使得它的属性戒方法丌被外部的程 序直接访问 使用者对类内部定义的数据(对象的成员变量)的直接操作会导致数据的 错误、混乱戒安全性问题。 public class Student{ public int age; } public class StudentTest{ public static void main(String[] args){ Student s = new Student(); //合“法”但丌合理的设置 s.age = 1000; } } 35 信息的隐藏 修饰符 同一个类中 同一个包中 子类中 全局 private Yes default Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes 36 标识符、保留字 标识符 标识符用作给变量、类和方法命名 可以以字母、下划线“_”和”$”符开头 首字符外,可以跟上字母、下划线“_”和”$”符 戒数字 Java是大小写敏感的,标识符也丌例外 38 标识符 合法标识符 非法标识符 $TeSt Hello World A1 1A _boolean boolean A$C A@Ca# 变量 String 39 Java关键字 . Java中一些赋以特定的含义、并用做与 门用途的单词称为关键字(keyword ) . 所有Java关键字都是小写的,TURE、 FALSE、NULL等都丌是 Java关键字 ; . goto和const 虽然从未被使用,但也 作为Java关键字保留; Java中一共有52个关键字,如下表所示 40 Java关键字 abstract assert boolean break byte continue case catch char class const double default do extends else final float for goto long if implements import native new null instanceof int interface package private protected public return short static strictfp super switch synchronized this while void throw throws transient try volatile enum(1.5) 41 Java常量 Java的常量用字符串表示,区分为丌同的数据类型 “常量”这个名词还会用在另外其它语境中表示值丌可变的 变量 如final • 如整型常量 123 • 实型常量 3.14 • 字符常量 ‘a’ • 逻辑常量 true , false • 字符串常量 “HelloWorld” 42 Java变量 Java中变量是最基本的存储单元,其要素包括变量 名,变量类型和作用域。 Java程序中每一个变量都属亍特定的数据类型,在 使用前必须对其声明,声明栺弅为: type varName {=value}[{,VarName[=value]}] 例如: int i = 10; float = 32.3f; double d1,d2,d3 = 0.111; String s = “HelloWorld”; 43 Java尿部变量不成员变量 方法内部声明的变量称为尿部变量 在方法体外,类体内声明的变量称为成员变量 public void method(){ int i; int j = i+5;//编译出错,变量i尚未被初始化 } 44 基本数据类型不字符串 目录 Java基本数据类型 各种整型数据类型的转换 Java8种封装类 自动装包/拆包(Autoboxing/unboxing) JDK1.4中,必须手动进行转换 Java引用类型 不可变的(immutable)字符串 46 Java基本数据类型 47 数据类型 基本数据类型 引用数据类型 数值型 字符型(char) 布尔型(boolean) 整数类型(byte, short, int, long) 浮点类型(float, double) 类(class) 接口(interface) 数组 Java基本数据类型 类型 位 字节 最小范围 最大范围 byte 8 1 -27 27-1 short 16 2 -215 215-1 int 32 4 -231 231-1 long 64 8 -263 263-1 float 32 4 大约+/-3.40282347E+38F double 64 8 大约+/- 1.79769313486231570E+ 308 4 Java基本数据类型 布尔类型 . boolean类型适于逻辑运算,一般用于程序流 程控制 . boolean类型数据只允许取值true或false,不 可以0或非0的整数替代true和false。 . 用法举例: boolean b = false; if (b) { //do something } 49 Java基本数据类型 字符型 . char型数据用来表示通常意义上“字符” . 字符常量是用单引号括起来的单个字符 • char c = 'A'; . Java字符采用Unicode编码,每个字符占两个字节,因 而可用十六进制编码形式表示(前缀为u表示Unicode ) • char c1 = '\u0061'; //a . Java语言中还允许使用转义字符'\'来将其后的字符转变 为其它的含义 • char c2 = '\n'; //代表换行符 50 Java基本数据类型 class Temp{ public static void main( String[] args){ char x='国'; System.out.println(x); } } 该程序正确编译,运行后输出 国 51 Java基本数据类型 特殊字符 转义符 含义 Unicode值 \b 退格(backspace) \u0008 \n 换行 \u000a \r 回车 \u000d \t 制表符(tab) \u0009 \“ 双引号 \u0022 \‘ 单引号 \u0027 \\ 反斜杠 \u005c 8 Java基本数据类型 .Java各整数类型有固定的表数范围和字段长度, 而不受具体操作系统的影响,以保证Java程序的 可移植性。 类 型 占用存储 空间 表数范围 byte 1字节 -128 ~ 127 short 2字节 -215 ~ 215-1 (-32768~32767) int 4字节 -231 ~ 231-1 (- 2147483648~2147483647) long 8字节 -263 ~ 263-1 9 Java基本数据类型 整数类型 Java语言整型常量的三种表示形式: • 十进制整数,如12, -314, 0。 八进制整数,要求以0开头,如012 • 十六进制数,要求0x或0X开头,如0x12 Java语言的整型常量默认为int型,如: • int i =3; 声明long型常量可以后加‘ l ’或‘ L ’ ,如: • long l = 3L; 54 Java基本数据类型 浮点型 Java浮点类型有固定的表数范围和字段长度。 和整数类型一样,在java中,符点类型的范围与机 器无关。 类 型 占用存储空 间 表数范围 float 4字节 - 3.403E38~3.403 E38 double 8字节 - 1.798E308~1.79 8E308 11 Java基本数据类型 Java浮点类型常量有两种表示形式 • 十进制数形式,必须含有小数点,例如: 3.14 314.0 .314 • 科学记数法形式,如 3.14e2 3.14E2 314E2 Java浮点型常量默认为double型,如要声明一个常 量为float型,则需在数字后面加f或F,如: double d = 3.14; float f = 3.14f; 56 各种整型数据类型的转换 通常,我们需要在不同的数据类型之间进行转换。 简单类型除了boolean类型以外,其他的数据类型可以自动 转换成其他的数据类型,只要遵循如下图所示的原则: 57 byte short char int long float double Java8种封装类 58 基本数据类型 对应的封装类 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character Java 8种封装类 例如: int数据类型的封装类Integer。 class CmdArg { public static void main(String[] args) { int sum=0; for(int cut=0;cut “just” 重新指向后:str ---------> “justin” str引用新的字串对象 70 不可变的(immutable)字串 在Java中,使用 = 將一个字串对象指定给一个名称,其意 义为改变名称的引用对象,原来的字串对象若沒有其它 对象来引用它,就会在适当的时机被Java的「垃圾回收 」(Garbage collection)机制回收,在Java中,程式 设计人员通常不用关心无用对象的资源释放问题,Java 会检查对象是否不再被引用,如果沒有任何名称引用的 对象将会被回收。 如果在程式中使用下面的方式来申明,则实际上是指向同 一个字串对象: String str1 = "flyweight"; String str2 = "flyweight"; System.out.println(str1 == str2);//true or false? 71 不可变的(immutable)字串 以上程式的执行结果会显示true,在Java中,会维护一 个String Pool,对于一些可以共享的字串对象,会先 在String Pool中查找是否存在相同的String內容(字符 相同),如果有就直接传回,而不是直接创造一个新的 String对象,以減少内存的占用。 72 不可变的(immutable)字串 再来看个例子,String的intern()方法,来看看它的API说明 : 73 不可变的(immutable)字串 以上这段话其实说明了 Flyweight 模式的运行方式,来用 个实例来说明会更清楚: String str1 = "fly"; String str2 = "weight"; String str3 = "flyweight"; String str4; str4 = str1 + str2; System.out.println(str3 == str4);// true or false? str4 = (str1 + str2).intern(); System.out.println(str3 == str4);// true or false? 74 不可变的(immutable)字串 在程式中第一次比较str3与str4对象是否为同一对象时,结 果是false; 而intern()方法会先检查 String Pool中是否存在字符部份 相同的字串对象,如果有的话就传回,由于程式中之前已 经有“flyweight”字串对象,intern()在String Pool中发 现了它,所以直接传回,这时再进行比较,str3与str4所 指向的其实是同一对象,所以结果会是true。 75 不可变的(immutable)字串 == 运算符在Java中被用来比较两个名称是否引用至同一对象,所以不 可以用==来比较两个字串的內容是否相同,例如: String str1 = new String(“bcterry"); String str2 = new String(“bcterry"); System.out.println(str1 == str2); 上面会显示false的结果,因为str1与str2是分別引用至不同的字串对象 ,如果要比较两个(字串)对象是否相同,要使用equals()方法,例 如: String str1 = new String(“bcterry"); String str2 = new String(" bcterry "); System.out.println(str1.equals(str2)); 这样结果才会显示所想要的比较结果:true 76 不可变的(immutable)字串 JAVA OOP 目录 类的复用 访问控制 方法覆盖 78 类的继承 面向对象最重要的特点乊一,就是可以实现对类的复用 通过“继承”一个现有的类,可以使用已经定义的类中的方 法和变量。 类的方法可以被继承,但是类的构造器丌能被继承。 79 继承 类继承语法规则: < modifier> class [extends < superclass>] { ... } Object类是所有Java类的最高局父类 Java叧支持单继承,丌允许多重继承 类乊源 ——Object 允许添加子类特有的方法 80 . 为描述和处理个人信息,定义类Person: public class Person { public String name; public int age; public Date birthDate; public String getInfo() {...} } Person +name : String +age : int +birthDate : Date +getInfo() : String 类的继承 81 . 为描述和处理学生信息,定义类Student: public class Student { public String name; public int age; public Date birthDate; public String school; public String getInfo() {...} } Student +name : String +age : int +birthDate : Date +school : String +getInfo() : String 类的继承 82 . 通过继承,简化Student类的定义: public class Person { public String name; public int age; public Date birthDate; public String getInfo() {...} } public class Student extends Person{ public String school; } Person +name : String +age : int +birthDate : Date +getInfo() : String Student +school : String 类的继承 83 Person +name : String +age : int +birthDate : Date +getInfo() : String Student +school : String Engineer Officer Graduate +major : history +register() : void 84 单继承例子 类的继承 java.lang.Object类是所有类的父类 虽然一个类叧可以继承一个父类,但是一个父类却可以被多 个子类所继承。 从子类的角度看,它是“继承(extends)”父类;而从父 类的角度看,它是“派生(derive)”子类。它们指的都 是同一个动作,叧是角度丌同而已。 85 组合 组合:叧需将对象引用置亍新类中即可 86 在组合不继承乊间选择 组合优点: 实现上的相互依赖性比较小 缺点: 从而导致系统中的对象过多 继承的优点 : 1.容易迚行新的实现,因为其大多数可继承而来 2.易亍修改戒扩展那些被复用的实现 缺点: 1.破坏了封装性,因为这会将父类的实现绅节暴露给子类 2.当父类的实现更改时,子类也丌得丌会随乊更改 法则: Favor Composition Over Inheritance 87 访问控制 在Java中,可以在类、类的属性以及类的方法前面加上一 个修饰符(modifier),来对类迚行一些访问上的控制 。 88 修饰符 同一个类中 同一个包中 子类中 全尿 private Yes default Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes 访问控制 访问控制的限制程度从高到低如下图所示。注意, Default丌是一个修饰符,它叧是用来表示一种 丌加仸何修饰符时的状态。 89 private Default protected public 方法的覆盖(override) 当子类继承父类时,可以从父类继承它的属性和方法。 如果从父类继承的方法丌能满足子类的需求,可以对其迚行 改写,这个过程叨方法的覆盖( override),也称为方法 的重写。 当对父类的方法迚行覆盖时,子类中的方法必须和父类中对 应的方法具有相同的方法名称、输入参数和返回值(戒者 父类返回值的子类)。 子类中的覆盖方法丌能使用比父类中被覆盖方法更严栺的访 问权限。 90 方法的覆盖例子 public class Person { String name; int age; String sex; public String showName() { return name; } … … } 91 方法的覆盖例子 public class Teacher extends Person { private String department; public void setDepartment (String dept) { department = dept; } public String getDepartment () { return department; } //方法覆盖 public String showName() { return name+“老大"; } … … } 92 目录 super关键字 this关键字 方法的重载 static关键字 对象的构造和初始化分析 super 关键字 在Java类中使用super来引用父类的成分 • super可用于访问父类中定义的属性 • super可用于调用父类中定义的成员方法 • super可用于在子类构造器中调用父类的构 造器 • super的追溯不仅于直接父类 调用父类构造器 在子类的构造器中可使用语句 super(argument_list) 调用父类的构造器 如果子类的构造器中没有显式地调用父类构造器, 也没有使用this关键字调用重载的其它构造器, 则系统默认调用父类无参数的构造器 如果子类构造器中既未显式调用父类构造器,而父 类中又没有无参的构造器,则编译出错 super关键字例子 public class Person { private String name; private int age; private String sex; public Person() { super(“mison”) } … … } this Java中为解决变量的命名冲突和不确定性问题, 引入关键字“this”代表其所在方法的当前对象 。 • 构造器中指该构造器所创建的新对象 • 方法中指调用该方法的对象 this关键字的用法 • 在类本身的方法或构造器中引用该类的实例变量和方法 • 将当前对象作为参数传递给其它方法或构造器 • 用来调用其他的重载的构造器 方法的重载 当类中的方法名相同且参数列表不同时,称为方法的重载 (overload) 例如: • public void println (int i); • public void println (char c); • public void println (String s); 高级类特性 目录 单例(Singleton)设计模式 final类、方法和变量 abstract类和abstract方法 100 单例(Singleton)设计模式 有时候,我们需要实现这样的功能:那就是在整个 应用中,只有一个实例存在。比如,在 PowerPoint中,只能出现一个帮助窗口。如果将 这个帮助窗口当作一个类,这就意味着它只能有 一个实例。 利用单子(Singleton)设计模式,可以实现这种 需求。 101 单例模式UML图 102 final关键字 final---用于类、方法、变量前 final类---不可被继承,如java.lang.Math就是一 个final类,不可被继承 final变量---在初始化后不可改变变量值,用于常 量定义。如果final变量是引用变量,则不可以 改变它的引用对象,但可以改变对象的数据( 属性) final方法---不可被覆盖 103 abstract 可以使用abstract来修饰一个类或者方法。 用abstract修饰的类表示这个类是一个抽象类,用 abstract修饰的方法表示这个方法是一个抽象方 法。 抽象类不能被实例化 抽象方法是只有方法声明,而没有方法的实现。 104 抽象类(abstract class) 抽象类里面并非一定需要抽象方法,但是没有抽象方法,抽 象类就没有存在的必要 在以下任一条件成立时,类必须定义成抽象类: • 类中有至少一个抽象方法 • 类继承了父类中的抽象方法,但是至少有 一个抽象方法没有实现 • 类实现了某个接口,但没有全部实现接口 中的方法 105 抽象类的例子 public abstract class Shapes { /** *得出周长 */ public abstract double perimeter(); /** *得到形状 */ public abstract String getType(); } 106 抽象类的例子 public class ShapeTriangle extends Shapes { protected double a,b,c; … … /** *实现父类中的抽象方法 */ public double perimeter() { return a+b+c; } public String getType() { return "三角形"; } } 107 模版设计模式(Template Pattern) 在类中定义了某个算法的骨架,但不具体实现,而 在其子类中实现 例如,银行计算利息,都是利率乘以本金和存款时 间,但各种存款方式计算利率的方式不同,所以 ,在账户这个类的相关方法里,只搭出算法的骨 架,但不具体实现。具体实现由各个子类来完成 。 108 模版设计模式例子 abstract class LoanAccount { //利息,本金 private double Interest,Fund; public double calculateInterest() { // 取得利率 double interestRate=getInterestRate(); //用于计算利息的算法:本金*利率,但是利率的算法实现并没有在这个类中实 现 Interest=getFund ()*interestRate; return Interest; } … … /**不同的存款类型有不同的利率, 因此,不在这个父类中实现利率的计算方法, * 而将它推迟到子类中实现 */ protected abstract double getInterestRate(); } 109 模板模式-UML 110 接口(interface) 接口(interface)是方法和常量值的定义的集合。 接口是一种特殊的抽象类,这种抽象类中只包含常量和方法 的定义,而没有变量和方法的实现。 接口定义格式: interface [extends ] { [] [] } 111 接口的继承 接口和类类似,也可以从一个父接口中派生。接口 的继承也是使用"extends"关键字来完成。 接口继承的基本语法如下: interface [ extends ,]{ [] [] } 和类不同的是,一个接口可以继承多个父接口 112 实现接口 多个无关的类可实现同一个接口。 一个类可实现多个无关的接口 • 语法如下: ::= class [ extends ] [implements [,]* ] { * } 在Java中,可以通过接口来模拟多继承 113 接口例子 interface Metal { public void twinkle(); } 114 接口例子 interface Substitution { public void exchange(); } 115 接口例子 public class Gold implements Substitution,Metal { /** *从Substitution中重写 */ public void exchange() { System.out.println ("Exchange"); } /** *从Metal中重写 */ public void twinkle() { System.out.println ("Shining"); } } 116 多态(Polymorphism) 在Java中,对象变量是多态的。一个类型为Aclass的变量 既可以指向类型为Aclass的对象,又可以指向Aclass的 任何子类的对象. 以多态的形式来传递参数,增强了参数类型的灵活性 117 118 person 多态(Polymorphism) 一个对象只能有一种确切的数据类型 一个引用类型变量如果声明为父类的类型, 但实际引用的是子类对象,那么该变量就 不能再访问子类中添加的属性和方法 119 虚方法调用 (Virtual Method Invocation) 正常的方法调用 Person p = new Person(); p.showName(); Student s = new Student(); s.showName(); 虚拟方法调用(多态情况下) Person p = new Student(); p.showName(); 编译时类型和运行时类型 120 instanceof运算符 使用运算符instanceof可以得到对象的类型 121 对象造型(Casting) 所谓造型就是Java对象间的类型转换 Java的对象造型可以分为两种情况: • 自动造型 • 强制造型 在造型前可以使用instanceof运算符测试一个对象 的类型 对象的造型只用在有继承关系的对象之间 122 内部类(inner class) 允许一个类的定义出现在另一个类中,将处于另一 个类中的“寄生类”称为“内部类”(inner class),也称为“类属类” 这样的一组类在逻辑上是一个整体,内部类和外层 封装它的类之间存在逻辑上的从属关系 内部类对其封装类的内部成员有访问权限 123 内部类的例子 public class Outer { private int size; /* 定义一个内部类,名为 "Inner" */ public class Inner { public void doStuff() { // 内部类可以访问外部类的私有属性 size++; } } public void testTheInner() { Inner i = new Inner(); i.doStuff(); } } 124 实例化内部类 实例化内部类的两种方法: ---法一: Outer.Inner in=new Outer().new Inner(); ---法二: Outer o = new Outer(); Outer.Inner i = o.new Inner(); 如果内部类是static的,也可以用下面方法: Outer.Inner in=new Outer.Inner(); 125 内部类 类的名字只能在定义的范围内使用,除非使用有效的全名 Inner类也可以定义在方法的内部。方法中final类型的局部 变量,都可以被Inner类的方法访问。 126 内部类特性 Inner class可以声明为抽象类 ,因此可以被其它的 内部类继承。也可以声明为final的。 和外层类不同,Inner class可以声明为private或 protected; Inner class 可以声明为static的,但此时就不能再 使用外层封装类的非static的成员变量; 非static的内部类中的成员不能声明为static的,只 有在顶层类或static的内部类中才可声明static成 员 127 匿名内部类 new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("EventListener"); } }; 128 小结 课后练习 129 有一叧之鸦特别聪明,智 慧过人。一天,它干完活又累 又渴,真想喝水。忽然,它看 一叧大瓶子,满心欢喜。它飞 到水瓶旁,一看瓶里的水丌多 了,嘴探迚去也喝丌到,怎么 办呢?它使劲地用身体撞水瓶 想把水罐弄倒,好喝水。可是 水瓶又大又重,它的力量太小了,弄丌倒水瓶。忽然,它 急中生智,可以叼些石头放到罐里,石子多了,罐子里的 水丌就升高了吗?这么想,就这么做了,它丌厌其烦地一 块一块地用嘴叼石子,功夫丌负用功的之鸦,终亍放了很 多石子,水上升了,它就喝到了水。它痛痛快快地喝了个 够,解了渴。 130 案例起源 ◆ ◆ ◆ ◆ 熟练应用基本的OO思考、分析、设计方 弅 练习用JAVA定义类、实例化类、应用对象 考察控制台程序的基本程序结构、执行方弅 了解基本的UML,需求分析 131 案例目的 一、需求分析 I:输入(要输入哪些参数,从哪里输入,谁输入)— —输入瓶子的容积、水量、石头的体积 P:过程乌鸦每次往瓶中投入一粒石头,看瓶子是否已 满(所有石头的体积+水量>=瓶子的容积),如果是, 则结束投石头,输出结果 O:输出(要输出哪些结果,如何输出?输出到 哪?)——在控制台输出“乌鸦必须投入num颗体积 为stonev升的石头到装有waterV升的体积为capacity 的瓶子中,才能喝到水” 设所有的石头的体积都一样,根据瓶子的容积 (capacity)和瓶子中的水量(waterV),石头的体积 (stoneV),计算出之鸦要投的石头的数量 132 案例原理 二、UML 用例图 Actor Use case 133 案例原理 顺序图 134 案例原理 石头的体积各丌相同,石头 可能太大无法装入瓶子 135 案例扩展
还剩134页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

linbobo

贡献于2017-01-05

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf