java学习总结.doc_第1页
java学习总结.doc_第2页
java学习总结.doc_第3页
java学习总结.doc_第4页
java学习总结.doc_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. 对象创建:user p=new user();其中p是对象的引用或叫伪内存地址。2. 接口是一种只由抽象方法(关键字abstract)和常量组成的类;接口中的方法不允许声明为静态方法。3. Java是解释型的语言,c+是编译型的语言,因为编译后就可以被操作系统运行。JDK为开发环境,JRE为运行环境(用户)。4. Final关键字的作用与c+中的const的作用相同。5. Java嵌套类:静态嵌套类是封装类的成员,静态嵌套类可以直接访问封装类的非静态成员或封装类对象作为载体来访问。非静态的嵌套类接内部类,内部类可以访问封装类的所有成员。6. String类型的数据创建后不可修改,stringbuffer类型的数据则可修改。一个给定的字符序列组成的字符创在内存中(字符串常量池)只存储一次。比如:s1=”hello”,s2=”hello”,仅有两个引用而已。通过string s=new string(“abc”)创建了两个对象,但必须是第一行。一个是池里的对象,另一个事堆里的对象。s.Intern=erns.equals(t)指对象内容相同。7. 静态代码块,父类子类构造方法执行顺序依次为:父类静态代码块,子类静态代码块,父类构造方法,子类构造方法。不管几级继承,定义最下层子类时总是从上到下顺序执行函数调运,静态优先执行,父类优先执行。注意:静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次。8. 当final修饰的成员变量时引用类型时,表示该引用的值不能改变,也就是说该引用只能指向赋值时的那个对象,不能再指向别的对象了,但是引用指向对象的内容是可以改变的。9. 一个类不能既是abstract又是final的,因为abstract只能通过子类实例化,而final表示终态的类,不能再有子类。10. 方法调用的参数传递问题 :所有方法都是pass by value,引用也是传值(地址)。11. Java中的8个原生数据类型 byte short int long char float double boolean,除外都是对象包括字符串和数组。12. 在调用类中的方法时,在方法体执行之前,首先要对类中的成员变量进行赋值,如果代码中没有赋具体的值,也有默认值。成员变量的赋值顺序按照前后顺序进行。13. 如果有既有直接赋值,也有构造方法赋值,那么根据先后顺序执行14. 重写(Override) 重载(Overload):重载是方法名字,返回类型一致,唯一不同的是方法的参数不同(参数类型不同,或者参数类型个数不同);重写:1. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致;2. 子类抛出的异常不能超过父类相应的方法抛出的异常;3. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)15. 多态:所谓多态就是父类或者接口类型的引用可以指向子类或者实现该接口的类的实例(对象),父类的引用指向了子类的对象,调用时执行的方法也是子类的方法,父类的方法并不会被执行。16. Java反射机制:不管某个类有多少对象,但所有的对象只有一个class对象,可通过以下方法获得某个类所对应的class对象:1通过类的.class语法2通过类的getclass方法3通过class类的静态方法forname ()。17. 通过反射调用某个对象的方法的步骤:1得到该对象所对应的class对象2通过该class对象得到该类的构造方法所对应的constructor对象。18. 在总结中描述:final类型成员变量只有2种初始化方式,是不全面的;在初始化块中也是可以进行初始化的;另外final类型的局部变量,可以只定义不赋值,当然也就别使用了;19. static和final是Java中最常用的关键字:static通常用来修饰类的成员变量和类的方法,它可以用在以下场合:1.修饰类的成员变量:意味着这个成员变量作为整个类而不是类的某个特定对象而存在,可以通过类名直接引用它们。一个static成员变量对每个类来说都只有一份存储空间,而非static成员变量则是对每个对象有一份存储空间。2.修饰方法:static方法可以通过类名直接访问。 3.静态导入:静态导入static成员变量和static方法。4.静态程序块:通常用来做一些初始化,static。5.修饰成员类型:如修饰嵌套类(nested class),嵌套类和普通的内部类的区别就在于static的修饰。普通的内部类不能包含static数据和static属性,也不能包含嵌套类,但是嵌套类可以包含所有东西。注意static不能用来修饰最顶层的类。20. 下面的代码显示了static的可用之处和不可用之处:21. /导入静态成员,不常用22. import static java.util.Calendar.AM;23. import java.util.HashMap;24. public class StaticTest 25. /静态成员变量,它只存有一份26. private static int i = 123;27. private int j = 0;28. private static HashMap map = new HashMap();29. 30. /静态程序块,用来做一些初始化动作31. static 32. map.put(userid, admin);33. 34. public void printI() 35. System.out.println(i= + i);36. 37. /静态方法,38. public static void s() 39. int m = 0;/可以定义非静态变量40. staticint n = 0;/错误代码,不能定义静态变量41. System.out.println(i);/可以使用静态的成员变量42. System.out.println(j);/错误代码,不能使用非静态的成员变量43. 44. public static void main(String args) 45. /直接通过类引用静态成员变量和方法46. StaticTest.s();47. StaticTest.i+;48. /test1和test2打印出来的i值一样,因为它只有一份49. StaticTest test1 = new StaticTest();50. StaticTest test2 = new StaticTest();51. test1.printI();/i=12452. test2.printI();/i=12453. 54. 55.56. 下面的代码显示了static修饰嵌套类:57. public class StaticTest2 58. /普通内部类59. class InnerClass 60. static int i = 0;/错误代码,普通内部类不能使用静态成员变量61. static final int j = 0;/正确代码,常量62. 63. /嵌套类,与普通内部类的区别在于多了static的修饰64. static class NestedClass 65. static int i = 0;/正确代码66. 67. 68. final关键字通常表示一个东西是不能改变的,它可以修饰的元素有:1.修饰数据:通常用来定义常量。对于基本类型,final使数值恒定不变,而对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法把它改为指向另一个对象,然而,对象其本身是可以被修改的。 2.修饰参数:和修饰数据一样。 3.修饰方法:通常用来防止方法被子类覆盖(overriden),一个类中的所有private方法都隐含是final的,因为它无法被子类读取,也就不会被覆盖。另外,编译器针对final方法的调用都采用内嵌(inline)调用,可提高效率,但不是final的主要用途。4.修饰类:表明该类(class)不能被继承。在final类里,所有的方法都被隐含的指定为final的,因为永远不存在子类,也就不存在子类覆盖一说。final类的字段可以根据个人的意愿选择是或不是final,不论类是否定义为final,相同的规则都适用于final字段。平日在编程中用的最多的应该是使用final修饰数据,尤其是定义常量。69. 下面的代码显示了final对各种元素的修饰:70. /修饰类,类不能被继承71. public final class FinalTest 72. /修饰数据,i不能被再次赋值73. private final int i = 0; 74. /修饰方法,该方法不能被子类覆盖75. public final void f(String s) 76. System.out.println(FinalTest.f);77. 78. /修饰参数,j不能被重新赋值79. public void g(final int j) 80. j = 1;/这条语句是错误的81. 82. 83. 下面的代码显示了父类不能覆盖子类的final方法:84. public class FinalChild extends Final 85. /这个方法是错误的,它不能覆盖父类的final方法86. public void f();87. /这个方法正确,重载88. public void f(String s)89. 90. class Final 91. public final void f() 92. 93. 对于对象引用的修饰容易让人迷惑,看下面的程序:94. final int i = 0;95. i = 1;/错误的代码,不能重新赋值96. final StringBuffer s = new StringBuffer(Java);97. s.append(World!);/正确代码,可以改变对象内容98. s = new StringBuffer(Hello);/错误的代码,不能给引用重新赋值,它不能指向别的对象 ,地址不能变。注意代码注释,对整型i的修饰很好理解,给了i初值后,不能再给它其它值。而对于对象引用s,虽然用了final修饰并赋了初值,但依然可以使用s来操纵对象,只不过,不能再将s指向其它对象。99. 不要以为在定义final数据成员时必须指定初值,也不要以为它只能给一个常数值,它还可以是一个表达式,如下面的代码是成立的:final int j;j = 2 * 3;像上面这种未指定初值的声明final数据成员通常称为空白final。对于类的成员变量,有无final修饰存在一点区别,对于没有final修饰的成员变量,它们都有一个默认的初值(如整型数据为0),而对于final修饰的成员变量,必须确保它被初始化。看下面的程序:100. public class TestFinal 101. private int i;/默认值为0。如果是private final int i;程序就会报错102. public void print() 103. System.out.println(i);104. 105. 如果使用final修饰i,程序就会出错,因为它未被初始化。如果想用final修饰的同时又不想在声明时初始化,则可以在构造函数中赋值。如下面的程序是正确的:106. public class TestFinal 107. private final int i;108. public TestFinal () 109. i = 0;110. 111. public void print() 112. System.out.println(i);113. 114. 一个既是static又是final的字段只占据一段不能改变的存储空间。 带有恒定初始值(即,编译时常量)的static final基本类型全用大写字母命名,并且字与字之间用下划线隔开。如java.lang.byte类里对byte类型的最小值定义:public static final byte MIN_VALUE = -128115. 集合集合对象:用于管理其他若干对象的对象;数组:长度不可变List: 有顺序的,元素可以重复遍历:for 迭代排序:Comparable Comparator Collections.sort()ArrayList:底层用数组实现的List特点:查询效率高,增删效率低 轻量级 线程不安全LinkedList:底层用双向循环链表实现的List特点:查询效率低,增删效率高Vector: 底层用数组实现List接口的另一个类特点:重量级,占据更多的系统开销 线程安全Set:无顺序的,元素不可重复(值不相同)遍历:迭代排序:SortedSetHashSet:采用哈希算法来实现Set接口唯一性保证:重复对象equals方法返回为true;重复对象hashCode方法返回相同的整数;不同对象 哈希码 尽量保证不同(提高效率)SortedSet:对一个Set排序TreeSet:在元素添加的同时,进行排序。也要给出排序规则唯一性保证:根据排序规则,compareTo方法返回为0,就可以认定两个对象中有一个是重复对象。Map:元素是键值对 key:唯一,不可重复 value:可重复遍历:先迭代遍历key的集合,再根据key得到valueHashMap:轻量级 线程不安全 允许key或者value是nullHashtable:重量级 线程安全 不允许key或者value是nullProperties:Hashtable的子类,key和value都是StringSortedMap:元素自动对key排序TreeMap:集合是指一个对象可以容纳了多个对象(不是引用),这个集合对象主要用来管理维护一系列相似的对象。1.1.1. 集合接口类层次 位于package java.util.*;Collection | Set List Map | | SortedSet SortedMap 1) Set: 集合类中不允许有重复对象; 2) SortedSet: 和Set接口同,但元素按升序排列; 3) List: 元素加载和移出时按照顺序,可以保存重复对象。 4) Map: (key-value对)存储了唯一关键字辨识和对应的值。 5) SortedMap: 和Map类同,但对象按他们关键字的升序排列。 1.1.2. 集合类层次 (注:JAVA1.5对JAVA1.4的最大改进就是增加了对范型的支持)Collection | HashSet LinkedList Hashtable (Set) Vector, ArrayList Hashmap (List) (Map) | | TreeSet TreeMap (SortedSet) (SortedMap) Collection接口的方法:add(Object o)addAll(Collection c)contains(Object o)containsAll(Collection c)remove(Object o)removeAll(Collection c)clear()equals(Object o)isEmpty()iterator()size()toArray()toArray(Object o)1.1.3. 五个最常用的集合类之间的区别和联系 1ArrayList: 元素单个,效率高,多用于查询 2Vector: 元素单个,线程安全,多用于查询 3LinkedList:元素单个,多用于插入和删除 4HashMap: 元素成对,元素可为空 5HashTable: 元素成对,线程安全,元素不可为空 ArrayList底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。而在LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。双向循环链表的查询效率低但是增删效率高。ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的。LinkedList经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。队列:先进先出的数据结构。栈:后进先出的数据结构。注意:使用栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。Vector(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)结论:在考虑并发的情况下用Vector(保证线程的安全)。在不考虑并发的情况下用ArrayList(不能保证线程的安全)。面试经验(知识点):java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。对于堆栈和队列只能用push类和get类。Stack类以后不要轻易使用。实现栈一定要用LinkedList。(在JAVA1.5中,collection有queue来实现队列。)Set-HashSet实现类:遍历一个Set的方法只有一个:迭代器(interator)。HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。在Object中除了有finalize(),toString(),equals(),还有hashCode()。HashSet底层用的也是数组。当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode:int hc=o.hashCode(); 返回的hashCode为整数值。Int I =hc%n;(n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n为6为例,如果I=0则放在数组a0位置,如果I=1,则放在数组a1位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。在实例中,定义student对象时覆盖它的hashcode。因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。现在,在大部分的JDK中,都已经要求覆盖了hashCode。结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。例子:public int hashCode()return name.hashcode()+age;这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。使用hashSet的优点:hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。使用hashSet类时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。1.1.4. 比较Collections类(工具类全是static 方法)Public static int binarySearch(List list,Object key)Public static void Sort(List list,Comparator com)Public static void sort(List list)方法一:Comparator接口Int compare(Object a,Object b)Boolean equals(Object o)例子:import java.util.*;public class Test public static void main(String arg) ArrayList al = new ArrayList();Person p1 = new Person(dudi);Person p2 = new Person(cony);Person p3 = new Person(aihao);al.add(p1);al.add(p2);al.add(p3);Collections.sort(al,p1);for(Iterator it = al.iterator();it.hasNext();)Person p = (Person)it.next();System.out.println();class Person implements java.util.Comparatorpublic String name;public Person(String name) = name;public int compare(Object a,Object b)if(a instanceof Person&b instanceof Person)Person pa = (Person)a;Person pb = (Person)b;return pareTo();return 0;public boolean equals(Object a)return true;方法二Java.lang.ComparablePublic int compareTo(Object o)Class Person implements java.lang.ComparablePublic int compareTo(Object o)Comparable c1=(Comparable)this;Comparable c2=(Comparable)o;Return pareTo( );.Main 方法中Collections.sort( list );*注意:程序员和类库之间是平等的关系,而不是上下级关系,以前的类可以是通过接口调用后来的类 。集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误。解决的方法是添加类型的判断。116. java 自动装箱与拆箱 中的陷阱 收藏 117. 自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如: 118.119. Integer i = 100;相当于编译器自动为您作以下的语法编译: 120.121. Integer i = new Integer(100);所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的: 122.123. Integer i = null;int j = i;这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于: 124.125. Integer i = null;int j = Value();null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。 126.127. 自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心。再来看范例4.6,您认为结果是什么呢? 128.129. 范例4.6 AutoBoxDemo2.java 130.131. public class AutoBoxDemo2 132.133. public static void main(String args) 134.135. Integer i1 = 100; 136.137. Integer i2 = 100; 138.139. if (i1 = i2) 140.141. System.out.println(i1 = i2); 142.143. else 144.145. System.out.println(i1 != i2); 146.147. 148.149. 150.151. 从自动装箱与拆箱的机制来看,可能会觉得结果是显示i1 = i2,您是对的。那么范例4.7的这个程序,您觉得结果是什么? 152.153. 范例4.7 AutoBoxDemo3.java 154.155. public class AutoBoxDemo3 156.157. public static void main(String args) 158.159. Integer i1 = 200; 160.161. Integer i2 = 200; 162.163. if (i1 = i2) 164.165. System.out.println(i1 = i2); 166.167. else 168.169. System.out.println(i1 != i2); 170.171. 172.173. 174.175. 结果是显示i1 != i2,这有些令人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。 176.177. 其实这与=运算符的比较有关,在第3章中介绍过=是用来比较两个基本数据类型的变量值是否相等,事实上=也用于判断两个对象引用名称是否参考至同一个对象。 178.179. 在自动装箱时对于值从128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用=进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以范例4.7使用=进行比较时,i1与i2参考的是不同的对象。 180.181. 所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。范例4.7最好还是依正规的方式来写,而不是依赖编译器蜜糖(Compiler Sugar)。例如范例4.7必须改写为范例4.8才是正确的。 182.183. 范例4.8 AutoBoxDemo4.java 184.185. public class AutoBoxDemo4 186.187. public static void main(String args) 188.189. Integer i1 = 200; 190.191. Integer i2 = 200; 192.193. if (i1.equals(i2) 194.195. System.out.println(i1 = i2); 196.197. else 198.199. System.out.println(i1 != i2); 200.201. 202.203. 204.205. 结果这次是显示i1 = i2。使用这样的写法,相信也会比较放心一些,对于这些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:如果您不确定就不要用。 206.207.208. 本文来自CSDN博客,转载请标明出处:/lovingprince/archive/2007/10/21/1835664.aspx209. 多态总结 210. Posted on 2009-08-23 22:42 Gavin.lee 阅读(13) 评论(0) 编辑 收藏 所属分类: java dev reference 211. 多态性是指“多种形式”它使用不同的实例而执行不同操作多态包括静态多态性和动态多态性1).静态多态性-编译时多态即用相同的方法名定义不同的方法内容。编译时根据它们的特征来进行编译. 即:方法重载2).动态多态性-运行时多态一种在运行时调用重写方法的机制。子类对象可以作为父类对象使用,这是因为子类通过继承具备了父类的所有属性。在程序中凡是可以使用父类对象的地方,都有可以用子类对象来代替。Java提供了 instanceof 运算符,来判断一个对象属于哪个类的实例。 (重载是根据需要重写一个方法或在其中加功能多态是根据需要传入不同参数构建不同的实例)重写:动态多态性-运行时多态 212. packagecom.yixun.wap;classFatherprotectedvoidshowInfo()System.out.println(Father);classSonextendsFatherprotectedvoidshowInfo()System.out.println(Son);protectedvoidshowSex()System.out.println(男);classDaughterextendsFatherprotectedvoidshowInfo()System.out.println(Daughter);protectedvoidshowSex()System.out.println(女);/*/*descripte运行时多态,动态多态性*父类引用指向子类对象,实际对象为子类*java的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,*是被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,*但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。*authorGavin.lee*date2009-8-24下午05:21:49*version1.0*/publicclassTestSonpublicstaticvoidmain(Stringargs)Fatherfa;fa=newSon();/向上转型,父类引用指向子类对象fa.showInfo();/fa.showSex();/无法调用,父类无此方法Sonson=(Son)fa;/向下转型son.showSex();fa=newDaughter();fa.showInfo();/*/*Son*男*Daughter*同一个引用调用了相同名称的方法,结果却不一样-多态的体现*/213. java泛型详解2214. J2SE知识 2009-08-19 11:38 阅读52评论0 215. 字号: 大大 中中 小小 216. Java中的泛型 第二部分217. 摘要:218. 在从Java in a Nutshell,5th edith中摘录的两部部分中的第一部分,David Flanagan描述了如何使用泛型。这部分,David Flanagan将具体告诉你如何创建自己的泛型和泛型方法,并且以Java核心API很多重要的泛型作为结束总结 219. 原文地址:错误!超链接引用无效。220. 中文地址:/resource/article/43/43914_Generic_Types.html221. 关键词: Java Generic Types222. 编者注:在从Java in a Nutshell,5th edith中摘录的两部部分中的第一部分,David Flanagan描述了如何使用泛型。这部分,David Flanagan将具体告诉你如何创建自己的泛型和泛型方法,并且以Java核心API很多重要的泛型作为结束总结。223. 创建泛型和泛型方法224. 创建一个简单的泛型是非常容易的。首先,在一对尖括号()中声明类型变量,以逗号间隔变量名列表。在类的实例变量和方法中,可以在任何类型的地方使用那些类型变量。切记,类型变量仅在编译时存在,所以不能使用instanceof和new这类运行时操作符来操作类型变量。225. 让我们以一个简单的例子来开始这部分的学习,而后将精简这个例子。这段代码定义了一个树形数据结构,使用类型变量V代表存储在各个树结点中的值。226. import java.util.*;227. /*228. * A tree is a data structure that holds values of type V.229. * Each tree has a single value of type V and can have any number of230. * branches, each of which is itself a Tree.231. */232. public class Tree 233. / The value of the tree is of type V.234. V value;235. / A Tree can have branches, each of which is also a Tree236. ListTree branches = new ArrayListTree();237. / Heres the constructor.Note the use of the type variable V.238. public Tree(V value) this.value = value; 239. / These are instance methods for manipulating the node value and branches.240. / Note the use of the type variable V in the arguments or return types.241. V getValue() return value; 242. void setValue(V value) this.value = value; 243. int getNumBranches() return branches.size(); 244. Tree getBranch(int n) return branches.get(n); 245. void addBranch(Tree branch) branches.add(branch); 246. 247. 正如你所看到的,命名一个类型变量习惯于一个大写字母。使用一个字母可以同现实中那些具有描述性的,长的实际变量名有所区别。使用大写字母要同变量命名规则一致,并且要区别于局部变量,方法参数,成员变量,而这些变量常常使用一个小写字母。集合类中,比如java.util中常常使用类型变量E代表“Element type”。T和S常常用来表示范型变量名(好像使用i和j作为循环变量一样)。248. 注意到,当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型)而不能被静态变量和方法调用。原因很简单,参数化的泛型是一些实例。静态成员是被类的实例和参数化的类所共享的,所以静态成员不应该有类型参数和他们关联。方法,包括静态方法,可以声明和使用他们自己的类型参数,但是,调用这样一个方法,可以被不同地参数化。这些内容将在本章后面谈到。249. 类型变量绑定250. 上面例子中的Tree中的类型变量V是不受约束的:Tree可以被参数化为任何类型。以前我们常常会设置一些约束条件在需要使用的类型上:也许我们需要强制一个类型参数实现一个或多个接口,或是一个特定类的子类。这可以通过指明类型绑定来完成。我们已经看到了统配符的上界,而且使用简单的语法可以指定一般类型变量的上界。后面的代码,还是使用Tree这个例子,并且通过实现Serializable和Comparable来重写。为了做到这点,例子中使用类型变量绑定来确保值类型的Serializable和Comparable。251. import java.io.Serializable;252. import java.util.*;253. public class TreeV extends Serializable & Comparable254. implements Serializable, ComparableTree255. 256. V value;257. ListTree branches = new ArrayListTree();258. public Tree(V value) this.value = value; 259. / Instance methods260. V getValue() return value; 261. void setValue(V v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论