泛型指针

泛型指针
泛型指针

局部变量在栈里面,全局变量在堆里面。

void*(*start_rtn)(void)怎么理解,返回值是什么类型,求高手指点

这是声明一个函数指针,该函数指针指向一个无参,返回值为void *指针的函数。

泛型指针

通常情况下,C只允许相同类型的指针之间进行转换。例如:一个字符型指针sptr(一个字符串)和一个整型指针iptr,我们不允许把sptr转换为iptr或把iptr转换为sptr。但是,泛型指针能够转换为任何类型的指针,反之亦然。因此,如果有一个泛型指针gptr,就可以把sptr转换为gptr或者把gptr转换为sptr。在C语言中,通常声明一个void指针来表示泛型指针。

很多情况下void指针都是非常有用的。例如:C标准函数库中的memcpy函数,它将一段数据从内存中的一个地方复制到另一个地方。由于memcpy可能用来复制任何类型的数据,因此将它的指针参数设定为void指针是非常合理的。void指针同样也可以用到其他普通的函数中。例如:之前提到过的交换函数swap2,可以把函数参数改为void指针,这样swap2就变成一个可以交换任何类型数据的通用交换函数,代码如下:

1#include

2#include

3int swap2(void *x, void *y, int size)

4{

5 void *tmp;

6

7 if ((tmp = malloc(size)) == NULL)

8 return -1;

9

10 memcpy(tmp, x, size); memcpy(x, y, size); memcpy(y, tmp, size);

11 free(tmp);

12

13 return 0;

14}

void指针在用来实现数据结构时是非常有用的,因为可以通过void指针存储和检索任何类型的数据。我们再来看一下之前提到过的链表结构ListElmt,回想一下,这个结构包含两个成员:data和next。如果data被声明为一个void指针,那么data就可以指向任何类型的数据。从而,我们就可以使用ListElmt结构来建立各种不同数据类型的链表。

浅谈c# 泛型类的应用分析

浅谈c# 泛型类的应用 本篇文章是对c#中泛型类的应用进行了详细的分析介绍,需要的朋友参考下 泛型类 泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。对大多集合类的操作,推荐使用.NET Framework 类库中所提供的类。 (1)泛型类可以继承具体类、封闭式构造、开放式构造基类。 复制代码代码如下: class BaseNode { } class BaseNodeGeneric { } // 继承具体类 class NodeConcrete : BaseNode { } //继承封闭式构造基类 //封闭式构造基类指基类类型参数指定具体类型 class NodeClosed : BaseNodeGeneric { } //继承开放式构造基类 //开放式构造基类指基类类型参数未指定 class NodeOpen : BaseNodeGeneric { } (2)基类类型参数必须在子类中指定实现。 复制代码代码如下: //正确 class Node1 : BaseNodeGeneric { } //错误 //在子类中未指定父类类型参数实现 class Node2 : BaseNodeGeneric {} //错误 //在子类中未指定父类类型参数实现 class Node3 : T {} class BaseNodeMultiple { } //正确 class Node4 : BaseNodeMultiple { } //正确

java简答(无答案版)

1、JDBC编程的主要步骤有那些? 答:选择并加载一个合适的JDBC驱动程序; 创建一个Connection对象,建立与数据库的链接; 创建一个Statement对象,用该Statement对象进行数据库的操作; 从返回的ResultSet中获取相应数据。 2、什么是标准的输入输出流? 答:system.in 标准输入流system.out.标准输出流system.err标准错误输出 3、抽象类的特点和用途? 答:抽象类不能创建对象,只能作为其他类的父类; 抽象类的作用: 1、表示抽象的概念,如动物, 2、建立类之间的关系 3、为实现某一接口的单一功能,抽象类中的抽象方法可以不要全部实现 4、Java的GUI事件处理模型的编程步骤有那些? 5、什么是对象流和序列化? 答:对象流是一种以字节流为基础的可用于持久化保存对象的机制; 序列化是指将java对象转化为字节序列的过程 6、Java语言如何进行异常处理? 7、编写JDBC应用程序通用的步骤有哪几个? 8、什么是Java的GUI事件处理机制? 答:事件响应是GUI程序设计的关键部分,所谓的事件响应就是通过调用与事件关联的方法来处理执行事件。Java事件处理机制把事件源、事件监听器、事件对象三个基本要素联系起来了,包含了对事件进行监听、发生事件、通知监听器以及处理整个事件的流程。 9、类的重用方式有几种?分别如何实现?, 答:继承和组合;java只支持单继承,每个子类都只能有一个直接父类,子类可以继承父类的数据成员和方法,也可以增加新的变量和方法,还可以覆盖继承的方法,通过关键字extends来实现。组合也称为聚合,指java的类中可以包含其他类的对象作为数据成员,是一种包含关系。 10、如何理解Java中包的概念? 11、类的访问控制有哪几种,各有和作用? 答:public: Protected: Private: 包 12、多态机制实线的条件? 答:1、必须是继承关系的类; 2、首先要把子类对象向上转型为父类对象,然后用父类对象调用同名的方法, 系统才能通过动态绑定自动识别调用的方法所属的类; 3、对象的使用者只保持与父类接口通信。 13、终结类和终结方法的特点和用途? 14、反射机制可以用来在程序运行时得到对象的类的那些信息? 答:它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。Reflection机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的

IEnumerable和IEnumerableT接口

IEnumerable和IEnumerable接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和IEnumerable接口是.NET Fra mework中最基本的集合访问器,这两个接口对于LINQ的理解是非常重要的。 在面向对象的开发过程中,常常需要创建若干对象,并进行对象的操作和查询,在创建对象前,首先需要声明一个类为对象提供描述,示例代码如下所示。 using System; using System.Collections.Generic; using System.Linq; //使用LINQ命名控件using System.Text; namespace IEnumeratorSample { class Person //定义一个Person类 { public string Name; //定义Person的名字 public string Age; //定义Person的年龄 public Person(string name, string age) //为Person初始化(构造函数) { Name = name; //配置Name值 Age = age; //配置Age值 } } 上述代码定义了一个Person类并抽象一个Person类的属性,这些属性包括Name和Age。Name 和Age属性分别用于描述Person的名字和年龄,用于数据初始化。初始化之后的数据就需要创建一系列Person对象,通过这些对象的相应属性能够进行对象的访问和遍历,示例代码如下所示。 class Program { static void Main(string[] args) { Person[] per = new Person[2] //创建并初始化2个Person对象{ new Person("guojing","21"), //通过构造函数构造对象 new Person("muqing","21"), //通过构造函数构造对象 }; foreach (Person p in per) //遍历对象 Console.WriteLine("Name is " + https://www.360docs.net/doc/b117137987.html, + " and Age is " + p.Age); Console.ReadKey(); } }

实验十 泛型与集合框架

实验十泛型与集合框架 1.实验目的 1、掌握LinkedList类和Collections类提供的用于排序和查找链表中 的数据的方法 2、掌握用散列映射来存储数据 3、掌握TreeSet类的使用 2.实验内容 1、根据附录里的源代码,按照注释要求,完成代码填空,使程序能够运行 得出结果。 1)实验1 按身高排序 2)实验2 英汉小字典 3)实验3 演出节目单 4)实验4输出args[]中的单词 2、设计编写程序完成以下任务。 1)仿照实验1编写TV类,要求通过实现Comparable接口规定该类的对象的大小关系,按price值得大小确定大小关系,即电视机按其价格确定之间的大小关系。 2)从控制台输入若干个单词(输入回车结束)放入集合中,将这些单词排序后(忽略大小写)打印出来。 知识点:List接口的实现类、String常用方法 3)请使用LinkedList来模拟一个队列(先进先出的特性): (1)拥有放入对象的方法void put(Object o) (2)取出对象的方法Object get() (3)判断队列当中是否为空的方法boolean isEmpty();并且,编写测试代码,验证你的队列是否正确。 知识点:List接口的实现类LinkedList常用方法 4)在一个列表中存储以下元素:apple,grape,banana,pear (1)返回集合中的最大的和最小的元素 (2)将集合进行排序,并将排序后的结果打印在控制台上 知识点:Collections类中的方法 3.实验步骤 略 4.评分标准 1.A——内容功能完善,编程风格好,人机接口界面好; 2.B——内容功能完善,编程风格良好,人机接口界面良好;

看一下Java泛型的设计

从零开始来看一下Java泛型的设计 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除。 作者:ziwenxie来源:ziwenxie|2017-03-03 10:37 收藏 分享 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java 泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除。 泛型基础 泛型类 我们首先定义一个简单的Box类: public class Box {

private String object; public void set(String object) { this.object = object; } public String get() { return object; } } 这是最常见的做法,这样做的一个坏处是Box里面现在只能装入String类型的元素,今后如果我们需要装入Integer 等其他类型的元素,还必须要另外重写一个Box,代码得不到复用,使用泛型可以很好的解决这个问题。 public class Box { // T stands for "Type" private T t; public void set(T t) { this.t = t; } public T get() { return t; } } 这样我们的Box类便可以得到复用,我们可以将T替换成任何我们想要的类型: Box integerBox = new Box(); Box doubleBox = new Box(); Box stringBox = new Box(); 泛型方法 看完了泛型类,接下来我们来了解一下泛型方法。声明一个泛型方法很简单,只要在返回类型前面加上一个类似的形式就行了: public class Util { public static boolean compare(Pair p1, Pair p2) { return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue()); } }

1C#中接口委托装箱拆箱深拷贝浅拷贝

关于接口: 接口是对一组能提供相同服务的类或结构的抽象。 接口是表示一组函数成员而不实现成员的引用类型。 接口是一种抽象的数据类型,不能被实例化。 接口可以被实现,只有类和结构才能实现接口。 类或接口都可以对接口进行继承。 如果基类和接口被继承,基类要写在接口之前。 接口本身可以有任意的访问修饰符号。 接口成员是隐式public,不允许有任何访问修饰符,包括public。 关于委托: 委托类似于C/C++的函数指针。 使用委托的过程分3步:定义、实例化和调用。 委托的定义使用delegate关键字。 委托的实例化使用new关键字,所引用的方法的参数列表和返回类型都要与委托的定义一致。 调用委托与调用方法相似。 Delegate void MDelegate(unit i); MDelegate md=new MDelegate(card1.Deposit); Md(100); md=new MDelegate(card1.withdraw); md(50); 深拷贝和浅拷贝: 浅拷贝:是指将对象中的所有字段逐字复制到一个新对象

对值类型字段只是简单的拷贝一个副本到目标对象,改变目标对象中值类型字段的值不会反应到原始对象中,因为拷贝的是副本。 对引用类型字段则是指拷贝它的一个引用到目标对象。改变目标对象中引用类型字段的值将反应到原始对象中,因为拷贝的是指向堆上的一个地址。 深拷贝:深拷贝与浅拷贝不同的是对于引用字段的处理,深拷贝将会在新对象中创建一个新的对象和原始对象中对应字段相同(内容相同)的字段,也就是书这个引用和原始对象是不同,我们改变新对象中这个字段的时候是不会影响到原始对象中对应字段的内容。 浅复制:须实现ICloneable接口中的Clone方法,且需要需要克隆的对象加上[Serializable]特性。 《装箱拆箱》 今天看JDK5的时候也发现了装箱/拆箱概念,遂作一总结,以备后用。 .net中有一个很重要的概念,装箱与拆箱,之后在jdk5也出现了自动装箱/拆箱的概念。 一、什么是装箱/拆箱。 这要涉及到数据类型,在.net中所有的类型都继承自System.Object,所有的类型都是对象.类型主要分为两种,一是值类型,包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct).另一类是引用类型,包括类、数组、接口、委托、字符串等. 其中值类型是在栈中分配内存,本身的声明就是一个初始化的过程,其不需要进行垃圾回收,只要超出所定义的作用范围会自动释放内存. 而引用类型则是在堆中分配的,和java一样,在堆种分配内存,而其托管堆进行垃圾回收. 当两种数据类型进行转换时就引出了装箱/拆箱. 装箱:值类型到引用类型或到此值类型所实现的任何接口类型的隐式转换 例如:int temp=3; System.Object obj=temp; 其中,temp为值类型,在栈中分配;当分配obj这个引用类型时,我们需要在

java泛型接口,泛型类泛型方法

泛型可提高代码的高扩展性和重用率. 1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。 2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。 3、泛型的类型参数可以有多个。 4、泛型的参数类型可以使用extends语句,例如。习惯上称为“有界类型”。 5、泛型的参数类型还可以是通配符类型。例如Class classType = Class.forName("https://www.360docs.net/doc/b117137987.html,ng.String"); 泛型可以用在接口,类方法,集合上面. 泛型接口: interface testGenerics{ T getT(T t); String assume(T t); } 泛型类:

public class GenericsFoo { private T x; public GenericsFoo(T x) { this.x = x; } public T getX() { return x; } public void setX(T x) { this.x = x; } } 使用来声明一个类型持有者名称,然后就可以把T当作一个类型代表来声明成员、参数和返回值类型。 当然T仅仅是个名字,这个名字可以自行定义。 泛型方法: 是否拥有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法,只需将泛型参数列表置于返回值前。如: public class ExampleA { public void f(T x) {

System.out.println(x.getClass().getName()); } 使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。 限制泛型的可用类型: 在上面的例子中,由于没有限制class GenericsFoo类型持有者T的范围,实际上这里的限定类型相当于Object,这和“Object泛型”实质是一样的。限制比如我们要限制T为集合接口类型。只需要这么做: class GenericsFoo,这样类中的泛型T 只能是Collection接口的实现类,传入非Collection接口编译会出错。 注意:这里的限定使用关键字extends,后面可以是类也可以是接口。但这里的extends已经不是继承的含义了,应该理解为T类型是实现Collection接口的类型,或者T是继承了XX类的类型。 下面继续对上面的例子改进,我只要实现了集合接口的类型: public class CollectionGenFoo { private T x; public CollectionGenFoo(T x) { this.x = x;

6Java第六单元练习题-泛型与集合

6泛型与集合 6.1单项选择题 1.可实现有序对象的操作是?() A.HashMap B.HashSet C.TreeMap D.Stack 2.不是迭代器接口(Iterator)所定义的方法是()。 A.hasNext() B.next() C.remove() D.nextElement() 3.下面说法不正确的是() A.列表(List)、集合(Set)和映射(Map)都是java.util包中的接口。 B.List接口是可以包含重复元素的有序集合。 C.Set接口是不包含重复元素的集合。 D.Map接口将键映射到值,键可以重复,但每个键最多只能映射一个值。 4.下面那些方法不是接口Collection中已声明的方法() A.添加元素的add(Object obj) 方法 B.删除元素的remove(Object obj)方法 C.得到元素个数的length()方法 D.返回迭代器的iterator()方法,迭代器用于元素遍历 5. 下列关于容器的描述中,错误的是() A.容器是由若干个组建和容器组成的 B.容器是对图形界面中界面元素的一种管理 C.容器是一种对指定宽和高的矩形范围 D.容器都是可以独立的窗口 6. 下列界面元素中,不是容器的是() A.List B.JFrame C.JDialog D.Panel 7.应用程序的main方法中有以下语句,则输出的结果是( )。

Hashtable hashtable=new Hashtable(); hashtable.put("100","aaa"); hashtable.put("200","bbb"); hashtable.put("300","ccc"); System.out.println(hashtable.get("300").toString() + hashtable.get("200").toString() + hashtable.get("100").toString()); A) aaa B) bbb C) ccc D) cccbbbaaa 6.2判断题 1.Map接口是自Collection接口继承而来。(×) 2.集合Set是通过键-值对的方式来存储对象的。(×) 3.Integer i = (Integer.valueOf("926")).intValue();(√) 4.String s = (Double.valueOf("3.1415926")).toString(); (√) 5.Integer I = Integer.parseInt("926");(√) 6.Arrays类主要对数组进行操作。(√) 7.在集合中元素类型必须是相同的。(√) 8.集合中可以包含相同的对象。(×) 9.枚举接口定义了具有删除功能的方法。(×) 6.3程序阅读题 1.阅读下面的程序,回答问题。 import java.util.*; public class T { public static void main(String args[]) { Set set = new TreeSet(); set.add(new Integer(10)); set.add(new Integer(5)); set.add(new Integer(15)); set.add(new Integer(5)); set.add(new Integer(10)); System.out.println("size = " + set.size()); Iterator it=set.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } }

C#泛型探究(自学篇)

前言 前几日同学告诉我他老师告诉他,泛型是定义一种通用的方法,至于为什么用泛型他的答 案还是定义一种通用的方法,当时我也没有学,还不懂啦,毕竟人家是计算机专业的科班生,我当 然没有发言权,只是怀疑的记下了这个错误的结论打算以后看看是不是对的,这两天算是把泛型学 了一下,其实它定义的不只是方法,自己感觉他就是一种规范代码执行效率的模版,这样极不容易 出错,并把我们常用的箱拆箱操作过程给省了,提高了编译器的执行效率,。至于为什么用泛型这 个我貌似已经说明白了,泛型多用于集合类操作,我在这里随意的拿出C#定义的ArrayList的 Add方法的定义我们一起看看: public virtual int Add( Object value ) 可以看出我们可以往ArrayList里添加任何类型的元素,假如有一个string类型的str字符 串它在添加到ArrayList lib的过程中实际进行了装箱操作,即object value=str;那么我 们在获取这个值得时候必须这样使用string s=(string)lib[0];不能遗漏(string)否则会提示你, 错误1无法将类型“object”隐式转换为“string”。存在一个显式转换(是否缺少强制转换?) 但是你假如这样写:int a=(int)lib[0];程序在运行前是无法报错的,只要一旦运行就会出 现异常,而这些错误都可以利用泛型轻松搞定,让你在编译时就可以发现错误,具体的就看你怎么 领悟了,我在文章里没有写任何定义的语法格式,因为这个既没必要说,这是常识,出来混这些迟 早是要明白的,呵呵。玩笑啦......欢迎新手同学来我的博客交流学习,我也希望你们可以为我敞 开心怀,因为我既不是计算机专业的学生,甚至上了大学我已经不再是理工类的学生。我无意扎进了 文科专业去叱咤风云啦,哎,这个文科专业名字太有点科学技术的味道了。我喜欢 ........ 我的博客地址是:https://www.360docs.net/doc/b117137987.html,

继承和接口设计习题

第7章继承和接口设计 一.选择题 1.在C#中,一个类【】。 A) 可以继承多个类B) 可以实现多个接口 C) 在一个程序中只能有一个子类D) 只能实现一个接口 2.【】关键字用于在C#中从派生类中访问基类的成员。 A) new B) super C) this D) base 3.在定义类时,若希望类的某个方法能够在派生类中进一步改进,以满足派生类的不同需要,则应将该方法声明为【】。 A) new B) public C) virtual D) override 4.在C#中,在派生类中对基类的虚方法进行重写,要求在派生类的声明中使用【】。 A) new B) public C) virtual D) override 5.已知类B是由类A继承而来,类A中有一个名为M的非虚方法,现在希望在类B中也定义一个名为M的方法,且两方法的参数个数和类型完全相同,若希望编译时不出现警告信息,则在类B中声明该方法时,应使用【】关键字。 A) static B) new C) override D) virtual 6.假设类B继承了类A,下列说法错误的是【】。 A) 类B中的成员可以访问类A中的公有成员 B) 类B中的成员可以访问类A中的保护成员 C) 类B中的成员可以访问类A中的私有成员 D) 类B中的成员可以访问类A中的静态成员 7.关于多态,下列说法正确的是【】。 A) 多态实际上就是重载,它们本质上是以一样的 B) 多态可以分为编译时多态和运行时多态。前者的特点是在编译时就能确定要调用成 员方法的哪个版本,后者则是在程序运行时才能确定要调用成员方法的哪个版本。 C) 编译时多态是在程序运行时才能确定要调用成员方法的哪个版本,而运行时多态在 编译时就能确定要调用成员方法的哪个版本。 D) 多态和重载是两个完全不同的概念,前者是通过定义虚方法和重写虚方法来实现, 后者是通过对同一函数名编写多个不同的实现代码来实现。 8.下列关于接口的说法,正确的是【】。 A) 接口中定义的方法都必须是虚方法 B) 接口中定义的方法可以编写其实现代码 C) 继承接口的类可提供被继承接口中部分成员的实现代码 D) 接口中的所有方法都必须在其派生类中得到实现。 9.下列关于虚方法的描述中,正确的是【】。 A) 虚方法能在程序执行时动态确定要调用的方法,因此比非虚方法更灵活 B) 在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符 C) 在重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符 D) 在重写基类的虚方法时,需要同时带上virtual和override修饰符 10.在C#中,以下关于抽象类的叙述中错误的是【】。 A) 抽象类可以包含抽象方法B) 含有抽象方法的类一定是抽象类

java实验报告 接口、泛型、枚举、内部类与异常

实验报告 课程名称: Java程序设计成绩评定: 实验项目名称:接口、泛型、枚举、内部类与异常指导教师: 学生姓名:学号:专业班级: 实验项目类型:基础实验地点:实验时间: 一、实验目的与要求: 1、理解接口的定义与实现; 2、知道泛型、枚举型与内部类的基本应用; 3、掌握常用异常的抛出与捕获及处理. 二、实验环境:(硬件环境、软件环境) 1.硬件环境:奔ⅣPC。 2.软件环境:Windows XP 操作系统,JDK6.0。 三、实验内容:(原理、操作步骤、程序代码等) 任务: 1、按照要求完成下述接口及实现类的程序 1)定义名称为PCI()的接口,包括启动的方法start和关闭的方法stop; 2)定义名称为NetworkCard 的类表示网卡,实现PCI接口,并且其在实现start 方法时输出“sending data……”,在实现stop方法时输出“network stop.” 3)定义名称为SoundCard 的类表示声卡,实现PCI接口;并且其在实现start 方法时输出“dudu……”,在实现stop方法时输出“sound stop.” 4)定义名称为MainBoard 的类表示主板,包含方法public void usePCICard(PCI p),在方法体内通过p来启动和关闭组件; 5)定义一个包含main方法的Test类,在main方法内创建一个MainBoard 对 象用mb来引用,创建一个NetworkCard对象用nc来引用,创建一个 SoundCard对象用sc来引用,分别通过mb来使用usePCICard(PCI p)启动声 卡和网卡。 2、泛型类程序的调试 调试教材P165的程序8-2,写出程序运行结果,理解泛型类的工作机理及应用。 3、调试运行内部类程序: 在类内部再定义另外一个类,这个另外定义的类就叫内部类。调试教材P171-172程序8-3,写出程序运行结果,理解内部类的定义方法与应用。 4、异常抛出与捕获编程与调试 先调试教材P182、183中的程序9-2和9-3,写出调试结果。然后,自己编写一个能抛出并捕获、处理NullPointerException、NumberFormanException多异常的程序,并调试后写出运行结果。

实验二 泛型异常处理 实验报告

实验二泛型异常处理实验报告 一、实验目的 1. 理解使用泛型、枚举的目的。 2. 掌握异常类、异常类的结构及自定义异常类的编程方法。 二、实验要求 1. 应用泛型编写简单的应用程序; 2. 自定义异常类的编写; 3. 异常类中try, catch, throw, throws 的编写方法。 三、实验内容 1. 阅读以下程序,写出运行结果。同时,把程序改写为使用泛型的程序。对比两个程序并说出泛型的优点。 public class GenericityDemo { public static void main(String[] args) { // 定义类Genericity的一个Integer版本 Genericity intobj = new Genericity(new Integer(88)); intobj.showType(); int i = (Integer) intobj.getobj(); System.out.println("value= " + i); System.out.println("----------------------------------"); // 定义类Genericity的一个String版本 Genericity strobj = new Genericity("Hello Genericity!"); strobj.showType(); String s = (String) strobj.getobj(); System.out.println("value= " + s); } } class Genericity { private Object obj; // 定义通用类型成员 public Genericity(Object obj) { this.obj = obj; } public Object getobj() { return obj;} public void setobj(Object obj) {this.obj = obj;} public void showType() { System.out.println("T实际类型是: " + obj.getClass().getName()); } }

学号姓名--集合框架与泛型实验报告

浙江大学城市学院实验报告 课程名称面向对象程序设计 实验项目名称集合框架与泛型 学生姓名专业班级学号 一. 实验目的和要求 1. 了解Java集合框架的接口和实现类 2. 理解泛型类、泛型接口、泛型方法的特点 3. 掌握List接口及其实现类LinkedList、ArrayList 4. 了解Set接口及其实现类HashSet、TreeSet 5. 了解Map及其实现类HashMap、TreeMap 二. 实验内容 1. 分析Java集合框架的接口和实现类的组成 2. 分析泛型类、泛型接口、泛型方法的特点 3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象) 4. 选作-编程实现:设计学生管理类StudentManager(用Set集合管理学生对象) 5. 选作-编程实现:设计学生管理类StudentManager(用Map管理学生对象) 三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果) 1. 分析Java集合框架的接口和实现类的组成 请查阅书籍和Java帮助文档,说明Java集合框架的接口组成以及它们的继承关系,并针对每个接口给出具体的实现类。 答: 2. 分析泛型类、泛型接口、泛型方法的特点 请查阅书籍和Java帮助文档,举例说明泛型类、泛型接口、泛型方法的特点。 答: 3. 编程实现:设计学生管理类StudentManager(用List集合管理学生对象)。 StudentManager类的功能包括添加学生、查询学生、删除学生、统计学生成绩等。需要设计表示学生对象的Student类,并用LinkedList或ArrayList集合来管理可被数量的学生对象。另外还需要设计测试类Test来验证StudentManager的功能。 4. 编程实现:设计学生管理类StudentManager(用Set集合管理学生对象)。具体功能 要求同第3题,但是需要用Set的实现类(比如HashSet、TreeSet)管理学生对象。

实验报告_实验7 泛型与集合(学生学号_姓名)

实验报告_实验7 泛型与集合(学生学号_姓 名) 一、实验目的 1.理解泛型的概念及泛型的简单使用 2.掌握集合接口及其实现类的概念; Set接口:HashSet、TreeSet、 List接口:ArrayList、LinkedList、Vector Map接口:HashMap、TreeMap、Hashtable 3.掌握集合元素的遍历方法; 4.熟悉Java中的装箱、拆箱操作。 二、实验步骤 3、(基础题)填充VectorTest.java程序所缺代码,编译并运行程序; 程序所缺代码: Vector vec = new _____①___Vector__(); vec. ②add(number); for(int i = 0; i < vec.____③size()_____; i++){ System.out.println(vec.____④_get___(i)); 4、(基础题)阅读并运行下面代码,比较Set接口、List接口、Map接口的异同点,并回答问题,: 问题:如何为程序中的集合指定类型? Set hs = new HashSet<>(); ArrayList al = new ArrayList< String> (); Map hm = new HashMap (); 5、(基础题)下面程序所实现的功能是:Hashtable,LinkedList写入或读取时间的比较: 程序所缺代码: import _____①__java.util.*____;

for(int i = 0; i < 100000; i++) { table. put②(""+i, new Integer(i)); } for(int i = 0; i < 100000; i++){ table. ___get_③_____ (""+i); } for(int i = 0; i < 100000; i++){ list. ___add_④____ (new Integer(i)); } callTime = ____System.currentTimeMillis();___⑤_______ for(int i = 0; i < 100000; i++){ list.____get_⑥______(i); } 问题: 在读取数据时, Hashtable与LinkedList相比,哪个效率更高? Hashtable 6、(基础题)本程序的功能是:获取系统的系统属性值并输出,请参考课件,填充所缺少代码,并运行程序: 程序所缺代码: Properties systemProperties = System. _____①getProperties ______ (); Enumeration enum1 = systemProperties. ②propertyNames(); while(enum1. ____③__ hasMoreElements ___ ()){ String key = (String)enum1.nextElement(); String pro = systemProperties. ____④_ getProperty ___ (key); System.out.println(key + "=" + pro); } } }

理解 C# 泛型接口中的协变与逆变(抗变)

最近在看《C#高级编程(第九版)》这本书,看到了泛型接口这章。其中关于协变和逆变没太理解,讲得有点坑爹,网上查了许多资料,总算(感觉)弄清楚了,来这里记录一下。 先从字面上理解协变(Covariance)、逆变(Contravariance)。 co-是英文中表示“协同”、“合作”的前缀。协变的字面意思就是“与变化的方向相同”。 contra-是英文中表示“相反”的前缀,逆变的字面意思就是是“与变化方向相反”。 那么问题来了,这里的变化方向指的是什么? C# 中对于对象(即对象引用),仅存在一种隐式类型转换,即子类型的对象引用到父类型的对象引用的转换。这里的变化指的就是这种子->父的类型转换。

object o = "hello"; //string (子类)类型的引用转换为 object (父类)类型的引用 协变与逆变虽然从名字上看是两个完全相反的转换,但其实只是“子类型引用到父类型引用”这一过程在函数中使用的两个不同阶段而已,接下来将详细说明这点。 假设有一函数,接收object类型的参数,输出string类型的返回值: string Method(object o) { return"abc";

} 那么在Main函数中我们可以这样调用它: string s = "abc"; object o = Method(s); 注意,这里发生了两次隐式类型转换: 1.在向函数输入时,参数s由string类型转换为object类型 2.在函数输出(返回)时,返回值由string类型转换为object类型 我们这里可以看作是函数签名可发生变换(不论函数的内容,不影响结果): 1.string Method(object o)可变换为string Method(string o)

泛型与集合框架

泛型与集合框架 1.实验目的 1、掌握LinkedList类和Collections类提供的用于排序和查找链表中 的数据的方法 2、掌握用散列映射来存储数据 3、掌握TreeSet类的使用 2.实验内容 1、根据附录里的源代码,完成代码填空,使程序能够运行得出结果。 1)实验1 按身高排序 2)实验2 英汉小字典 3)实验3 演出节目单 4)实验4输出args[]中的单词 2、设计编写程序完成以下任务。 1)仿照实验1编写TV类,要求通过实现Comparable接口规定该类的对象的大小关系,按price值得大小确定大小关系,即电视机按其价格确定之间的大小关系。 2)从控制台输入若干个单词(输入回车结束)放入集合中,将这些单词排序后(忽略大小写)打印出来。 知识点:List接口的实现类、String常用方法 3)请使用LinkedList来模拟一个队列(先进先出的特性): (1)拥有放入对象的方法void put(Object o) (2)取出对象的方法Object get() (3)判断队列当中是否为空的方法boolean isEmpty();并且,编写测试代码,验证你的队列是否正确。 知识点:List接口的实现类LinkedList常用方法 4)在一个列表中存储以下元素:apple,grape,banana,pear (1)返回集合中的最大的和最小的元素 (2)将集合进行排序,并将排序后的结果打印在控制台上 知识点:Collections类中的方法 3.实验步骤 略 4.评分标准 1.A——内容功能完善,编程风格好,人机接口界面好; 2.B——内容功能完善,编程风格良好,人机接口界面良好; 3.C——完成必做内容;

《C++ Primer》4第四部分学习笔记汇总_面向对象编程与泛型编程(15至16章)

《C++ Primer》第四部分学习笔记汇总——面向对象编程与泛型编程 ——继承,动态绑定,数据抽象,函数模板 《C++ Primer》第15章学习笔记 第15章:面向对象编程 ——面向对象编程基于三个基本概念:数据抽象,继承,动态绑定。 ——用类进行数据抽象 ——用类派生从一个类继承另一个类:派生类继承基类成员; ——动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。 @学习摘录162:继承与动态绑定的作用: ——能够容易地定义与其他类相似但又不相同的新类,能够更容易地编写忽略这些相似类型之间区别的程序。 @学习摘录163:多态性 ——面向对象编程的关键思想是多态性(polymorphism) ——继承而相关联的类型为多态类型。 @学习摘录164:继承 ——派生类(derived class)能够继承基类(base class)定义的成员 ——派生类可以无须改变而使用那些与派生类型具体特性不相关的操作 ——派生类可以重定义那些与派生类型相关的成员函数,将函数特化,考虑派生类型的特性。 ——在C++中,基类必须指出希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。 @学习摘录165:动态绑定(dynamic binding) ——我们能够编写程序使用继承层次中任意类型的对象,无须关心对象的具体类型。 @学习摘录166:protected成员 ——可以认为protected访问标号是private和public的混合: ——1. 像private成员一样,protected成员不能被类的用户访问。 ——2. 像public成员一样,protected成员可被该类的派生类访问。 ——派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。 @学习摘录167:派生类类型接口 ——简单地说:提供给派生类型接口是protected 成员和public成员的集合。 @学习摘录168:派生类 ——为了定义派生类,使用类派生列表(class derivation list)指定基类。 ——class classname: access-label base-class ——这里的access-label 是public、protected或private, base-class 是已定义的类的名字。 @学习摘录169:派生类和虚函数

List对象排序通用方法

List对象排序通用方法 在数据库中查出来的列表中,往往需要对不同的字段重新排序,一般的做法都是使用排序的字段,重新到数据库中查询。如果不到数据库查询,直接在第一次查出来的list中排序,无疑会提高系统的性能。 只要把第一次查出来的结果存放在session中,就可以对list重新排序了。一般对list 排序可以使用Collections.sort(list),但如果list中包含是一个对象的话,这种方法还是行不通的。如果有下面这个对象: //UserInfo.java package test; import java.text.SimpleDateFormat; public class UserInfo implements java.io.Serializable{ private https://www.360docs.net/doc/b117137987.html,ng.Integer userId; private https://www.360docs.net/doc/b117137987.html,ng.String username; private java.util.Date birthDate; private https://www.360docs.net/doc/b117137987.html,ng.Integer age; private SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd"); public UserInfo(){ } public UserInfo( https://www.360docs.net/doc/b117137987.html,ng.Integer userId, https://www.360docs.net/doc/b117137987.html,ng.String username, java.util.Date birthDate, https://www.360docs.net/doc/b117137987.html,ng.Integer age ){ https://www.360docs.net/doc/b117137987.html,erId = userId; https://www.360docs.net/doc/b117137987.html,ername = username; this.birthDate = birthDate; this.age = age; } public void setUserId(https://www.360docs.net/doc/b117137987.html,ng.Integer value) { https://www.360docs.net/doc/b117137987.html,erId = value; }

相关文档
最新文档