Loading

SXT笔记1

 64.

这些是抽象类

InputStream 【Stream以byte(字节)传送】【1Byte】

OutputStream

Reader【Reader/Writer以char(字符)传送】【2Byte】『一个汉字,也是2Byte』

Writer

 

InputStream:

截屏(2011-11-12 20_56_55).jpg

 

 

OutputStream:

截屏(2011-11-12 20_49_52).jpg

对于OutputStream,先flush,再close。

 

Reader:

截屏(2011-11-12 20_52_26).jpg

 

Writer:

截屏(2011-11-12 20_53_45).jpg

 

 

 

 

63.

节点流:

节点流可以从一个特定的数据源(节点)读写数据(如文件、内存)。

 

处理流:

管子外面在套了一层,外面的这层叫处理流。

处理流是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

 

 

 

62.

第八章

流: 读写数据的。

分类:

  • 按数据流的方向不同可以分为输入流和输出流
  • 按处理数据单位不同可以分为字节流和字符流
  • 按功能不同可以分为节点流和处理流

 

 

61.

auto boxing/unboxing & generic

同时使用:

  • Integer之类基本数据类型 直接写数字就成了。而且取出来时 直接用。
  • 泛型,取出来时 不用加强制转换了 。

 

60.

自己总结:

图、类java.util.Collections 、三个知识点(for、Generic、Auto-boxing/unboxing)、六个接口:

 

Collection、Set、List、Map接口里的方法(在实现类里都有实现)。

Iterator接口:

  1. Collection所有的实现类里面,有个iterator方法。
  2. 通过这个方法,返回一个实现了Iterator接口的对象。
  3. 通过这个对象,可以调用Iterator接口里面的方法,就可以对Collection里面的对象进行遍历。
  4. 『方法内具体是如何实现,及这个返回的对象具体是什么不用管。只要知道 实现了Iterator接口的对象,那就可以当作Iterator对象来使用【此处多态】』

java.lang.Comparable接口:

  1. List对象,要排序(调用java.util.Collections.sort()),那么,对象中 元素的类 得实现Comparable接口。(重写compareTo方法)
  2. 记得,是用List的实现类来存储对象的时候,才有『调用Collections.sort() & 元素的类实现Comparable接口』。Set啦,貌似不能调用Collections的方法。
  3. 例如:
  4. List l1 = new LinkedList();
    l1.add(new Name("Tom", "Lee"));
    l1.add(new Name("Jack", "M"));
    l1.add(new Name("Steven", "X"));
    l1.add(new Name("Lucy", "M"));
    System.out.println(l1);

    Collections.sort(l1);
    System.out.println(l1);
  5. 那么,Name这个类必须实现Comparable [java.lang Interface Comparable ]接口。

 

 

 

59.

泛型(Generic):

/sxt/Container/BasicGeneric.java

用到集合(Collection Map)的时候,尽量使用泛型。

 

什么时候可以用?

  • API文档中,类后面跟着<>的就能用。没有的不要用。

起因:

  • jdk1.4以前类型不明确
  • 装入集合的类型都被当作Object对待,从而失去自己的实际类型。
  • 从集合中取出时往往需要转型,效率低,容易产生错误。

解决办法:

  • 在定义集合的时候同时定义集合中对象的类型
  • 在定义Collection的时候指定
  • 同时也在循环的时候用Iterator指定

好处:

  • 增强程序的可读性和稳定性
  • 装的时候是String,拿出来还是String,不用强制转换了。

 

 

58.

Auto-boxing/unboxing:

 

Map接口存对象的时候,key value必须都是对象。太麻烦。

简单的方法jdk1.5之后:

  • Map m1 = new HashMap();
    Map m2 = new TreeMap();
    m1.put("one", 1);//把 1 自动打包成对象
    m1.put("two", 2);
    m1.put("three", 3);
    m2.put("A", 1);
    m2.put("B", 2);

可以这样写,jdk1.5帮着Auto-boxing/unboxing,很方便。

  • 自动打包成对象
  • 自动解包成基本类型

 

57.

Map接口:

 

存储(key + value)一对儿。

实现类:HashMap和TreeMap。(二叉树,顶层元素只有两个子元素)

key不能重复(指equals,但这里比较的是HashCode,equals太慢)(所以重写equals方法,记得一块重写hashCode方法)

 

 

56.

如何选择数据结构:

 

ArrayList 读 快 改 慢 (底层是数组实现的)

LinkedList 改 快 读 慢 (链表,指针连在一起)

HashSet 两者之间

 

Hashtable已经很少用了。效率低。

 

 

55.

List接口:有序,可重复

 

Eset(int index, E element) 虽然是set方法,但是它有返回值。其返回值是 被替换的那个元素。】

【逆序,LinkedList效率更高。LinkedList把指针调个头就行了。ArrayList需要copy。】

 

java.util.Collections封装了常用的List的方法

要用Collections.sort();来给 使用LinkedList类对象存储的元素 排序,需要满足: 元素的类实现了java.lang.Comparable接口。(implements+重写)

 

 

 

Comparable接口中只有一个方法 int compareTo(T o)

 

  • 返回 0 表示 this == obj
  • 返回正数 表示 this > obj
  • 返回负数 表示 this < obj

 

54.

Set接口:

实现Set接口的类,其中的存放的 数据对象 没有顺序且可以重复。

 

sr.retainAll(s2);//交集//sr变成 sr和s2的交集

su.addAll(s2); //合集//合集后su变成 su跟s2的合集

 

 

53.

增强的for循环。【方便遍历Array 或 Collection 】【语法简便】

  • 数组:不能方便的访问下标值
  • 集合:与使用Iterator相比,不能方便的删除集合中的元素。 【内部也是调用Iterator】

除了简单遍历并读出其中的内容外,不建议使用增强for循环。

 

 

52.

  • ArrayList底层是数组(从名字上看出来,是拿array来存东西)
  • LinkedList底层链表来实现的()

 

两种类的底层遍历方法是不同的(ArrayList可以挨排跳着找,LinkedList得一个个的挨着找),所以Collection接口里 无法写出一个 统一的遍历方法 来。

  1. 所以就有了Iterator接口。(以遍历)
  2. 每一种容器(ArrayList、LinkedList、各种Set)都有自己的实现方法。(实现方法不用管,返回值都是(统一的) 实现了Iterator接口的对象{父类引用指向子类对象}。)(这个对象是什么也不用管,反正用它可以调用Iterator的三个方法,可以遍历了。)
  3. 遍历时,删除元素只能用Iterator接口提供的remove方法。不能调用Collection的remove方法。【在Iterator循环内部执行了锁定】

 

52.

Iterator接口(统一的遍历Collection里面所有元素的方法):

所有实现了Collection接口的容器类 都有一个iterator方法 用以返回一个 实现了Iterator接口的对象

【多态】【继承(Iterator接口)、重写(实现接口,当然要重写)、父类引用指向子类对象(返回的对象是 当作Iterator接口 来用的)】

 

Iterator对象称作 迭代器,用以方便的实现对容器内元素的 遍历 操作。

 

 

Iterator接口定义了如下方法:

  • boolean hasNext(); //判断游标右边是否有元素。
  • Object next(); //返回游标右边的元素,并将游标移动到下一个位置。(1.4是Object)【任何东西都能是Object,所有返回值是Object。父类引用指向子类对象】
  • void remove(); //删除游标左边的元素,在执行完next之后,该操作只能执行一次。

 

这三个方法,遍历(从容器里,挨个拿出来)【Iterator就是那个游标,只在第一个元素的左边】

 

 

 

 

 

51.

equals:

 

容器类对象在调用remove、contains等方法时需要比较对象是否相等,一般会调用equals方法。

但是,当这个对象用在Map接口里头 作为 “键”(类似 字典的索引) 使用的时候,会调用hashCode方法。(效率更高)(而不是调对象?)

 

所以,要是重写equals方法时,一定记得重写hashCode方法。

 

两个对象equals的话,他们的hashCode相等。】

 

通过hashCode可以找到它在内存里的地址(不是绝对的物理地址)。非常适合做索引。

往Map里存东西的时候,是key+value的,可以用hashCode做索引。

 

 

Object类(所有对象的父类)的equals方法是怎么实现的?

就是比较两个对象是否一样(地址是否一样)。(就是 “==”)

 

50.

Collection接口:

继承了Collection接口,实现其中所有的方法。

  • contains equals某个内部元素,就叫包含。
  • containsALL(Collection c) 是不是包含另外一个集合里的所有元素。
  • add(Object element)
  • addALL(Collection c) 添加 集合。
  • remove(Object element)
  • removeALL(Collection c) 删除。
  • retainALL(Collection c) 求交集。
  • Object[] toArray(); 把里面装的对象 转换成数组。

 

Collection c = new ArrayList(); //可以放入不同类型的对象。 父类引用指向子类对象。 不满意ArrayList时,可以转换成其他。就方便了。

 

System.out.println(c); //内部的实现: 调用c的toString方法,打印出"[" "]" 。 然后依次调用c内存储的对象的toString方法。

 

/**

improt java.util.*;

public class Test {
public static void main(String[] args) {
Collection c = new ArrayList();//可以放入不同类型的对象
c.add("Hello");
c.add(Name("f1","l1"));
c.add(new Integer(100));
System.out.println(c.size());
System.out.println(c);//内部的实现: 调用c的toString方法,打印出"[" "]" 。 然后依次调用c内存储的对象的toString方法。

}

}

**/

 

49.

容器的概念:

装其他各种各样对象的东西。(容器,放对象)

 

数组是容器 。

Collection函数库跟数组最大的不同在于,数组有容量大小的限制,而Collection函数库没有这样的限制

 

J2SDK提供的容器API位于java.util包内。

 

容器API类图如下:

 

Collection接口 【一个一个的装】 定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。

  • Set中的数据对象 没有顺序且可以重复。
  • List中的数据对象 有顺序且可以重复。【重复:两个对象相互 equals 】

Map接口 【一对一对的装】 定义了存储 “键(key) —— 值(value) 映射对”的方法。(key + value)(key = value)『key,value。重复时以第二次写的为准,也就是说,重新给key赋值了』

 

【实际上是用容器接口的实现类来存东西的】

 

48.

第七章:容器【重要】

 

1136

一个图,一个类,三个知识点,六个接口。

  • 容器的概念
  • 容器API
  • Collection接口
  • Iterator接口
  • 增强的for循环
  • Set接口
  • List接口 和 Comparable接口
  • Collections类
  • Map接口
  • 自动打包/解包
  • 泛型

 

 

47.

第六章:常见类:

  • 基础类型包装类
  • Math 【用的不多,常用的是random方法】
  • File 【代表的是文件名或者目录名,是个名】【递归】
  • 枚举类型

养成查找API文档的习惯。【API】---【金庸小说】

 

 

 

46.

枚举类型。(作为一个类 封装的)

使用enum关键字就可以定义java.lang.Enum的类型,名字叫MyColor(像是定义了一个类,而不是定义了一个变量),拿着这个类型MyColor再去定义变量。

public enum MyColor { red, green, blue};

 

拿这种类型来定义新变量的话,只能取这三个值中之一。(这三个值好比是类里面的静态变量)

MyColor m = MyColor.red;

 

 

/**

*使用int关键字 就可以定义int型的数

*使用 类 就可以定义 引用型

**/

 

 

 

45.

java.lang.Math类(用的较少)(写游戏?)(图形学?)(web app时基本用不上)

java.io.File类 代表(路径或者文件) new出来的File对象是 内存里的,不是磁盘上的。

 

 

 

44.

基本数据类型包装类

1.基本数据类型是分配在栈空间,如果想放到堆空间的话,用包装类包装一下;

2.【int】Integer.intValue()返回这个包装类的作为int型的值

【long】Integer.longValue()返回这个包装类的作为long型的值

【static int】Integer.parseInteger(String s, <int radix>)把字符串转换成 int型的数

【static Integer】Integer.valueOf(String s, <int radix>)转换成int型包装类

【static String】Integer.toBinaryString(int i)返回i的二进制表示,以字符串的形式

【static String】 toHexString(int i)十六进制

【static String】 toOctalString(int i)八进制

 

43.

StringBuffer类

1.内存中可变大小。

2.想删其中某个字符,直接删,内存区域大小可以改变。【如果是String类型的话,方法是:把要删的字符,之前之后的都截出来,然后再拼接。】

3.append方法、insert方法、delete方法

4.其他的基本同String类。

 

 

42.

public static String valueOf(Object obj) {}

这个方法是传入一个object对象,调用这个对象的toString方法,返回之。

传入的是任何对象,返回的是任何对象的toString方法的返回值。【『继承』任何对象都是Object类的子类。以父之名访问,『类引用指向子类对象』。子类重写了Object父类的toString方法。】【因为三个条件存在,故 多态。而在执行时,动态绑定,所以返回的是所传入对象的toString】

 

 

41.

常见类:

java.lang.String代表不可变的字符串。『内存中不可改变』『想改变,copy这块内存到另一块区域』

java.lang.StringBuffer代表可变的字符串。缓冲区『想改变时,在内存中可变』

String(byte[] bytes)【GB2312的编码转换成GBK的编码】

 

40.

数组的copy:

循环法; System.arraycopy(Object source, int srcPosition, Object destination, int destinationPosition, int length);

 

 

39.

二维数组:数组的数组

四维数组:3D图形转换

 

38.

基础数据类型的包装类。

用这个包装类包装基础数据类型的数据,就可以放到堆空间里了。

用这个包装类也可以把String字符串转换成(这个包装类)相应的数据类型。

 

 

 

37.

异常处理:(程序执行期,出现的错误)

  • 一个图『throwable--> error + exception(runtime exception & checked exception)』;
  • error是处理不了。runtime exception是经常遇见的,可以不用catch,及时处理掉。除了runtime exception的其他exception都需要处理。
  • 五个关键字(try、catch、throws、throw、finally)
  • 先逮小的,再逮大的。
  • 子类重写方法,需要抛出与原方法抛出的一致抛出异常。(或者抛出的虽然多,但是原方法抛出异常的子类)

A。观察名字和行号最重要。程序是调出来的。

B。try {可能出异常的方法} catch (异常对象) {处理的方法}

C。finally通常用于进行资源的清除工作,如关闭打开的文件,删除临时文件

D。throws异常的时候,如果抛出了两个,而且两个是父子类关系,那最好也都写上。(别人知道你抛两种异常,catch住了会做不同的处理)【良好的编程习惯】

 

E。main方法也可以抛异常。【相当坏的习惯】(简单的写法throws Exception。)(main方法抛出的异常,交给了Java运行时系统了,Java 运行时会把异常的堆栈信息打印出来)

 

36.

第三章总结:

 

35.

接口(一种特殊的抽象类,这种抽象类中只包含常量方法的定义,而没有变量和方法的实现)

接口和实现类之间也存在多态性。【继承、重写、父类声明指向子类对象-->多态】

 

()里的可以不写。默认是()这样的。

(public static final) int a;

(public abstract) method() {}

 

implements

 

接口:内存里,只能看到这个对象实例的部分方法;

 

 

34.

抽象类:abstract修饰的类【不能new实例对象】【抽象类必须被继承,抽象方法必须重写(子类不重写时,也须声明成抽象类。方法为抽象方法。重写的任务可以交给子类的子类)】

抽象方法:abstract修饰的方法【含有抽象方法的类必须是抽象类】

 

【抽象方法只需声明,不需实现。】

 

 

33.

多态(dynamic binding)(late binding)

【 执行期间 】【扩展性达到极致。动态绑定,指针在执行时】

1.动态绑定是指“在执行期间(动起来的时候)”判断所引用对象的实际类型,根据其实际的类型调用相应的方法。

2.多态存在的三个必要条件:继承、重写、父类引用指向子类对象。【满足这三个条件,当你调父类中被重写的方法时,实际中new的是哪个子类对象,就调用哪个子类对象的方法】

(方法----->code segment)

 

 

32.

对象转型(casting)

1.父类的引用(或者接口的引用)可以"指向"其子类对象;【方法中要求传父类对象,实际传的时候传的是子类对象。然后在方法中强制转换】【实现的不错的扩展性】

2.一个父类的引用不可以访问其子类对象新增加的成员(属性和方法).

 

3.可以使用 引用变量 instanceof 类名 来判断 该引用型变量 所“指向”的对象实例 是否属于该类或该类的子类。【看对象实例是什么】

4.『1.』称作 向上转型(upcasting),反之称为向下转型(downcasting).

 

 

31.

final

final的变量不可改变它的值。

final的方法不可被重写。

final的类不能被继承。

 

 

 

30.

classpath里面,"."一定写到前面。

Java再去找class时,是按照classpath里面的路径去找的。[用了eclipse就没有这个问题了]

 

29.

hashcode

根据哈希编码可以找到 内存中的 某个对象。

 

28.

toString()

推荐重写之。

 

== 比较的是 【地址】

equals() 比较 【x.equals(y);当x和y是同一个对象的引用用时返回true】

可根据需要重写equals方法。

 

27.

所有的类都是继承自Object类。

反射机制

 

26.

继承中的构造方法:

A。子类的构造的过程中必须调用其父类的构造方法(无论如何,都会先调一次父类的构造方法,不论写不写super,不写的话系统会自动给加上,写的话可以选择调用父类的哪个constructor)

B。子类可以在自己的构造方法中使用super(argument_list)调用其父类的构造方法

a。用this调用自己的constructor

b。this,super必须写在第一行

C。无论如何,都会先调一次父类的构造方法,不论写不写super。不写的话系统会自动给加上super(),即默认调用父类无参的constructor。写的话可以选择调用父类的哪个constructor不写super,。【不写constructor也一样】easy

 

D。无论如何,都会先调一次父类的构造方法,不论写不写super。不写super,父类中有没有无参的constructor,编译出错(因为默认调用父类无参的constructor呀,现在没有,当然出错)。【不写constructor也一样】easy

 

 

 

 

 

25.

super:

用来引用父类的成分。

 

24.

要重写方法时要去copy(避免重写override失败)(难查)

 

23.

继承和权限:

extends以继承

继承后,子类就拥有了父类所有的方法和变量(不管你用不用)

(private也继承了,只是拥有了,但是没有使用权)

((default)同一个包里)

(protected扩展到子类,子类在不同的包里也行)

(public 其他包里的类都可以访问)

 

权限:

 

 

22.

A。j2sdk主要包(jdk):

java.lang包含Java语言的核心类如String,System etc

java.awt(abstract window toolkits)的多个类

java.applet【较少用了现在】

java.net包含执行与网络相关的操作的类

java.io能提供多种输入/输出功能的类

java.util 一些实用工具,如定义系统特性、使用与日期日历相关的函数

 

B。在使用时除了java.lang,别的都要引入。

 

C。打成jar包。层包的父目录,jar -cvf *.jar *.*

D。怎么让别人用jar包。设置到classpath里面就行了,如D:\java\test.jar;

 

 

 

 

 

 

 

 

 

 

 

 

 

21.

package:

A.如果要把一个类放在包里面,请在第一句话写package。编译出来的类必须位于正确的目录下面。(和包的层次完全一致)

B.如果想要在另外一个类里面用刚才包里面的类,必须把包里面类的名字写全。(package)【简单的方法就是import了,import这个类。或者*,注意*不包括子目录哦】【该类源代码可能影响,找到 类】

C.必须让class文件的最上层包的父目录位于classpath下,然后都能用了。或者打成jar包,把jar包放到classpath里。【从父目录开始找最顶层的包,然后找找找】

D.执行一个类,也得写全包名。【写到classpath里】【用了eclipse就方便了】

E.不同的项目设置不同的classpath。【eclipse】

 

 

 

 

20.

类名.变量 : 这个变量一定是静态的。非静态的一定要先new一个对象出来。

System.out(out一定是静态的,不解释)

 

没有指针,Java叫引用。

 

19.

static:

A.【static,字符串常量,都是分配在data segment区域中。】

B.用static声明的成员变量为 静态成员变量。对于该类的所有对象来说,static成员变量只有一份,在data segment里。(所有类的成员共享)不new对象,也有一份在data segment里。非静态的,每new一个对象,单独一份。

C.static变量的访问方法:对象引用/类名+“.”+变量名。(只有一份哦,访问的是同一块内存)(改了,别的对象实例再用时会影响哦)

 

18.

this:是个引用,指向自身对象。

就近声明的原则,确定变量是哪个?

this一般出现在方法里,当这个方法还没有被调用的时候,this指的是谁并不知道。

实际当中,当new一个方法出来,this指的就是当前这个方法。

对哪个对象调用这个方法,this指的就是谁(那个对象)。

 

 

17.

方法重载(Overload):

方法名相同(参数类型不同或者个数不同)

 

16.

内存解析

方法调用时,值传递(Java中只有值传递)

return后面,是一个公式时,公式计算完成,其值也会在内存中分配一块空间。不过等到此行命令执行完成,把值返回后也就消失了。

 

15.

引用类型:除了基本数据类型之外的(四类八种之外的)。。。引用类型占用两块内存。。。字符串(特殊的类)也是。只不过可以像数据类型那样使用罢了。【要new】

基本数据类型:四类八种

 

14.

分析时:找名词。

 

13.面向对象:

设计思想:

Step1.问题中有哪些个类、哪些个对象;

Step2.这些类和对象,分别应该具有哪些属性和方法;

Step3.类和类之间应该有什么关系。

 

合适的方法出现在合适的类里面

 

类之间的几种关系:

比较弱的关系:关联

继承关系:xxx是一种xxx;

聚合关系: 聚集(子类之间关系比较松散)

组合(子类之间关系密不可分)

 

实现关系:接口

多态(与实现关系相关)

 

12.

复习总结第二章

 

11.

形参:事先定义好的参数类型

实参:实际传递的数值;

 

10.

if 后面千万别按个 ; ,出错,还查不出来。

 

9.

do{} while;

 

8.

x?y:z

先算x,若true,取y。

 

7.

表达式:最后能算出一个值来的东西;其类型是 最后算出来的数据类型。

 

6.

当进行打印的时候,无论任何类型,都自动转换成字符串进行打印。连接打印时也是。

System.out.println("String" + c);

 

 

5.

实数常量(如1.2),默认为double型;

整数常量(如123),默认为int型;

(运算时,二话不说,先转换。小到大)

 

int型强制转换到byte,可以转。砍掉3个字节。

double型却不可强制转float,因为它们在计算机内部是模拟表示的,砍不掉。

float可以强制转换成long型,把小数部分砍掉。

 

 

 

4.

float 7位精度;double 15位精度;

 

3.

Java对于浮点数的literal默认double型。声明float型常量,后面必须加f。如float f = 12.3f;

Java对于整数的literal默认为int型。声明long型常量,后面必须加L 。如long = 88888888888L; //必须加,否则会出错。

 

2.

8位(01010101)=1字节

 

1.

布尔Boolean型,只有俩值;true false(不能用非0和0)

字符' 字符串"

出了大括号,就没人认识在大括号里声明的变量了

 

0.

++(写右边的话,先做其他运算,再自增)





posted @ 2013-10-27 09:33  asashadow  阅读(294)  评论(0)    收藏  举报