java编程思想笔记

第一章 对象导论

1,继承只覆盖父类的方法,不添加新方法,叫做纯粹替代(is-a关系);继承添加新方法,叫做非纯粹替代(is-like-a关系)。

2,多态:同一操作,作用于不同的对象,可以有不同的解释,产生不同的执行结果,叫做多态。通常表现为:在运行时,通过指向基类的引用来调用派生类的方法。

3,选择容器时,第一要考虑容器的接口和外部行为是否合适,第二要考虑所需操作的性能。

4,客户端编程:(1)脚本语言:javascript(与java无关) (2)applet/java web start(java编写)

服务器编程:(1)CGI程序(Perl/Python/c++编写)(2)servlet程序(java编写)

第二章 一切都是对象

1,java中,操作对象的标识符实际上都是对象的一个引用。

2,存储速度:寄存器 (java不能控制) > 堆栈(存储基本类型和对象引用) > 堆 (存储对象)  > 非RAM存储(存储流对象和持久化对象)

注:常量存储方式:一般直接存放于程序代码内部;在嵌入式系统中,存放于ROM中。

3,Java数组:基本类型的数组被初始化为0,其它类型被初始化为NULL。

4,如果一个变量在使用前未初始化,则java编译器会报错。

5,java.lang包是java程序默认导入的包,其中包括了java进行程序设计的基础类,包括object,math,class,包装器类,System类,线程类等。

第三章 操作符

1,Random rand = new Random(seed); 等价于Random rand = new Random();rand.setSeed(seed);

int j = rand.nextInt(100);

注:(1)设定seek会产生固定的随机数数列,如果没有设置,则会以当前时间为种子;

(2)rand.nextInt(100),中100为随机数的上限值,下限值为0;

2,++/- - 是递增或递减一个单位,不一定是加减1。

3,比较是否相等(1)基本类型用== (2)包装器类型和系统定义类,用.equals()(3)其他自定义类型,用覆写的equals()

注:判断对象引用是否为null,用==

4,直接常量表示:(1)八进制:前缀为0, (2)16进制:前缀为0x(3)二进制表示:Integer.toBinaryString()或Long.toBinaryString();(4)Long型:后缀用L,double型:后缀用D,float型:后缀用F

5,指数记数法举例:double exp = 47e47;

float ft = 1e-43f;注:后缀f必须有,编译器通常会将指数作为double类型处理

6,java在进行窄化转换时,默认是截尾操作,可以用Math.round()方法进行四舍五入操作(注:负数的.5是进行舍去操作,例如Math.round(-1.5) = -1,Math.round(-1.6) = -2)(Math.round()其实是先+0.5再进行floor()运算)

7,如果运算溢出,java编译器不会有任何的出错警告信息,这是java编译器的不足之处之一。

第四章 控制执行流程

1,Math.random()产生大于0小于1的double值

2,可以用Character中static isLowerCase()检查字符的大小写。

3,用键盘强制中断死循环:ctrl + c

4,foreach用于数组或者实现Iterable接口的对象遍历

第五章 初始化与清理

1,(1) tihs只能在方法的内部使用,表示调用该方法的那个对象

(2)如果为this添加了参数列表,则表示对符合该参数列表的某个构造器的调用

(3)static方法中不存在this

2,(1)正常的资源释放应该写在普通的代码中,例如:流的关闭

(2)垃圾回收器只有在资源耗尽的情况下才会自动工作

(3)终结处理protected void finalize(){} :垃圾回收器在工作前会先调用finalize()方法,所以可以用finalize()来验证对象的终结条件

(4)finalize()用来清理使用“本地方法 例如C++”所分配的资源

(5)System.gc()用来强制进行终结处理

3,(1)数组初始化:即使 Integer[] a = new Integer[100],a也只是代表一个引用数组,在调用数组中元素之前,必须初始化。

(2)Arrays.toString()方法,将数组转换为标准的数组字符串

(3)在数组初始化时,最后一个“,”可有可无,即:int[] a = {1,2,3,}也可以编译通过

4,可变参数列表格式:void f(int... args) 或 void g(Object... args)

5,枚举类型:public enum Spiciness{ NOT,MILD,MEDIUM,HOT,EFAMING }

注:enum类型中会自动加入static values()和ordinal()方法

第六章:访问权限控制

1,类的访问权限只有public和包访问权限

2,访问权限修饰符的作用域:

(1)public:包外

(2)protected:不同包的子类

(3)包访问权限:包内,类内

(4)private:类内

第七章 : 复用类

1.,组合和继承的选择判断:是否需要从新类向基类进行向上转型,如果不需要,则应该认真考虑是否需要继承。

2,(1)编译期常量:必须是基本数据类型,并且在定义时赋值

(2)对于基本数据类型,final使数值恒定不变;对于对象引用,final使引用恒定不变

(3)final static 修饰的基本数据类型一般用大写字母命令

(4)可以定义空的final,但在使用前必须初始化

(5)final参数仅可读,不可修改

(6)final类禁止继承,final类中的方法都隐式的指定为final,类中的域则不一定

第八章:多态

1,多态时通过后期绑定来实现的(除了static和 final方法外,其他方法都为后期绑定)

2,可以再类中定义一个dispose()函数用来销毁对象,销毁的顺序和初始化的顺序相反

3,编写构造器的一条有效准则:用尽可能简单的方法使对象进入正常状态,尽量避免调用非final方法(因为有可能会有多态发生)

第九章:接口

1,接口中的方法默认为 public,域默认为public final static

2,适配器模式:根据现有的接口,产生需要的接口

3,接口可以通过extends 来扩展多个接口

4,可以用接口来创建 常量组,但建议用enum(更强大)

5,在接口中定义的域不能为空,但可以用非常量表达式(eg:随机数)初始化

6,嵌套接口:为实现某个接口时,不需要实现嵌套在其内部的任何接口。而且,private接口不能在定义它的类之外被实现。

7,工厂方法:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。

第十章:内部类

1,(1)内部类似乎还只是 一种名字隐藏和组织代码的模式

(2)内部类拥有其外围类的所有元素的访问权

2,外部类名字.this:返回外部类对象的引用

3,要想创建外部类的对象,必须使用外部类的对象来创建内部类对象,例如:Outer.new inter()

4,如果创建嵌套类(静态内部类)的对象,则不需要外部类对象的引用。

5,内部类可以对外部类中的private域或方法直接修改或者调用,而外部类要访问内部类的方法则需要通过内部类的对象访问。

6,可以再方法和作用域中创建内部类,内部类的作用域仅等于创建其的域。

7,如果在方法中定义一个 匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。

8,在匿名内部类中,可以通过实例初始化来达到构造器的效果。

9,普通的内部类对象隐式的保存了一个引用,指向创建它的外部类对象 。

10,正常情况下 ,不能在接口中放置任何代码,但是嵌套类可以作为接口中的一部分,接口中的任何类都自动public和 static

11,内部类可以使多重继承更加完善

12,闭包 :闭包 是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。内部类是面向对象的闭包。

13,回调,回调的价值在于它的灵活性----可以再运行时动态决定要调用什么方法。

14,内部类不能被覆盖。

15,局部内部类不能有访问修饰符,因为它不是外围类的一部分,但是它可以访问当前代码块中的常量以及此外围类的所有成员。

16,局部内部类仅仅比匿名内部类好在了多了构造器。

第十一章:持有对象

1,@SuppressWarning(unchecked) “不受检查的异常”的警告信息应该被抑制

2,添加一组元素:(1)Arrays.asList()返回一个固定大小的list

(2)Collections.addAll()将所有指定元素添加到指定collection中,效率较高

(3)Collention.addAll()参数只能为Collection类型

3,Arrays.asList() (1)返回的list底层实现是 数组,因此不能改变尺寸

(2)此方法的限制是对所产生的list做了最理想的假设,所以有时候需要显式类型参数说明,P221详细讨论。

4,可以用Arrays.toString()来参数数组的可打印列表,而容器可直接打印

5,(1)HashSet/HashMap 是有利于快速获取元素

(2)TreeSet/TreeMap按照比较结果的升序保存对象

(3)LinkedHashSet/LinkedHashMap按照被添加的顺序保存对象

6,(1)ArrayList常用于随机访问元素,但是在list的中间插入和移除较慢

(2)LinkedList随机访问元素较慢,但插入和移除较快

7,Iterator的方法(1)hasNext() (2)next()(3)remove()

listIterator的方法(1)add() (2)hasNext()(3)hasPrevious() (4)next()

(5)nextIndex() (6)previoutIndex()(7)remove()(8)set()替换访问过的最后一个元素

8,stack和Queue可以用linkedList来作为底层实现。

9,Collentions.shuffle(List<?>list,Random knd)使用指定的随机源对列表进行置换。

10,java容器结构图P246

第12章:通过异常处理错误

1,所有标准异常类都有两个构造器,一个是默认无参构造器,另一个是接受一个字符串作为参数的构造器,以便能把相关信息放入异常对象中。

2,根类Throwable的直接子类Error和Exception

3,通常异常对象中仅有的信息就是异常信息,除此之外不包含任何有意义的内容

4,获得异常信息的4个方法,获得的信息量依此递增(1)getMessage() (2)getLocalizedMessage()(3)toString() (4)printStackTrace()

5,可以用for(StackTraceElement ste : e.getStackTrace())

System.out.println(ste.getMethodName())来访问栈信息

6,e.fillInStackTrace(); 返回一个Throwable,重新抛出异常

7,不需要在异常说明中抛出RuntimeException异常

8,在异常没有被当前异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finally子句

9,即使在try{}中有return子句,finally{}语句也会执行。

10,java异常的瑕疵为:会导致异常丢失,eg:在finally中包含return子句

限制:在覆盖方法的时候,只能抛出基类的异常说明里 列出的异常

11,(1)如果一个方法同时复写了基类方法,又实现了接口的方法,那么该方法所抛出的异常只能是这两个方法的异常的交集。

(2)异常限制对构造器不起作用,且子类的构造器的异常说明必须包含基类的构造器的异常说明

(3)派生类的构造器不能捕获基类构造器所抛出的异常

(4)派生类可以 不抛出任何异常

(5)派生类的方法的异常可以由基类的异常派生而来

第13章:字符串

1,字符串类的定义为:public final class String{}

2,格式化输出的格式:%[argument_index][flags][width][.pression]conversion

flags:对齐方式:默认是右对齐可以同过 -  改为左对齐

width最小尺寸

.pression最大尺寸

例子:printf("Row1 :  [%d %f]\n",x,y);

3,格式化输出方式(1)System.out.printf(); (2)System.out.format();(3)(new Formatter(System.out)).format();

4,类型转换修饰符 d十进制整数 cUnicode字符

b Boolean值s String字符串

f 浮点数(十进制整数)e浮点数(科学计数法)

x 十六进制整数h 十六进制散列码

5,String.format()是一个static方法,接受与Formatter.format()方法一样的参数,但返回一个string对象

6,正则表达式格式: StringpatternStr = ”...“;

Pattern p = Pattern.compile(patternStr);

Matcher m = p.matcher(str);

Matcher查找匹配的方法:(1)lookingAt()从开始匹配,成功则返回true

(2)find() 从字符串中按顺序查找 下一个匹配,成功则返回true

(3)matches()匹配整个字符串

(4)replaceAll()替换全部匹配

7,String类中内建的正则表达式的功能(1).matches() (2).split()(3).replaceAll() / .replaceFirst()

8,(1)Scanner的构造器可以接受任何类型的输入对象 

(2)Scanner的默认定界符为\s,可以通过useDelimiter(regex)修改定界符,用delimiter()方法返回 当前正在作为定界符使用的Pattern对象

9,用正则表达式扫描:Scanner.next(pattern);

MatchResult match = Scanner.match();

暂时先复习到第13章,以后的有空再复习!奋斗奋斗奋斗














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值