第一章对象入门
将一条消息发给一个对象,并不知道对方的具体类型,但确能采取正确的行动叫多态
动态绑定实现多态 c++ virtual java 自动执行向上造型
用abstract描述一个尚未实现的方法,这种抽象方法只能在抽象类里创建,继承了这个类之后,如不实现此方法,这个类也变成抽象类
在内存中动态的创建对象,除非进入运行期,否则不知道到底需要多少个对象
java单根结构优势
1:所有对象都可以保证一些特定的功能,所有对象都在内存堆中创建,可大大简化参数的传递
2:方便的实现gc
C++不单根是为了实现向后兼容c
向下造型,可能会发生exception,程序员要花精力,泛型可由编译器来完成,向下造型和运行期类型检查要花额外的时间
在C++的我们可在堆栈中创建对象,对象可以自动清除,这是创建对象和分配存储最有效的方式,在内存堆中创建对象要付出昂贵的代价
违例控制:
Web安全数字签名:代码会得到权威机构的认证,显示出它的作作者是谁。
第二章一切都是对象
保存到什么地方
1:寄存器:最快,处理器内部,由编译器分配,无直接控制权
2:堆栈 ram快,堆栈指针往下移会创建新的内存,往上移会释放那些内存
3:堆 对象 编译器不知道从堆里分配多少存储空间,也不必知道存储的数据要在堆里存放多长时间。
4:静态存储:位于ram中固定的位置,static,java对象不会置入静态存储区
Char,short 16位,byte 8 float int 32
基本类型有作用域的概念,对象依然占内存空间比如:{String s=new String(“sfs”)} s 的作用域在括号结束,
成员变量不初始化时有默认值,局部变量不初始化编译通不过
第3章初始化和清除
构造器可以保证每个对象都正确初始化 new tree(1),
重载:变量个数类顺序
构造器里用this可以调用另外的构造器,但只能调用一次
清除收尾和垃圾收集
假定对象分配了特殊的内存区域,没有用new,gc只知道释放那些由new分配的内存,用finalize方法gc 先调用finalize方法,在下次调用时真正回收内存
Jni: c c++ 调用代码没有free,需要在finalize中利用构造器初始化灵活
初始化顺序:
Static:如不创建table对象,或调用table.b对象那么static的b永远不会被初始化,只有第一 次访问或是第一次初始化table对象时b才会初始化
先static 再非static ,先成员变量,再方法
第3章隐藏实施过程
访问提示符
Public 友好的(无关毽字)protected private
所有尽可能private 自己的变化不会影响其它人、模块
每个编译单元只能有一个public类,这两者名字必髠一样
一个.java文件可能编译成多个.class文件 封装成Jar包
Java解析器
1:找到classpath 2:搜索。Class文件
类 友好 public protected
包访问权限 所有 继承的类可以public也可以:如果a extends b a,b不在同一个包可通过protected a访问b,而b.cc又不是public
第6章类再生(通过组合和继承实现复用)
属于用继承来表达 包含关系用组合
Final 方法:继承类不能改写 2:嵌入效率高
初始化顺序:父类 static成员-子类static –new对象时父类成员成员变量—父类构造方法—子类成员变量---子类构造方法
第7章多形性
绑定:将一个方法调用与同一个方法主体链接到一起
动态绑定:运行期绑定,一条消息发给一个对象,让对象自己判断要做什么
接口:基本数据类型和成员默认为statict和final方法默认为public
Interface extends a,b 这两个都为接口才能多继承
空白final:final f 可在构造器中初始化灵活性强
内部类存在原因:
1:准备实现某种形式的接口,使自己能创建和返回一个句柄
2:要解决一个复杂的问题,用内部类,同时又不愿把它公开
3:内部类能访问封装对象的成员
匿名内部类没名字
Retun new contents{}
等同于calss m extends contents {return m()}
它不能拥有一个构造器
静态内部类
1) 创建一个static 对象,不需外部对象
2) 不能从static 内部类访问外部对象
构造器多形性:
作用:检查对象是否得到了正确的创建
继承中如果没有明确指出对一个基础类的调用,那默认会调用基础类的默认构造函数
构造器初始化 由上到下
Super.finalize()子类 必须这样写,否则父类不会被回收
Collection接口方法:
Add,addall, clear contains containall isempty iterator removeall size toarray()
List Arraylist LinkedList
Set 和collection有相同接口 set(只支持少量元素创建和删除)
Hashset arrayset(array、得到) treeset(红黑树)可增加重复元素,实际上只存在一个实例
工具类:
Arrays:sort binarysearch
Collection :enumeration max min(collection comparatorsublist ncopies
第9章违例差错控制
产生一个违例对象1:在内存中用new创建违例对象
2:停止当前执行路径3:释放违例对象的引用
4:违例控制接管 到合适的地方运行 throw产生一个违例
Finally :在没有垃圾收集和自动调用破坏器机制的语言中可使内存正确释放
15 网络编程
如get 字串过长的话可用post数据可从编码,并按与get相同的方法链接起来 content_length中保存长度
Java和c++的对比
1:解释过的java慢
2:无:用.
3) 对象都用new 基本类型都在堆栈
4)java不用提前声明
5)类成员对象自动初始化成null,成员变量也初始化
6指针7无copyconstructor
8:无破坏器无goto
9:单根11:无模版类
12 gc
13:无inline 多继承,接口, 无virtual
14;异常控制机制,所有类都从throwable继承
15:jni有时不用java 执行访问硬件的任务
第10 章 java i/o系统
Inputstream: bytearrayinputstreamstringbufferinputstream fieinputsream
Pipedinputstream filterinputstream sequenceinputstream
Inputstream的嵌套使用
1:缓冲的输入文件
为找开一个文件以便输入,用fileInputstream 为提高速度先对文件缓冲处理,用bufferedinputstream 为了以格式化的形式读入数据 datainputstream 是要读取的接口
Datainputstream in=new datainputstream(newbufferedinpustream new fileinputstream()))
In.readline()
2:从内存读入 datainputstream in=new data(new sring bufferinputstream())
压缩
Gzip简单压缩 zip多文件压缩
Bufferreader in =new bufferedreader(newfilereader(args[0]))
Bufferouputstream out=new buferoutputstream(newgzipoutputstream(new fileoutputstream()))
序列化:作用:rmi(允许java调用远程系统上的对象) 用于:rmi 将消息发送给远程对象时,通过序列化传递远程参数和返回值
Javabeam:使用一个bean时它的状态信息是配置好的,程序启动后这种状态应保存下来
Class对象
每个类都有一个class对象,如果我们想生成一个对象,jvm就会检查那个类型的class对象是否已经载入 class.forname()可以载入class文件
Rtti:
Instance of class.forname()
Clsss .isinteface()
反射:
如不知道一个类的准确类型,rtti可以调整,但类型必须是编译期间已知的,假设我们从网络获知一系列字节并告知那是一个类,我们怎么使用
可以用invoke调用与method对象关联的方法和getfields(), getmethods,getconstructs()
RTTI和反射唯一区别
RTTi:编译器会在编译时打开和检查.class文件可以用普通的方式调用一个对象方法
反射:.class文件在编译期间是未知的不可使用的,而是运行时打开和检查
可用于序列化javabean rmi
12章传递和返回对象
克隆:若用修改一个对象而又不想改变调用者的对象制作一个副本
成功的克隆:实现clonenable接口并复写方法clone()
Class a implements cloneable
{
Public object clone()
{
O=super.clone();
Return o:
}
}
v.clone()
序列化也可以实现复制只是慢不稳定
只读类:能防止别名处理的副作用
包装类:wrapper 比如integer实现了不变性只能读不能改
并发
Web服务器一般含多个处理器—并发---servlet 多线程
阻塞:任务因外部条件不能运行
并发最直接的方式:使用进程在os级别(容易)进程间无通信的必要
进行是运行在自己地址空间的程序
Java使用的并发系统会共享内存和i/o这样的资源
多线程难点在于协调不同线程驱动的任务之间对资源的使用
Java线程机制是抢占式的,调试机制会周期性的中断线程
线程机制:是进程中一个单一的顺序控制流
线程:实现runnable接口并写run方法
Run;;总有一定形式的循环,它在任务一直运行下去直到不需要
在run中调用thread.yidld()建仪线程调度但不一定会执行
Thread =new thread(new runnable())
t.start();
任务中产生返回值实现callable而不是runnable() sleep():使任务执行给定的时间然后终止
优先级:thread.currentthread().setpriority(int)
后台线程:(daemon守护)后台提供通用性服务的线程不是不可或缺的(gc),会在所有非守护线程结束后杀死守护线程
Thread a=new thread(new runnable()) a.setdeamon(true)设这个才为守护线程
线程的两种实现方法
1:继承thread 或是实现runnable()
Start()方法在构造方法中调用安全
Join:某线程在另一线程t上调用join,此线程被挂起直到t结束:
共享资源竞争
1) 资源加锁 synchronized
2) Lock
Lock对象必须被显式的创建,锁定和释放,与内建锁形式比较更加灵活
Private lock lock=new rentanlock()
Lock.lock();
Lock.unlock();
Synchronized中抛出异常后不能处理。Lock.lock()在finally中清理
原子性:原子操作不需要同步
Java i++不是原子操作有读和写
临界区:同步控制块 synchronize(object){}
防址共享资源的冲突:还可以用线程本地存储根除对变量的共享
线程状态
1:新建:创建时短暂,分配资源和初使化后不为
2:就绪:只要分配时间片就可以运行
3:阻塞:有条件在阻止他只到就绪态才有可能执行
4:dead 从run返回
阻塞:1 sleep:
2:调用wait使线程挂起,直道线程得到notify消息
3:
等待i/o 4:等待对象锁
同步互斥:
用锁同步两个任务使一个任务不会干涉另一个任务的资源
互斥:使任一时刻只有一个任务可以访问这项资源
线程协作:不是干涉而是协调
像盖房子先有地基再有上面
使用wait和notify:
Wait 将任务挂起对象上的锁被释放而sleep() 和yield()不释放
Notify()从wait()中恢复,可以在锁中调用wait() 其它任务点用资源
正常锁只允许(lock syncronized)一个任务访问资源,而semaphor 允许n个任务访问这个资源