java参考大全笔记@vampire
java基础知识
- java数据类型(8个基本数组类型分为4组):
整型:byte、short、int、long。
字符型:char 。
浮点型:float、double 。
布尔型:boolean。 - java控制台基本输出:print()不换行输出、println()换行输出
- 程序块:两个或两个以上的语句组成一组{}->逻辑单元->存在的主要原因:创建逻辑上独立的代码单元
- java组成:
空白分隔符:空格、tab键、换行符。
标识符:大写和小写字母、数字、下划线、美元符号的任意顺序组合,不能以数字开头,区分大小写。
注释:多行注释/…/、单行注释//、文档注释/**…*/。
文字
运算符
关键字:48个保留关键字,不能用于变量名、类名或方法名
分隔符:常用分隔符如下
符号 | 名称 | 用途 |
---|---|---|
() | 圆括号 | 在定义和调用方法是用来容纳参数表。在控制语句或强制类型转换组成的表达式中用来表示执行或计算的优先权 |
{} | 花括号、大括号 | 用来包括自动初始化的数组的值。也用来定义程序块、类、方法以及局部范围 |
[] | 方括号、中括号 | 用来声明数组的类型,也用来表示撤销对数组值的引用 |
; | 分号 | 用来终止一个语句 |
, | 逗号 | 在变量声明中,用于分割变量表中的各个变量。在for控制语句中,用来将圆括号内的语句连接起来 |
. | 句号 | 用来将软件包的名字与它的子包或类分隔。也用来将引用变量与变量或方法分隔 |
-
java中三个最基本的元素:数据类型、变量和数组
-
整数类型的长度是行为而非占用的存储空间
-
java的自动转换:
-这两种类型是兼容的
-目的类型属的范围比来源类型的大 -
一维数组定义:第一步定义类型,第二步new分配内存
-
type var-name[]; array-var=new type[size]; 例1:int month_days[]; month_days=new int[12]; 例2:int month_days=new int[12];
-
多维数组定义只需指定第一个(最左边)维数的内存即可。
-
左移运算符 value<<num,高位移出,右边补0.左移一位相当于乘2
-
右移运算符 value>>num,被移走的最高位由原来最高位的数字补充,每右移一次相当于除2并舍弃余数
-
标签break语句:break lable;lable是表示代码块的标签,被加标签的代码块必须包围break语句。要指定代码块在其开头加一个标签即可,标签lable可以是任何合法有效的Java标识符后跟一个冒号
-
标签continue语句:continue lable;指定一个标签来说明继续哪个包围的循环。
-
关于类:给对象引用变量赋值,当你将一个对象引用变量赋值给另一个对象引用时,你并没有创建该对象的一个拷贝,而是仅仅对引用的一个拷贝。
-
类通常有两个要素组成:实例变量和方法
-
在类中,当一个实例变量不是被该实例变量所在类的部分代码访问时,tabixv
通过该对象加点运算符来访问。 -
对于返回值的理解,有两点注意:
a.方法返回的数据类型必须与该方法指定的返回类型相兼容。
b.接受方法返回值的变量也必须与指定方法返回值的类型相兼容 -
构造函数的任务就是初始化一个对象的内部状态,以便使创建的实例变量能够完全初始化,可以被对象马上使用。
-
java传递参数的两种方法:
第一种按值传递:将一个参数值复制成为子程序的正式参数。对子程序参数的改变不影响调用它的参数
第二种引用调用:参数的引用被传递给子程序参数。在这种方法中,该引用用来访问调用中指定的实际参数。对子程序参数的改变将会影响调用子程序的参数 -
递归优点:某些类型的算法采用递归比采用迭代算法要更加清晰和简单
-
如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象
-
声明为static的变量实质上就是全局变量
-
声明为static的方法有以下几条限制
它们仅能调用其他的static方法
它们只能访问static数据
它们不能以任何方式引用this或super -
在一个static方法中引用任何实例变量都是非法的
-
类外访问static方法:classname.method();
-
final变量:阻止它的内容被修改
-
一个内部类可以访问外部类成员,反之不成立
-
String类型的对象是不可改变的;原因有两个:
如果你需要改变一个字符串,你可以创建一个新的字符串,其中包含修改后的字符串即可。
JAVA定义了一个和String类同等的类叫StringBuffer,它允许字符串改变,因此所有正常的字符串操作在Java中还是可用的 -
在String类中,可以使用charAt()来获得一个字符串指定索引的字符
-
如果想在运行程序时将信息传递到一个程序中,可以通过将命令行参数传递给main()来实现
-
在java中,被继承的类超类,继承超类的类叫子类
-
一个被定义为private的类成员为此类私有,它不能被该类外的所有代码访问,包括子类
-
当一个子类对象的引用被赋给一个超类引用变量时,只能访问超类定义的对象的那一部分
-
super的两种通用形式:
- 第一种调用超类的构造函数:super(parameter-list(超类中构造函数所用到的所有参数))
- 第二种用来访问被子类的成员隐藏的超类成员: super.member(方法或变量)
- super()总是引用子类最接近的超类的构造函数,依次调用
- 组成层次结构的类的构造函数以派生的顺序被调用
- 方法重载构成java的一个最强大的概念的基础:动态方法调度。
- 动态方法调度是一种在运行时而不是编译时调用重载方法的机制。
- 使用final可以阻止方法重载和继承
- Java定义的特殊的类Object。所有其他的类都是Object的子类。Object定义了下面的方法
方法 | 用途 |
---|---|
Object clone() | 创建一个和被复制的对象完全一样的新对象 |
boolean equals(Object object) | 判定对象是否相等 |
void finalize() | 在一个不常用的对象被使用前调用 |
Class getClass() | 获取运行时一个对象的类 |
int hashCode | 返回调用对象有关的散列值 |
void notify | 恢复一个等待调用对象线程的执行 |
void notifyAll | 恢复所有等待调用对象线程的执行 |
String toString() | 返回描述对象的一个字符串 |
void wait() | 等待另一个线程的执行 |
void wait(long milliseconds) | |
void wait (long milliseconds, int nanoseconds) |
- java源程序可以包含下面的四个内部部分的任何一个(或所有)
- 单个接口声明(可选)
- 任意数目的引入语句(可选)
- 单个公共类声明(必选)
- 对包来说是私有的任意数目的类(可选)
- 当实现一个借口方法时,它必须声明成public。
- 如果一个类包含一个接口但是不完全实现接口定义的方法,那么该类必须定义成abstract型。
- 接口中的变量:可以使用接口来引入多个类的共享变量,这样做只需要简单的声明包含变量初始化想要的值的接口就可以了。
- 接口通过运用关键字extends被其他接口继承。
- 线程优先级是详细说明线程间优先关系的整数。
- 线程的优先级是用来决定何时从一个运行的线程切换到另一个 ——上下文转换。
- 决定上下文转换发生的规则:
- 线程可以自动放弃控制,在I/O未决定的情况下,睡眠或阻塞由明确的让步来完成。在这种假定下,所有其他的线程被检测,准备运行的最高优先级线程被授予CPU。
- 线程可以被高优先级线程抢占。在这种情况下,低优先级线程不主动放弃,处理器只是被先占——无论它在干什么——处理器被高优先级的线程占据。基本上一旦高优先级线程要运行,它就执行,这叫做有优先级的多任务处理。
- 管程:可以用来防止共享的资源被多个线程操纵
- 管理线程的方法
方法 | 意义 |
---|---|
getName | 获得线程名称 |
getPriority | 获得线程优先级 |
jsAlive | 判定线程是否仍在运行 |
join | 等待一个线程终止 |
run | 线程的入口点 |
sleep | 在一段时间内挂起线程 |
start | 通过调用运行方法来启动线程 |
- 当java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程。
- 主线程的重要性体现在两方面:
- 它是产生其他子线程的线程
- 通常它必须最后完成执行,因为它执行各种关闭动作
- 主线程可以由Thread对象控制:通过调用方法currentThread()获得它的一个引用。s attic Thread currentThread( ),该方法返回一个调用它的线程的引用,一旦获得主线程的引用,就可以控制主线程。
- 一个线程组是一种将线程作为一个整体集合的状态哦更值得数组结构。这个过程由专有的运行时环境来处理。
- 大多数情况通过实例化一个thread对象来创建一个线程,Java定义了两种方式:
- 实现Runnable接口
- 可以继承Thread类
- 实现Runnable接口,一个类仅需实现一个run()的简单方法:public void run( )。在run()中可以定义代码来构建新的线程,不同的是run()在程序中确立另一个并发的线程执行入口。当run()返回时,该线程结束。
- 当一个类继承Thread时,它必须重载run()方法,作为新线程的入口。
- 判定一个线程是否结束有两种方法:第一种,可以在线程中调用isAlive():final boolean isAlive()。如果所调用线程仍在运行,返回true,否则返回false。第二种,调用join(),该方法更常用:final void join()throws InterruptedException。该方法等待所调用线程结束。
- 线程优先权level值必须在MIN_PRIORITY到MAX_PRIOIRITY范围内,通常分别是1和10。
- Java获得跨平台的线程行为的方法是自动放弃对cpu的控制。
- 同步:当两个或两个以上的线程需要共享资源,他们需要某种方法来确定资源在某一刻仅被一个线程占用。
- java中的同步方法:调用被synchronized关键字修饰的方法。或使用synchronized语句。
- 为避免轮询,java包含了通过wait(),notify(),notifyAll()方法实现的一个进程间通信,这三个方法仅在synchronized方法中才能被调用。
- wait()告知被调用的线程放弃管程进入睡眠直到其他线程进入相同管程并且调用notify()。
- notify()恢复相同对象中第一个调用wait()的线程
- notifyAll()恢复相同对象中所有调用wait()的线程,最优最高优先级的线程最先运行。
- java定义了两种类型的流:字节类和字符类
- 字节流类:在顶层有两个抽象类:InputStream和OutputStream。
- 字符流类:顶层有两个抽象类:Reader和Writer
- 键盘输入:BufferReader br=new BufferedReader(new InputStreamReader(System.in)); String c=br.read();
- 从键盘读取字符串使用readLine()。
- print()和println()是由PrintStream(System.out引用的对象类型)定义。
- PrintWriter是基于字符的类,支持所有类型(包括Object)的print()和println()方法
PrintWriter(OutputStream outputStream,boolean flushOnNewline);
// outputStream是OutputStream的类的对象,flushOnNewline控制java是否在println()方法被调用时刷新输出流。
e.g. PrintWriter pw=new PrintWriter(System.out,true);
- 当从一个数组创建一个String对象时,数组的的内容将被复制,在字符串被创建以后,如果改变数组的内容,String将不会随之改变。
- 重载toString方法会被自动调用
- charAt():字符串截取一个字符
- getChars(int start, int end, char target[],int targetstart):截取从start—end的多个字符存在target[]中。必须确保数组target应该足够大以确保能容纳被指定子字符串中的字符
- getBytes():实现将字符存放于字节数组中的getChars()的替代,它适用平台提供的默认的字符到字节的转换:byte[] getBytes();
- regionMatches()方法将一个字符串中指定的区间和另一个字符串中指定的区间进行比较。它的重载形式允许比较时忽略大小写。
- equals()方法比较字符串对象中的字符,==运算符比较两个对象引用看他们是否引用相同的实例。
- 在StringBuffer中,length()方法可以得到当前的长度,capacity()可以得到总的分配容量。ensureCapacity()设置缓冲区大小。insert()插入字符串。deleteCharAt()删除单个字符。
- 抽象类Number定义了一个由包装数字类型字节型、短整型、整型、长整型、浮点型和双精度型的类实现的超类。
- 浮点对象可以由类型float或类型double的值创建,也能由浮点数的字符串表达式创建
- 双精度对象可以被双精度值或包含了浮点值的字符串创建
- 字节型、短整型、整型和长整型对象可以被原类型值或包含了原类型的字符串创建
- 字符Character是围绕字符型char的一个简单的包装器。构造函数:Character(char ch);ch指定了被创建的字符(Character)对象所包装的字符。
- 抽象类Process封装了一个进程(process)——也就是说一个正在执行的程序。它主要被当作由Runtime类中的exec()方法所创建的对象的类型的超类。
- Runtime类封装了运行时环境,一般不实例化。可以通过调用静态方法Runtime.getRuntime()获得对当前Runtime对象的引用。
- Runtime类的两个最普遍的用法:内存管理和执行附加进程
- System类保存静态方法和变量的集合。
- Class封装对象或接口运行时的状态。
- 抽象类ClassLoader规定了类是如何加载的。
- Math定义了两个双精度常数:E(近似为2.72)和PI(近似为3.14)
- ThreadGroup:线程组创建了一组线程,定义了两个构造函数:
ThreadGroup(String groupName)
ThreadGroup(ThreadGroup parentOb,String groupName)
- ThreadLocal:用于创建线程局部变量,每个线程都拥有自己局部变量的拷贝,
- Inheritable ThreadLocal:创建可以被继承的线程局部变量
- SecuirityManeger是一个子类可以实现的抽象类,它用于创建一个安全管理程序。
- Comparable接口:实现Comparable的类的对象可以被排序
- Collection接口是构造类集框架的基础。他声明所有类集都将拥有的核心方法。
- 类集框架定义的接口:Collection、List、Set、SortedSet。
- SortedSet接口扩展了Set并说明了按升序排列的集合的特性。
- 标准的Collection类总结
- 在ArrayList类中可以使用trimToSize方法减小在ArrayList对象之下的数组的大小。
- 为什么可能想将类集转换成为数组的原因:
- 对于特定的操作,可以获得更快的处理时间
- 为了给方法传递数组,而方法不必重载去接受类集
- 为了将新的基于类集的程序与不认识类集的老程序集成
- HashSet扩展AbstractSet并且实现Set接口。它创建一个类集,该类集使用散列表进行存储。散列表通过使用称之为散列法的机制来存储信息。在散列中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码。而散列码被用来当作与关键字相连的数据的存储下标。
- TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储。
- 使用迭代函数循环通过类集的内容,步骤如下:1.通过调用类集的iterator()方法获得对类集头的迭代函数。2.建立一个调用hasNext()方法的循环,只要hasNext()返回True,就进行循环迭代。3.在循环内部,通过调用next()方法来得到每一个元素。
- 列表如何被反向显示:在列表被遍历到末端后,列表指针指向末端,hasNext()返回false。使用hasPrevious()反向遍历。
- map中关键字必须是唯一的。
- 映射不是类集,但可以获得映射的类集“视图”。使用entrySet()方法,他返回一个包含了映射种元素的集合(Set)。为了得到关键字的类集“视图”可以使用keySet()方法。得到值类集“视图”可以使用values()方法。
- SortedMap接口扩展了Map,它确保了各项按关键字升序排序。
- 排序映射允许对子映射进行高效的处理。
- 属性Properties是Hashtable的一个子类,它用来保持值的列表,在其中关键字和值都是字符串。可以利用store()和load()方法方便地对包含在属性对象中的信息进行存储或从盘中装入信息。
- BitSet类创建一个专用类型的数组,该数组包含位的值。大小可按需增加
- Random中的nextGaussian()方法返回中心在0.0,标准偏差为1.0的double值,这就是著名的钟型曲线。
- Observable类用于创建可以观测到你的程序中其他部分的子类。观测类必须实现定义了update()方法的Observer接口。
- 一个被观测的对象必须服从下面的两个简单规则:第一,如果它被改变了,它必须调用setChanged()方法。第二,当它准备通知观测程序它的改变时,它必须调用notifyObservers()方法。
- Timer是一个用于安排一个将来执行的任务的类。被安排的任务必须是TimerTask的一个实例.
- 在缓冲器中使用mark()是受限的,意思是你只能给mark()定义一个小于流缓冲大小的参数。
- PushbackInputStream(推回输入流)。Pushback用于输入流允许字节被读取然后返回到流,提供了unread()方法。
- SequenceInputStream构造函数要么是用一对InputStream,要么用InputStream的一个Enumeration。
- flush()方法可以用来确保数据缓冲器确实被写到实际的输出流。
- 序列化是把一个对象的状态写入一个字节流的过程。
- 只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。Serializable接口没有定义任何成员,它只是用来表示一个类可以被序列化。
- writeObject()方法被称为序列化一个对象。
第十八章 网络
- TCP/IP套接字用于在主机和Internet之间建立可靠的、双向的、持续的、点对点的流式连接。
- 小应用程序只建立回到下载它的主机的套接字连接。存在这个限制的原因是:穿过防火墙的小应用程序有权使用任何机器是很危险的事情。
- ServerSocket有一个额外的accept()方法,该方法是一个等待客户开始通信的模块化调用,然后以一个用来与客户通信的常规Socket返回。
- MimeHeader.java: MIME是通过电子邮件系统传达多媒体内容的一个Internet标准。该类是Hashtable的一个子类,能够方便地存储的检索与MIME标头有关的关键字/值对。
- HttpResponse.java:HttpResponse类是所有与HTTP服务器应答有关的事物的包装程序。它被httpd类的代理部分使用
- UrlCacheEntry.java:为在服务器上保存文档的内容,必须在用于找回文档的URL和文档自身描述之间建立联系。
- LogMessage.java:是一个简单的接口,它只定义了一个方法log(),该方法只有一个String型参数。
- java通过两个类实现UDP可以顶层的数据报:DatagramPacket对象是数据容器,DatagramSocket是用来发送和接收DatagramPackets的机制。
第十九章 Applet类
- repaint()方法使得AWT的实时运行环境执行对小应用程序的update()方法的调用。
第二十章 事件处理
- 在授权事件模型中,监听器为了接受一个事件通知必须注册。
- 在授权事件模型中,一个事件是一个描述了事件源的状态改变的对象。一个事件源是一个产生事件的对象。一个事件监听器是一个在事件发生时被通知的对象。
第二十一章 介绍AWT
- Component类是一个封装了一个可视组件的所有属性的抽象类,在屏幕上显示的所有用于用户交互的用户界面元素都是Component类的子类。
- 一个panel对象可以被看作是一个递归嵌套的具体的屏幕组件。
- 绘图模式决定了对象是如何被画在窗口中的。异或模式的优点是新的对象总是可以保证被看见。
第二十二章 使用AWT
- lable(String str, int how),how决定了对齐方式:label.LEFT,Lable.RIGHT或Lable.CENTER
- setEchoChar来禁止字符的回显,例如密码。
第二十三章
- 图像操作:创建图像、加载图像和显示图像
- ImageObserver是一个接口,当图像被生成时用来接收消息。
- 如果ImageUpdate()方法完成了加载,将返回false,如果还有图像要处理,则返回true。
- 使用画面外图像来减少闪动的方法叫做双缓冲。
- ImageProducer是一个用于生成图像数据对象对的接口。
- MemoryImageSource是用来从数据数组中生成新的图像的类。
- ImageConsumer是用于从图像中提取像素数据,并将这些数据以另一种数据类型方式表示出来的抽象接口。