您的位置:首页 > 编程语言 > Java开发

java编程思想笔记

2012-09-24 11:32 225 查看
第一章对象入门

将一条消息发给一个对象,并不知道对方的具体类型,但确能采取正确的行动叫多态

动态绑定实现多态 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个任务访问这个资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: