JavaSE知识点归纳总结.docx

上传人:豆**** 文档编号:29892875 上传时间:2022-08-02 格式:DOCX 页数:38 大小:218.10KB
返回 下载 相关 举报
JavaSE知识点归纳总结.docx_第1页
第1页 / 共38页
JavaSE知识点归纳总结.docx_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《JavaSE知识点归纳总结.docx》由会员分享,可在线阅读,更多相关《JavaSE知识点归纳总结.docx(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、JavaSE知识点一、 继承,封装,多态1、分类我们可以把JAVA中的类分为以下三种:类:使用class定义且不含有抽象方法的类。抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。接口:使用interface定义的类。在这三种类型之间存在下面的继承规律:1.类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。2.抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。3.接口只能继承(extends)接口。2、继承(inheritance) 继承是使用已存在

2、的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。继承是为了重用父类代码,同时为实现多态性作准备。构造方法在实例化的时候调用的,而子类既然继承了父类,那就具备了父类所有的属性以及方法,当子类实例化的时候就先调用父类的构造了,如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其它构造方法,则会默认先调用父类的无参构造方法。你想那么子类中从父类继承的字段,要谁来初始化呢?父类中有这些字段的初始化方式,所以最好的选择

3、就是用父类的构造方法。java创建对象的三个步骤就是,申请内存,调用构造方法,返回对象引用。3、封装(encapsulation) 类使得数据和对数据的操作集成在一起,从而对使用该类的其他人来说,可以不管它的实现方法,而只管用它的功能,从而实现所谓的信息隐藏。 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。4、多态(polymorphism)方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念对于多态,可以总结它为: 一、使用父类类型的引用指向子类的对象;该引用只能调用父类中定义的方法和变量; 二、如果子类中重写了父类中的一个方法,那

4、么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 三、变量不能被重写(覆盖),”重写“的概念只针对方法。 5、重写英文名是overriding,是指在继承情况下,子类中定义了与其基类中方法具有相同型构的新方法,就叫做子类把基类的方法重写了。这是实现多态必须的步骤。6、重载英文名是overloading,是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法。在同一个类中,是不允许定义多于一个的具有相同型构的方法的。7、接口与抽象类abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制。在abstract class方式中

5、, 可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中, 只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。接口(i

6、nterface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量,instanceof 运算符可以用来决定某对象的类是否实现了接口。java抽象类的构造方法和普通类的构造方法一样,都是用来初始化类,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super(参数列表)调用抽象类中的构造方法,可以这么理解吧 抽象类就是一个不能实例化的类不过如果方法加了abstract那么就必须在子类里面重写了二、 Java存储JAVA的容器-List,Map,Set C

7、ollection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 所有实现Collection接口的类都必

8、须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下: Iterator it = collection.iterator(); / 获得一个迭代子

9、while(it.hasNext() Object obj = it.next(); / 得到下一个元素 由Collection接口派生的两个接口是List和Set。List接口 List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Itera

10、tor接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 Sort()对list接口进行排序LinkedList类 LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。如果多个线程同时访

11、问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: List list = Collections.synchronizedList(new LinkedList(.);ArrayList类 ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新

12、元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。实现长度可变的数组,采用和数组相同的存储方式,被称为动态数组,可以添加任何类型的数据,可以存储不唯一有序的对象Vector类 Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建

13、而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。Stack 类 Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。Set接口 Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1

14、.equals(e2)=false,Set最多有一个null元素。 很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。 请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 Hashset 不能保存重复的对象,特点是存储的元素可以是无序排列,集合元素可以是空Map接口 请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供

15、3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable类 Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间

16、将增大,这会影响像get和put这样的操作。 使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”: Hashtable numbers = new Hashtable(); numbers.put(“one”, new Integer(1); numbers.put(“two”, new Integer(2); numbers.put(“three”, new Integer(3); 要取出一个数,比如2,用相应的key:map的public Set keySet()返回所包含键的 set集合,因为map中键是不

17、能重复的,所以使用了set集合的不可重复的特性来做返回值类型.循环key for (String key : map.keySet() collections 与collection区别Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。CompareTo()比较同类的两对象顺序大小Sort()对list接口进行排序Fill()对集合元素进行替换三、 遍历Iterator接口hasnext()是否存在课访问元素next()返回要访问的下一个元素For(

18、元素类型 元素名 :遍历的对象或者方法)引用了变量名的java语句四、 常用类的用法1.StringBuffer类和StringBuilder类的区别所谓的线程安全问题就是同时有多个线程访问同一个资源时引起的数据混乱问题。StringBuffer是线程安全的,所以当它作为成员变量时不存在线程安全问题。StringBuilder是线程不安全的,在作为成员变量时有可能出现线程不安全问题。如果在方法内部使用一个这样的变量,用StringBuilder效率会更高,因为首先StringBuilder没有加锁,其次方法内部不存在线程安全问题。2.Math.random()与java.util.random

19、()的区别直接调用Math.random()是产生一个0,1)之间的随机数,如果用java.util.Random random=new Random();random.nextInt()这样产生一个长整型的随机数并且与上一次是一样的,如果过一会再产生就不会一样了,例如: for (int i = 0; i 10; i+) Random random=new Random(); Thread.sleep(100); System.out.print(int)random.nextInt(100)+ ); 就是产生不同的随机Long数了如果想用java.util.Random()产生指定范围的随

20、机数就需要进行求模运算,进行一些处理。 同样 可以random.nextInt(100)产生100以内的随机数。一般最好用nextInt(范围)的,如果不是大量的运算的话,就可以用Math.random了,(因为他可以运算起来慢一些,浮点之后再取整)(int)(Math.random()*100)3.数据类型的包装类Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类,有些地方也翻译为外覆类或数据类型类。int 是基本类型

21、,直接存数值 Integer是类,产生对象时用一个引用指向这个对象Java把内存划分成两种:一种是栈内存,另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配 而实际的对象是在存储堆内存中 即 int i = 5;/直接在栈中分配空间 Integer i = new Integr(5);/对象是在堆内存中,而i(引用变量)是在栈内存中 在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理. 包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示:基本数据类型(原始类型)包装类( 封装类)byteBytebooleanBooleansh

22、ortShortcharCharacterintIntegerlongLongfloatFloatdoubleDouble 在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。 对于包装类说,这些类的用途主要包含两种: a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。 b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。4.int 和 Integer 的区别java 提供两种不同的类型:引用类型(或者封装类型,Warpper)和原始类型(或内置类型,Primitive)。Int是ja

23、va的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的 数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。5.Enum枚举在JDK1.5 之前,我们定义常量都是: public static fianl. 。,有了枚举,可以把相关的常量分组到一个枚举类型里6.日期时间类Date:用来表示日期和时间Si

24、mpleData类格式化时间的类Calendar类用来操作时间的 类,是抽象类用getInstance获取其对象7.String1.字符串转换成字节数组 String s .getBytes()2.int three = Integer.parseInt(String.valueOf(zuo.charAt(2);/ 取数字字符串的第三个数3.contains(tuipiao)是否包含String类的构造方法/String类的构造方法/方法一:String();/方法二:String(byte bytes)/方法三:String (byte bytes,int index,int length)

25、/方法四:String(char value)/方法五:String(char value,int index,int length)/方法六:String(String str).1、byte 转 stringbyte srtbyte;/声明一个byte字节数组String res = new String(srtbyte);/使用构造函数转换成字符串System.out.println(res);2、string 转 byteString str = Hello;/声明一个字符串byte srtbyte = str.getBytes();/使用string类的getBytes方法进行转换也

26、可以将byte转换的时候,设定编码方式相互转换,如下代码:String str = hello;byte srtbyte = null;srtbyte = str.getBytes(UTF-8);/设定转换的编码格式String res = new String(srtbyte,UTF-8);System.out.println(res);java中substring的用法strstr.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;strstr.substring(int beginIndex,int e

27、ndIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str; 五、 Java输入输出(IO流)结构图常用的1.文件Filejava io的开始:File流的本质也是对文件的处理,我们循序渐进一步一步从文件讲到流。java 处理文件的类 File,java提供了十分详细的文件处理方法,举了其中几个例子import java.io.*;public class FileExample public static void main(String args) throws IOException createFile();/* * 文件处理示例 *

28、author liuyd */public static void createFile() try File f = new File(C:/刘彦登测试.txt);/ 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。f.createNewFile();/ 返回由此抽象路径名表示的文件或目录的名称。System.out.println(该分区大小 + f.getTotalSpace()/ (1024 * 1024 * 1024) + G);/ 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。f.mkdirs();/ f.delete();/删除此抽象路径名

29、表示的文件或目录/ 返回由此抽象路径名表示的文件或目录的名称。System.out.println(文件名: + f.getName();/ 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。System.out.println(文件父目录字符串: + f.getParent(); catch (IOException e) e.printStackTrace();2.字节流构造方法:public FileOutputStream(String name):创建一个具有指定名称的文件中写入数据的输出文件流public FileOutputStream(Strin

30、g name,boolean append):创建一个向具有指定name的文件中写入数据的输出文件流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处public FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流public FileOutputStream(File file,boolean appended):创建一个向指定File对象表示的文件中写入数据的文件文件输出流。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。 总结:1、 FileInputStream是InputSt

31、ream类(字节流输入)的子类,以字节流方式读取文件;FileInputStream的构造函数参数可以是File文件,也可以是字符串,但实际上使用File文件会更加规范。2、类似的,FileOutputStream是OutputStream类的子类,以字节流方式写入文件。如果进行写操作的文件不存在,责自动创建该文件。如果文件所在的路径也不存在则报错。3、 与File类不同(File类关注的是文件在磁盘上的存储),FileInputStream,FileOutputStream关注是的文件的内容4.采用BufferOutputStream 类将FileOutputStream作为参数新建一个对象

32、便可以提高文件的读写效率输入流FileInputStream1.字节流有输入和输出流,我们首先看输入流InputStream,我们首先解析一个例子import java.io.*;public class FileCount public static void main(String args) throws IOException /我们写一个检测文件长度的小程序,try int count = 0; / 统计文件字节长度InputStream streamReader = null; / 文件输入流/进行转换的,FileInputStream是有缓冲区的,所以用完之后必须关闭,否则可能导

33、致内存占满,数据丢失。streamReader = new FileInputStream(new File(C:/a.txt);while (streamReader.read() != -1) / 读取文件字节,并递增指针到下一个字节count+;System.out.println(-长度是: + count + 字节);streamReader.close(); catch (FileNotFoundException e) e.printStackTrace();上面的程序存在问题是,每读取一个自己我都要去用到FileInputStream,我输出的结果是“-长度是: 64982 字

34、节”,那么进行了64982次操作!可能想象如果文件十分庞大,这样的操作肯定会出大问题,所以引出了缓冲区的概念。(详解BufferedInputStream 和BufferedOutputStream)通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。输出流FileOutputStream InputStream是所有字节输出流的父类,子类有ByteArrayOutputStream,FileOutputStream,ObjectOutputStreanm,这里说下FileOutputStream我以一个文件复制程序来说,顺便演示一下缓存区的使用。(Java I/O

35、默认是不缓冲流的,所谓“缓冲”就是先把从流中得到的一块字节序列暂存在一个被称为buffer的内部字节数组里,然后你可以一下子取到这一整块的字节数据,没有缓冲的流只能一个字节一个字节读,效率孰高孰低一目了然。有两个特殊的输入流实现了缓冲功能,一个是我们常用的BufferedInputStream.)扩展:bit和byte同译为比特,都是数据量度单位,bit=“比特”或“位,byte=字节即1byte=8bits,两者换算是1:8的关系。bit 电脑记忆体中最小的单位,在二进位电脑系统中,每一bit 可以代表0 或 1 的数位讯号。一个Byte由8 bits 所组成,是记忆体储存资料的基本单位 例

36、1是使用FileInputStream与FileOutputStream的一个例子.程序可以复制文件,它会先从来源文件读取数据至一个byte数组中,然后再将byte数组的数据写入目的文件.例1FileStreamDemo.java(典例)import java.io.*;public class FileStreamDemo public static void main(String args) try / 来源文件FileInputStream in = new FileInputStream(new File(C:/a.txt); / 目的文件 FileOutputStream out

37、= new FileOutputStream(new File(C:/b.txt); byte b = new byte1024;/ 一次取出的字节数大小,缓冲区大小int numberRead = 0;while (numberRead = in.read(b) != -1) out.write(b, 0, numberRead);in.close();out.close(); catch (IOException e) e.printStackTrace();/*/1.numberRead的目的在于防止最后一次读取的字节小于b的长度(使用缓冲流则省略这一步)read(byte b)从此输入

38、流中将最多 b.length 个字节的数据读入一个 byte 数组中,返回读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。 write(byte b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。2.构造FileOutPutStream的实例对象,先定义一个File类文件的做法比较规范,通用3.此类写法定义直接数组的弊端byte b = new bytein.available(); in.read(b);out.write(b);在进行网络操作时往往出错,因为你调用available()方

39、法时,对发发送的数据可能还没有到达,你得到的in.available()是0。available()返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数,使用available()方法可以获得还有多少字节可以读取.字节流与缓冲区BufferedInputStream 和BufferedOutputStreamjava.io.BufferedInputStream与java.io.BufferedOutputStream可以为InputStream、OutputStream类的对象增加缓冲区功能,构建BufferedInputStream实例时,需要给定一个Inp

40、utStream类型的实例,实现BufferedInputStream时,实际上最后是实现InputStream实例.同样地,在构建BufferedOutputStream时,也需要给定一个OutputStream实例,实现BufferedOutputStream时,实际上最后是实现OutputStream实例.BufferedInputStream的数据成员buf是一个位数组,默认为2048字节,BufferedOutputStream的数据成员buf 也是一个位数组,默认为512字节.例2是对例1的改写,不用自行设定缓冲区,比较简单且有效率.例2BufferedStreamDemo.jav

41、aimport java.io.*;public class FileStreamDemo public static void main(String args) throws IOExceptiontry /来源文件BufferedInputStream bufferedIn = new BufferedInputStream(new FileInputStream(C:/a.txt);/目的文件BufferedOutputStream bufferedOut = new BufferedOutputStream(new FileOutputStream(C:/c.txt);byte b

42、= new byte1024; /注意和不用缓冲流的区别while (bufferedIn.read(b)!=-1) bufferedOut.write(b);/将缓冲区中的数据全部写出bufferedOut.flush();/关闭流bufferedIn.close();bufferedOut.close(); catch (FileNotFoundException e) e.printStackTrace(); 为了确保缓冲区中的数据一定被写出至目的地,建议最后执行flush()将缓冲区中的数据全部写出目的流中参考资料http:/www.android100.org/html/201401

43、/17/5344.html3.字符流顾名思义,就是操作字符文件的流字符流与PrintWriter1. 我们用FileReader,PrintWriter来做示范import java.io.*;public class Print public static void main(String args) throws IOException try char buffer = new char1024;/ 一次取出的字节数大小,缓冲区大小int numberRead = 0;FileReader reader = null;/ 读取字符文件的流PrintWriter writer = null

44、;/ 写字符到控制台的流reader = new FileReader(C:/a.txt);writer = new PrintWriter(System.out);/ PrintWriter可以输出字符到文件,也可以输出到控制台while (numberRead = reader.read(buffer) != -1) writer.write(buffer, 0, numberRead);reader.close();writer.close(); catch (FileNotFoundException e) e.printStackTrace();字符流与缓冲区import java.io.*;public class TestBufferedReader pub

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁