$9 泛型基础.

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
第6章 对象和类.
单元二:面向对象程序设计 任务二:借书卡程序设计.
第四章 类、对象和接口.
第三讲 面向对象(上).
四資二甲 第三週作業 物件導向程式設計.
班級:行流四甲 組員:497D0004何筱瑩 497D0016鄧宜欣 497D0044呂亭儀 497D0056黃 琪 497D0063賴依淩
面向对象的程序设计(一).
第一章 面向对象程序设计.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
网络信息资源的开发与设计 主讲教师 罗双兰 广西师范大学教育科学学院.
類別與物件 Class & Object.
第14章 c++中的代码重用.
第八章 类和对象.
JAVA程序设计 (03) JAVA Programming
第三章 控制结构.
程設一.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
C#程序设计 c# programming 泛型 C#程序设计课程组.
常用工具类.
第8章 列舉器與集合 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
DEV 331 深度探索 Microsoft Visual C# 2.0
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
Ch13 集合與泛型 物件導向程式設計(2).
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
Java程序设计 第9章 继承和多态.
C#面向对象程序设计 $7 继承和多态性.
SPOTO TM JAVA课程 JAVA中的OO语法
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
并发机制 结果应该为: 线程 1: 1 线程 1: 2 线程 1: 3 线程 1: 4 线程 1: 5 线程 2: 6 线程 2: 7
泛型委托 泛型接口、方法和委托.
C/C++/Java 哪些值不是头等程序对象
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
$10 可空类型.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
第三章 C# 基础知识.
简单工厂模式.
二叉树的遍历.
自我參考結構 (self-reference – 1)
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第二章 Java基本语法 讲师:复凡.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++复习2----类与对象.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第三章 数据抽象.
第二章 Java基本语法 讲师:复凡.
資料結構簡介 綠園.
C++程序设计 吉林大学计算机科学与技术(软件)学院.
Review 1~3.
龍老師我不會Debug QQ.
第二章 Java基本语法 讲师:复凡.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
Java程序设计 第17章 异常和断言.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
辅导课程十二.
JAVA 程式設計與資料結構 第三章 物件的設計.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++程序语言设计 Chapter 14: Templates.
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

$9 泛型基础

主要内容 为何使用泛型 创建泛型类 泛型和继承

为何使用泛型 public class IntStack { int[] items = new int[100]; int current = 0; public void Push(int x) { items[current++] = x; } public int Pop() { return items[--current]; } } public static void Main() { IntStack st = new IntStack(); for(int i=1; i<=10; i++) st.Push(i); int x = st.Pop(); }

为何使用泛型 public class StringStack { string[] items = new string[100]; int current = 0; public void Push(string x) { items[current++] = x; } public string Pop() { return items[--current]; } } public static void Main() { StringStack st = new StringStack(); for(int i=1; i<=10; i++) st.Push(new string(‘a’,i)); string y = st.Pop(); }

为何使用泛型 public class DoubleStack { //…… } public class DateTimeStack public class Student {//...}; public class StudentStack

为何使用泛型 public class ObjStack { object[] items = new object[100]; int current = 0; public void Push(object x) { items[current++] = x; } public object Pop() { return items[--current]; } }

为何使用泛型 性能损失 装箱 拆箱 ObjStack int int Object Object public static void Main() { ObjStack st = new ObjStack(); for(int i=1; i<=10; i++) st.Push(i); int x = (int)st.Pop(); } int int 装箱 拆箱 Object Object ObjStack 性能损失

为何使用泛型 × 通过编译,但运行时出错! 拆箱 ObjStack int int string Object Object Object public static void Main() { ObjStack st = new ObjStack(); for(int i=1; i<=10; i++) st.Push(i); int x = (int)st.Pop(); string y = (string)st.Pop(); } int int string × 拆箱 Object Object Object ObjStack 通过编译,但运行时出错!

为何使用泛型 public class Stack<T> { T[] items = new T[100]; int current = 0; public void Push(T x) { items[current++] = x; } public T Pop() { return items[--current]; } }

为何使用泛型 × 在编译时检查出错误 ObjStack int int string public static void Main() { Stack<int> st = new Stack<int>(); for(int i=1; i<=10; i++) st.Push(i); int x = (int)st.Pop(); string y = (string)st.Pop(); } × int int string ObjStack 在编译时检查出错误

为何使用泛型 泛型的优越性 更高层次上的抽象性 对算法和数据结构更强的表达能力 更为方便的复用:参数替换 类型安全性:无需装箱/拆箱 不损害程序性能而实现更高的灵活性

创建泛型类

创建泛型类 泛型类(Generic class) 声明:modifier class ClassName <T1, T2, T3 …> public class Stack<T>

创建泛型类 泛型类(Generic class) 声明:modifier class ClassName <T1, T2, T3 …> 创建:abstract type  concrete type public class Stack<T> Stack<int> st = new Stack<int>();

创建泛型类 泛型类(Generic class) 使用具体类型 使用类型参数 字段类型 方法参数类型 方法返回类型 public class Stack<T> { T[] items = new T[100]; int current = 0; public void Push(T x) { items[current++] = x; } public T Pop() { return items[--current]; } }

创建泛型类 泛型类(Generic class) 使用类型参数(续) 方法中局部变量类型 构造函数定义中不出现类型参数! public class Stack<T> { public T Peek() { T t = items[current]; return t; } public Stack() {} public Stack(int size) { items = new T[size]; } }

创建泛型类 类型限制 主要限制 public class Stack<T> where T: struct public class Queue<T> where T: class public class Dictionary<K,D> where K: struct where D: class

创建泛型类 类型限制 主要限制 次要限制 接口限制 public class PriQueue<T> where T: IComparable { public void Push(T x) for(int i=0; i<items.length; i++) if(x.CompareTo(items[i]) >= 0) //... }

创建泛型类 × 类型限制 主要限制 次要限制 接口限制 基类限制 public class Student {} public class Undergraduate: Student {} public class Graduate: Student public class PriQueue<T> where T: Student PriQueue<Student> q1 = new PriQueue<Student>(); PriQueue<Graduate> q2 = new PriQueue<Graduate>(); PriQueue<string> q3 = PriQueue<string>(); ×

创建泛型类 类型限制 主要限制 次要限制 接口限制 基类限制 构造函数限制 public class Student { public Student() {} } public class Queue<T> where T: Student, new() { T[] items; public Queue(int size) items = new T[size]; for(int i=0; i<size; i++) items[i] = new T(); }