[计算机硬件及网络]Java初学者学习经验r.doc

上传人:音乐台 文档编号:1991220 上传时间:2019-01-28 格式:DOC 页数:36 大小:274.73KB
返回 下载 相关 举报
[计算机硬件及网络]Java初学者学习经验r.doc_第1页
第1页 / 共36页
[计算机硬件及网络]Java初学者学习经验r.doc_第2页
第2页 / 共36页
[计算机硬件及网络]Java初学者学习经验r.doc_第3页
第3页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[计算机硬件及网络]Java初学者学习经验r.doc》由会员分享,可在线阅读,更多相关《[计算机硬件及网络]Java初学者学习经验r.doc(36页珍藏版)》请在三一文库上搜索。

1、诚信、创新、开放、合作集合(从本部分开始涉及API)集合是指一个对象容纳了多个对象,这个集合对象主要用来管理维护一系列相似的对象。java.util.*定义了一系列的接口和类.集合框架接口的分类:(分collection接口 和 map接口) Collection接口 Map接口List接口 Set接口 SortedMap接口 SortedSet接口JAVA中所有与集合有关的实现类都是这六个接口的实现类。Collection接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构。List接口代表按照元素一定的相关顺序来组织(在这个序列中顺序是主要的),List接口中数据可

2、重复。Set接口是数学中集合的概念:其元素无序,且不可重复。(正好与List对应)SortedSet会按照数字将元素排列,为“可排序集合”。Map接口中每一个元素不是一个对象,而是一个键对象和值对象组成的键值对(Key-Value)。Key-Value是用一个不可重复的key集合对应可重复的value集合。(典型的例子是字典:通过页码的key值找字的value值)。例子:key1value1;key2value2;key3value3.SortedMap:如果一个Map可以根据key值排序,则称其为SortedMap。(如字典)!注意数组和集合的区别:数组中只能存简单数据类型。Collecti

3、on接口和Map接口只能存对象。以下介绍接口:List接口:(介绍其下的两个实现类:ArrayList和LinkedList)ArrayList和数组非常类似,其底层也用数组组织数据,ArrayList是动态可变数组。 底层:指存储格式。说明ArrayList对象都是存在于数组中。注:数组和集合都是从下标0开始。ArrayList有一个add(Object o)方法用于插入数组。ArrayList的使用:(完成这个程序)先import java.util.*;用ArrayList在一个数组中添加数据,并遍历。ArrayList中数组的顺序与添加顺序一致。只有List可用get和size。而Se

4、t则不可用(因其无序)。Collection接口都是通过Iterator()(即迭代器)来对Set和List遍历。通过语句:Iterator it=c.iterator(); 得到一个迭代器,将集合中所有元素顺序排列。然后可以通过interator方法进行遍历,迭代器有一个游标(指针)指向首位置。Interator有hasNext(),用于判断元素右边是否还有数据,返回True说明有。然后就可以调用next动作。Next()会将游标移到下一个元素,并把它所跨过的元素返回。(这样就可以对元素进行遍历)练习:写一个程序,输入对象信息,比较基本信息。集合中每一个元素都有对象,如有字符串要经过强制类型

5、转换。Collections是工具类,所有方法均为有用方法,且方法为static。有Sort方法用于给List排序。Collections.Sort()分为两部分,一部分为排序规则;一部分为排序算法。规则用来判断对象;算法是考虑如何排序。对于自定义对象,Sort不知道规则,所以无法比较。这种情况下一定要定义排序规则。方式有两种: java.lang下面有一个接口:Comparable(可比较的)可以让自定义对象实现一个接口,这个接口只有一个方法comparableTo(Object o)其规则是当前对象与o对象进行比较,其返回一个int值,系统根据此值来进行排序。如 当前对象o对象,则返回值0

6、;(可将返回值定义为1)如 当前对象=o对象,则返回值=0;如 当前对象o对象,则返回值0。(可将返回值定义为-1)我们通过返回值1和-1位置的调换来实现升序和降序排列的转换。 java.util下有一个Comparator(比较器)它拥有compare(),用来比较两个方法。要生成比较器,则用Sort中Sort(List,List(Compate))第二种方法更灵活,且在运行的时候不用编译。注意:要想实现comparTo()就必须在主方法中写上implement comparable.练习:生成一个EMPLOYEE类,然后将一系列对象放入到ArrayList。用Iterator遍历,排序之后

7、,再进行遍历。集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决),这样就可能出现因为类型不同而出现类型错误。解决的方法是添加类型的判断。LinkedList接口(在代码的使用过程中和ArrayList没有什么区别)ArrayList底层是object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。而在LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。双向循环链表的查询效率低但是增删效率

8、高。所以LinkedList具有查询效率低但增删效率高的特点。ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的。LinkedList经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。队列:先进先出的数据结构。堆栈:后进先出的数据结构。用LinkedList做一个栈“栈(stack)”有时也被称为“后进先出”(LIFO)的容器。就是说,最后一个被“压”进栈中的东西,会第一个“弹”出来。同其他Java容器一样,压进去和弹出来的东西都是Object,所以除非你只用Object的功能,否则就必须对弹起来的东西进行类型转换。LinkedList的方法能直接实现栈的

9、功能,所以你完全可以不写Stack而直接使用LinkedList。如果你只想要栈的功能,那么继承就不太合适了,因为继承出来的是一个拥有LinkedList的所有方法的类。用LinkedList做一个队列队列(queue)是一个“先进先出”(FIFO)容器。也就是,你把一端把东西放进去,从另一端把东西取出来。所以你放东西的顺序也就是取东西的顺序。LinkedList有支持队列的功能的方法,所以它也能被当作Queue来用。还能很轻易地用LinkedList做一个deque(双向队列)。它很像队列,只是你可以从任意一端添加和删除元素。注意:使用堆栈的时候一定不能提供方法让不是最后一个元素的元素获得出

10、栈的机会。LinkedList提供以下方法:(ArrayList无此类方法)addFirst(); removeFirst(); addLast(); removeLast();在堆栈中,push为入栈操作,pop为出栈操作。Push用addFirst();pop用removeFirst(),实现后进先出。用isEmpty()-其父类的方法,来判断栈是否为空。在队列中,put为入队列操作,get为出队列操作。Put用addFirst(),get用removeLast()实现队列。List接口的实现类(Vector)(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比

11、较多。)结论:在考虑并发的情况下用Vector(保证线程的安全)。在不考虑并发的情况下用ArrayList(不能保证线程的安全)。面试经验(知识点):java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。对于堆栈和队列只能用push类和get类。Stack类以后不要轻易使用。!实现堆栈一定要用LinkedList。(在JAVA1.5中,collection有queue来实现队列。)Set-HashSet实

12、现类:遍历一个Set的方法只有一个:迭代器(interator)。HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。在Object中除了有final(),toString(),equals(),还有hashCode()。HashSet底层用的也是数组。/* 这段不需要记,只要弄懂equals跟hashcode的关系当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode:int hc=o.hashCode(); 返回的hashCode为整数值。Int I=hc%n;(n为数组的长度),取得余数后,利用余数向数组中相

13、应的位置添加数据,以n为6为例,如果I=0则放在数组a0位置,如果I=1,则放在数组a1位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。在实例中,定义student对象时覆盖它的hashcode。因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。现在,在大部分的JDK中,都已经

14、要求覆盖了hashCode。*/结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。例子:public int hashCode() return nam

15、e.hashcode()+age;这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。使用hashSet的优点:hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。使用hashSet接口时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。练习:new一个ha

16、shset,插入employee对象,不允许重复,并且遍历出来。SortedSet可自动为元素排序。SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。练习:自定义类用TreeSet排序。与HashSet不同,TreeSet并不需要实现HashCode()和equals()。只要实现compareable和compareTo()接可以实现过滤功能。(注:HashSet不调用CompareTo())。如果要查询集合中的数据,使用Set必须全部遍历,所以查询的效率低。使用Map,可通过查找key得到value,查询效率高。集合中常用的是:ArrayList,

17、HashSet,HashMap。其中ArrayList和HashMap使用最为广泛。使用HashMap,put()表示放置元素,get()表示取元素。遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值。上面这个算法的关键语句:Set s=m.keySet();Interator it=new interator();Object key=it.next();Object value=m.get(key);注意:HashMap与HashCode有关,用Sort对象排序。如果在HashMap中有key值重复,那么后面

18、一条记录的value覆盖前面一条记录。Key值既然可以作为对象,那么也可以用一个自定义的类。比如:m.put(new sutdent(“Liucy”,30),”boss”)如果没有语句来判定Student类对象是否相同,则会全部打印出来。当我们用自定义的类对象作为key时,我们必须在程序中覆盖HashCode()和equals()。注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性)。HashSet实际上为(key.null)类型的HashMap。有key值而没有value值。正因为以上的原因,Tree

19、Set和TreeMap的实现也有些类似的关系。注意:TreeSet和TreeMap非常的消耗时间,因此很少使用。我们应该熟悉各种实现类的选择非常体现你的功底。HashSet VS TreeSet:HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用,而且最好不要重复使用。基于以上原因,我们尽可能的运用HashSet而不用TreeSet,除非必须排序。同理:HashMap VS TreeMap:一般使用HashMap,排序的时候使用TreeMap。HashMap VS Hashtable(注意在这里table的第一个字母小写)之间的区别有些类似于A

20、rrayList和Vector,Hashtable是重量级的组件,在考虑并发的情况,对安全性要求比较高的时候使用。HashMap和Hashtable的区别? 答:二者都实现了Map接口,是将惟一键映射到特定的值上;主要区别在于: 1)HashMap没有排序,允许一个 null 键和多个 null 值,而Hashtable不允许;2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey,因为contains方法容易让人引起误解;3)Hashtable继承自Dictionary类,HashMap是Java1.2引进的Map接口的实现

21、;4)Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法大致一样,所以性能不会有很大的差异。、Arraylist与Vector区别?答:就ArrayList与Vector主要从二方面来说:1)同步性:Vector是线程安全的(同步),而ArrayList是线程序不安全的;2)数据增长:当需要增长时,Vector默认增长一倍,而ArrayList却是一半。Map的运用非常的多。使用HashMap(),

22、如果使用自定义类,一定要覆盖HashCode()和equals()。重点掌握集合的四种操作:增加、删除、遍历、排序。散列算法与Hash数一个合适的equals()必须做到一下五点:1 反身性:对任何x, x.equals(x)必须是true的。2 对称性:对任何x和y,如果y.equals(x)是true的,那么x.equals(y)也必须是true的。3 传递性:对任何x,y和z,如果x.equals(y)是true的,且y.equals(z)也是true的,那么x.equals(z)也必须是true的。4 一致性:对任何x和y,如果对象里面用来判断相等姓的信息没有修改过,那么无论调用多少次

23、x.equals(y),它都必须一致地返回true或false。5 对于任何非空的x,x.equals(null)必须返回false。默认的Object.equals()只是简单地比较两个对象的地址。如果你想把子集写的类当HashMap的键来用的话,你就必须把hashCode()和equals()都给覆写了。理解hashCode()如果你不覆写键的hashCode()和equals()的话,散列数据结构(HashSet,HashMap,LinkedHashSet,或LinkedHashMap)就没法正确地处理键。散列的价值就在于速度:散列算法能很快地找出东西。数组是最快的数据结构。JAVA的面

24、向对象编程-课堂笔记面向对象主要针对面向过程。面向过程的基本单元是函数。什么是对象:EVERYTHING IS OBJECT(万物皆对象)所有的事物都有两个方面:有什么(属性):用来描述对象。能够做什么(方法):告诉外界对象有那些功能。后者以前者为基础。大的对象的属性也可以是一个对象。为什么要使用面向对象:首先,面向对象符合人类看待事物的一般规律。对象的方法的实现细节是屏蔽的,只有对象方法的实现者了解细节。方法的定义非常重要。方法有参数,也可能有返回值。注意区分:对象(本身)、对象的实现者、对象的调用者。分析对象主要从方法开始。我们通过类来看待对象,类是对象的抽象。其次,采用面向对象方法可以使

25、系统各部分各司其职、各尽所能。对象之间的耦合性一定要低(比如不同硬盘和不同主板之间的关系)。这样才能使每个对象本身做成最好的。对于对象的要求:高内聚、低耦合,这样容易拼装成为一个系统。实现高内聚就是要最大限度低提高复用性(复用性好是因为高内聚)。可复用性是OOP的基础。比较面向过程的思想和面向对象的思想:面向过程的思想:由过程、步骤、函数组成,以过程为核心;面向对象的思想:以对象为中心,先开发类,得到对象,通过对象之间相互通信实现功能。面向过程是先有算法,后有数据结构。面向对象是先有数据结构,然后再有算法。在用面向对象思想开发的过程中,可以复用对象就进行复用,如无法进行复用则开发新的对象。开发

26、过程是用对个简单的对象的多个简单的方法,来实现复杂的功能 。从语法上来看,一个类是一个新的数据类型。在面向对象编程中,除了简单数据类型,就是对象类型。定义类的格式:class Student 代码注意类名中单词的首字母大写。实例变量:定义在类中但在任何方法之外。(New出来的均有初值)局部变量:定义在方法之中的变量。局部变量要先赋值,再进行运算,而实例变量均已经赋初值。这是局部变量和实例变量的一大区别。实例变量的对象赋值为null。局部变量不允许范围内定义两个同名变量。实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效。实例变量和局部变量允许命名冲突。书写方法的格式:修饰符 返

27、回值 方法名 调用过程中 方法体可能出现的例外 public int/void addNumber(参数) throw Excepion 例:public int addNumber(int a,int b)注:方法名中的参数int a,int b为局部变量类方法中的一类特殊方法:构造方法。构造方法是当用类生成对象时,系统在生成对象的过程中利用的方法。注意:构造方法在生成对象的时候会被调用,但并不是构造方法生成了对象。构造方法没有返回值。格式为:public 方法名。构造方法的方法名与类名相同。构造方法是在对象生成的过程中自动调用,不可能利用指令去调用。在一个对象的生成周期中构造方法只用一次,

28、一旦这个对象生成,那么这个构造方法失效。用类来生成对象的语句:Student s=new Student()。第一个Student表示这是用Student类进行定义。“Student()”表示调用一个无参数的构造方法。如果()中有参数,则系统构造对象的过程中调用有参的方法。此时S称为一个对象变量。Student s的存储区域存放的是地址:一个对象在硬盘上占有一个连续地址,首地址赋予s空间。S称为对象Student的引用。注意:在对象变量中存放的是引用(地址);在简单变量中存放的是数值。可以构造多个构造方法,但多个构造方法的参数表一定不同,参数顺序不同即属于不同的构造方法:public stud

29、ent(string name,int a)public student(int a,string name)为两个不同的构造方法。如果我们未给系统提供一个构造方法,那么系统会自动提供一个为空的构造方法。练习:写一个类,定义一个对象,定义两个构造方法:一个有参,一个无参。(编写一个程序验证对象的传递的值为地址)注意下面这种形式:static void changename(student stu)stu.setName “LUCY”注意生成新的对象与旧对象指向无关,生成新对象生命消亡与旧对象无关。面向对象方法的重载(overloading)和覆盖(overriding)。在有些JAVA书籍中将

30、overriding称为重载,overloading称为过载。Overloading在一个类中可以定义多个同名方法,各个方法的参数表一定不同。但修饰词可能相同,返回值也可能相同。在程序的编译过程中根据变量类型来找相应的方法。因此也有人认为 overloading是编译时的多态,以后我们还会学到运行时多态。为什么会存在overloading技术呢?作为应对方法的细节。利用类型的差异来影响对方法的调用。吃()可以分为吃肉,吃菜,吃药,在一个类中可以定义多个吃方法。构造方法也可以实现overloading。例:public void teach();public void teach(int a);

31、public void teach(String a)为三种不同的方法。Overloading方法是从低向高转。Byteshortfloatintlongdouble。在构造方法中,this表示本类的其他构造方法:student();student(string n) this();/表示调用student()如果调用student(int a)则为this(int a)。特别注意:用this调用其他构造方法时,this必须为第一条语句,然后才是其他语句。This表示当前对象。Public void printNum() Int number=40; System.out.println(th

32、is.number); 此时打印的是实例变量,而非局部变量,即定义在类中而非方法中的变量。This.number表示实例变量。谁调用this.number那么谁即为当前(this)对象的number方法。封装:使对象的属性尽可能私有,对象的方法尽可能的公开。用private表示此成员属性为该类的私有属性。Public表示该属性(方法)公开;Private表示该属性(方法)为只有本类内部可以访问(类内部可见)。(想用private还要用set和get方法供其他方法调用,这样可以保证对属性的访问方式统一,并且便于维护访问权限以及属性数据合法性)如果没有特殊情况,属性一定私有,方法该公开的公开。如果

33、不指明谁调用方法,则默认为this。区分实例变量和局部变量时一定要写this。11.29继承:父类(SuperClass)和 子类(SonClass)。父类的非私有化属性和方法可以默认继承到子类。Class Son extends Father而如果父类中的私有方法被子类调用的话,则编译报错。父类的构造方法子类不可以继承,更不存在覆盖的问题。(非构造方法可以)如果子类访问父类的构造方法,则在编译的时候提示访问不到该方法。JAVA中不允许多继承,一个类有且只有一个父类(单继承)。JAVA的数据结构为树型结构,而非网状。(JAVA通过接口和内部类实现多继承)方法的覆盖(overriding)方法的

34、重载并不一定是在一个类中:子类可以从父类继承一个方法,也可以定义一个同名异参的方法,也称为overloading。当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。(注意返回值类型也必须相同,否则编译出错。)如果方法不同,则成重载。对于方法的修饰词,子类方法要比父类的方法范围更加的宽泛。父类为public,那么子类为private则出现错误。之所以构造方法先运行父类再运行子类是因为构造方法是无法覆盖的。以下范围依次由严到宽:private :本类访问;default :表示默认,不仅本类访问,而且是同包可见。Protected:同包可见+不同

35、包的子类可见Public :表示所有的地方均可见。当构造一个对象的时候,系统先构造父类对象,再构造子类对象。构造一个对象的顺序:(注意:构造父类对象的时候也是这几步) 递归地构造父类对象; 顺序地调用本类成员属性赋初值语句; 本类的构造方法。Super()表示调用父类的构造方法。Super()也和this一样必须放在第一行。This()用于调用本类的构造方法。如果没有定义构造方法,那么就会调用父类的无参构造方法,即super()。要养成良好的编程习惯:就是要加上默认的父类无参的构造方法。思考:可是如果我们没有定义无参的构造方法,而在程序中构造了有参的构造方法,那么如果方法中没有参数,那么系统还

36、会调用有参的构造方法么?应该不会。多态:多态指的是编译时类型变化,而运行时类型不变。多态分两种: 编译时多态:编译时动态重载; 运行时多态:指一个对象可以具有多个类型。对象是客观的,人对对象的认识是主观的。例:Animal a=new Dog();查看格式名称;Dog d=(Dog)a。声明父类来引用子类。(思考上面的格式)运行时多态的三原则:(应用时为覆盖)1、 对象不变;(改变的是主观认识)2、 对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。在上面的例子中:Animal a=new Dog();对象a的编译时类型为Animal,运行时类型为dog。注意:编译时类型一定要

37、为运行时类型的父类(或者同类型)。对于语句:Dog d=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。3、 在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。关系运算符:instanceofa instanceof Animal;(这个式子的结果是一个布尔表达式)a为对象变量,Animal是类名。上面语句是判定a是否可以贴Animal标签。如果可以贴则返回true,否则返回false。在上面的题目中: a instanceof Animal返回True, a instanceof Dog也返回True,in

38、stanceof用于判定是否将前面的对象变量赋值后边的类名。Instanceof一般用于在强制类型转换之前判定变量是否可以强制转换。如果Animal a=new Animal();Dog d=Dog()a;此时编译无误,但运行则会报错。Animal a=new Dog()相当于下面语句的功能:Animal a=getAnimal();Public static Animal.getAnimal;Return new Dog();封装、继承、多态为面向对象的三大基石(特性)。运行时的动态类型判定针对的是方法。运行程序访问的属性仍为编译时属性。Overloading针对的是编译时类型,不存在运行时

39、的多态。习题:建立一个shape类,有circle和rect子类。Shape类有zhouchang()和area()两种方法。(正方形)squ为rect子类,rect有cha()用于比较长宽的差。覆盖时考虑子类的private及父类的public(考虑多态),之所以这样是避免调用A时出现实际调用B的情况。而出现错误。11.29下午讲的是教程上的Module6Module6-7包括:面向对象高级、内部类、集合、反射(暂时不讲)、例外。面向对象高级、集合和例外都是面向对象的核心内容。面向对象高级: 修饰符:static:可修饰变量(属性);可修饰方法;可修饰代码块。Static int data语

40、句说明data为类变量,为一个类的共享变量,属于整个类。Int data为实例变量。例:static int data;m1.data=0;m1.data+的结果为1,此时m2.data的结果也为1。Static定义的是一块为整个类共有的一块存储区域,其发生变化时访问到的数据都时经过变化的。其变量可以通过类名去访问:类名.变量名。与通过访问对象的编译时类型访问类变量为等价的。Public static void printData()表明此类方法为类方法(静态方法)静态方法不需要有对象,可以使用类名调用。静态方法中不允许访问类的非静态成员,包括成员的变量和方法,因为此时是通过类调用的,没有对象

41、的概念。This.data是不可用的。一般情况下,主方法是静态方法,所以可调用静态方法,主方法为静态方法是因为它是整个软件系统的入口,而进入入口时系统中没有任何对象,只能使用类调用。覆盖不适用于静态方法。静态方法不可被覆盖。(允许在子类中定义同名静态方法,但是没有多态,严格的讲,方法间没有多态就不能称为覆盖)当static修饰代码块时(注:此代码块要在此类的任何一个方法之外),那么这个代码块在代码被装载进虚拟机生成对象的时候可被装载一次,以后再也不执行了。一般静态代码块被用来初始化静态成员。Static通常用于Singleton模式开发:Singleton是一种设计模式,高于语法,可以保证一个

42、类在整个系统中仅有一个对象。11.30final可以修饰类、属性、方法。当用final修饰类的时候,此类不可被继承,即final类没有子类。这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生。当利用final修饰一个属性(变量)的时候,此时的属性成为常量。JAVA利用final定义常量(注意在JAVA命名规范中常量需要全部字母都大写):Final int AGE=10;常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。Final可以配合static使用。 ?Static final int age=10;在JAVA中利用public static fi

43、nal的组合方式对常量进行标识(固定格式)。对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效。常量(这里的常量指的是实例常量:即成员变量)赋值:在初始化的时候通过显式声明赋值。Final int x=3;在构造的时候赋值。局部变量可以随时赋值。利用final定义方法:这样的方法为一个不可覆盖的方法。Public final void print();为了保证方法的一致性(即不被改变),可将方法用final定义。如果在父类中有final定义的方法,那么在子类中继承同一个方法。如果一个方法前有修饰词private或static,则系统会自动在前面加上f

44、inal。即private和static方法默认均为final方法。注:final并不涉及继承,继承取决于类的修饰符是否为private、default、protected还是public。也就是说,是否继承取决于这个方法对于子类是否可见。Abstract(抽象)可以修饰类、方法如果将一个类设置为abstract,则此类必须被继承使用。此类不可生成对象,必须被继承使用。Abstract可以将子类的共性最大限度的抽取出来,放在父类中,以提高程序的简洁性。Abstract虽然不能生成对象,但是可以声明,作为编译时类型,但不能作为运行时类型。Final和abstract永远不会同时出现。当abstr

45、act用于修饰方法时,此时该方法为抽象方法,此时方法不需要实现,实现留给子类覆盖,子类覆盖该方法之后方法才能够生效。注意比较:private void print();此语句表示方法的空实现。Abstract void print(); 此语句表示方法的抽象,无实现。如果一个类中有一个抽象方法,那么这个类一定为一个抽象类。反之,如果一个类为抽象类,那么其中可能有非抽象的方法。如果让一个非抽象类继承一个含抽象方法的抽象类,则编译时会发生错误。因为当一个非抽象类继承一个抽象方法的时候,本着只有一个类中有一个抽象方法,那么这个类必须为抽象类的原则。这个类必须为抽象类,这与此类为非抽象冲突,所以报错。所以子类的方法必须覆盖父类的抽象方法。方法才能够起作用。只有将理论被熟练运用在实际的程序设计的过程中之后,才能说理论被完全掌握!为了实现多态,那么父类必须有定义。而父类并不实现,留给子类去实现。此时可将父类定义成abstract类。如果没有定义抽象的父类,那么编译会出现错误。Abstract和

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1