爱的传递,希望能帮到更多的人。
所有的编程语言的最终目的都是提供一种“抽象”方法。抽象的层次越高,越接近人的思维。越接近人的思维,越容易使用。
越高级的语言越容易学习;当然,这只意味着容易入门;不意味着成为高手越容易,高手仍然需要修炼。
Java的核心优势:跨平台。 跨平台是靠JVM(虚拟机)实现的。
Java各版本的含义:
JavaSE(Java Standard Edition)标准版,定位在个人计算机的应用。
JavaEE(Java Enterprise Edition)企业版,定位在服务器端的应用。
JavaME(Java Micro Edition)微型版,定位在消费电子产品的应用。
Java程序的开发运行过程为:编写代码、编译、解释运行。
JDK用于开发Java程序,JRE是Java运行环境; JVM是JRE的子集,JRE是JDK的子集。
JDK配置,需要新建JAVA_HOME环境变量;需要修改Path环境变量。
Java是面向对象的语言,所有代码必须位于类里面。main方法是Java应用程序的入口方法。
常见的Java集成开发环境有三个:eclipse、IntelliJ IDE、 NetBeans。
项目 | value |
---|---|
单行注释 | // |
多行注释 | /…/ |
文档注释 | /**…*/ |
标识符的命名规则: |
---|
1. 标识符必须以字母、下划线_、美元符号$开头。 |
2. 标识符其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。 |
3. Java 标识符大小写敏感,且长度无限制。 |
4. 标识符不可以是Java的关键字。 |
标识符的命名规范 |
---|
表示类名的标识符:每个单词的首字母大写,如Man, GoodMan |
表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如eat(), eatFood()。 |
变量的声明格式:
type varName [=value] [,varName[=value]...];
变量的分类:局部变量、实例变量、静态变量。
常量的声名格式:
final type varName = value ;
Java的数据类型可分为基本数据类型和引用数据类,基本数据类型的分类如下:
项目 | value |
---|---|
整型变量: | byte、short、int、long |
浮点型: | float、double |
字符型: | char |
布尔型: | boolean,值为true或者false。 |
项目 | value |
---|---|
算术运算符: | +,-,*,/,%,++,- - |
赋值运算符: | = |
扩展赋值运算符: | +=,- =,*=,/= |
关系运算符: | >,<,>=,<=,==,!= ,instanceof |
逻辑运算符: | &&,!, |
位运算符: | &,^,~ , >>,<<,>>>, |
字符串连接符: | + |
条件运算符: | ?: |
项目 | value |
---|---|
自动类型转换: | 容量小的数据类型可以自动转换为容量大的数据类型。 |
强制类型转换: | 用于显式的转换一个数值的类型,语法格式:(type)var 。 |
序号 | Value |
---|---|
(1) | if单选择结构 if-else双选择结构 if - else if - else多选择结构。 |
(2) | switch多选择结构。 |
序号 | Value |
---|---|
(1) | 循环结构 |
(2) | 当型:while与for |
(3) | 直到型:do-while |
while与do-while的区别,在布尔表达式的值为false时while的循环体一次也不执行,而do-while至少执行一次。
break可以在switch与循环结构中使用,而continue只能在循环结构中使用。
方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数。
方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。
任何能用递归解决的问题也能使用迭代解决。在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。
面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
对于一个类来说,一般有三种常见的成员:属性field、方法method、构造器constructor。
构造器也叫构造方法,用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。
Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解。Java程序员可将更多的精力放到业务逻辑上而不是内存管理工作,大大提高开发效率。
this的本质就是“创建好的对象的地址”! this不能用于static方法中。
在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。在static方法中不可直接访问非static的成员。
Java方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。
通过package实现对类的管理;如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用。
· 高级语言可分为:面向过程和面向对象两大类。
1. 面向过程与面向对象都是解决问题的思维方式,都是代码组织的方式。
2. 解决简单问题可以使用面向过程。
3. 解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程。
· 对象和类的关系是特殊到一般,具体到抽象的关系。
· 栈内存:
1. 每个线程私有,不能实现线程间的共享!
2. 局部变量放置于栈中。
3. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
· 堆内存:
1. 放置new出来的对象!
2. 堆是一个不连续的内存空间,分配灵活,速度慢!
· 方法区:
1. 被所有线程共享!
2. 用来存放程序中永远是不变或唯一的内容(类代码信息、静态变量、字符串常量)。
· 属性用于定义该类或该类对象包含的数据或者说静态属性。属性作用范围是整个类体。Java使用默认的值对其初始化。
· 方法则用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。
· 构造器又叫做构造方法(constructor),用于构造该类的实例。Java通过new关键字来调用构造方法,从而返回该类的实例,是一种特殊的方法。
· 垃圾回收机制:
1. 程序员无权调用垃圾回收器。
2. 程序员可以通过System.gc()通知垃圾回收器(Garbage Collection,简称GC)运行,但是Java规范并不能保证立刻运行。
3. finalize方法,是Java提供给程序员用来释放对象或资源的方法,但是尽量少用。
· 方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。 调用时,会根据不同的参数表选择对应的方法。
· this关键字的作用:
1. 让类中的一个方法,访问该类的另一个方法或属性。
2. 使用this关键字调用重载构造方法,可以避免相同的初始化代码,只能在构造方法中用,并且必须位于构造方法的第一句。
· static关键字:
1. 在类中,用static声明的成员变量为静态成员变量,也称为类变量。
2. 用static声明的方法为静态方法。
3. 可以通过对象引用或类名(不需要实例化)访问静态成员。
· package的作用:
1. 可以解决类之间的重名问题。
2. 便于管理类:合适的类位于合适的包!
· import的作用:
1. 通过import可以导入其他包下面的类,从而可以在本类中直接通过类名来调用。
· super关键字的作用:
1. super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
· 面向对象的三大特征:继承、封装、多态。
· Object类是所有Java类的根基类。
· 访问权限控制符:范围由小到大分别是private、default、protected、public。
· 引用变量名 instanceof 类名 来判断该引用类型变量所“指向”的对象是否属于该类或该类的子类。
· final关键字可以修饰变量、修饰方法、修饰类。
· 抽象类是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩展,使用abstract修饰。
· 使用abstract修饰的方法为抽象方法必须被子类实现,除非子类也是抽象类。
· 使用interface声明接口:
1. 从接口的实现者角度看,接口定义了可以向外部提供的服务。
2. 从接口的调用者角度看,接口定义了实现者能提供哪些服务。
· 内部类分为成员内部类、匿名内部类和局部内部类。
· String位于java.lang包中,Java程序默认导入java.lang包。
· 字符串的比较"=="与equals()方法的区别。
Error与Exception都继承自Throwable类
Error类层次描述了Java运行时系统内部错误和资源耗尽错误。
Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。
常见的异常类型:
--ArithmeticException
--NullPointerException
--ClassCastException
--ArrayIndexOutOfBoundsException
--NumberFormatException
方法重写中声明异常原则:子类声明的异常范围不能超过父类声明的范围。
异常处理的三种方式:
--捕获异常:try-catch-finally
--声明异常:throws
自定义异常类只需从Exception类或者它的子类派生一个子类即可。
数组是相同类型数据的有序集合。
数组的四个基本特点:
-- 其长度是确定的。
-- 其元素必须是相同类型。
-- 可以存储基本数据类型和引用数据类型。
-- 数组变量属于引用类型。
一维数组的声明方式:
-- type[] arr_name; (推荐使用这种方式)
-- type arr_name[]。
数组的初始化:静态初始化、动态初始化和默认初始化。
数组的长度:数组名.length,下标的合法区间[0,数组名.length-1]。
数组拷贝:System类中的static void arraycopy(object src,int srcpos,object dest, int destpos,int length)方法。
数组操作的常用类java.util.Arrays类:
-- 打印数组:Arrays.toString(数组名);
-- 数组排序:Arrays.sort(数组名);
-- 二分查找:Arrays.binarySearch(数组名,查找的元素)。
二维数组的声明:
-- type[][]arr_name=new type[length][];
-- type arr_name[][]=new type[length][length]。
每一个基本数据类型对应一个包装类。
包装类的用途:
(1)作为和基本数据类型对应的引用类型存在,方便涉及到对象的操作。
(2)包含每种基本数据类型的相关属性如最大值、最小值以及相关的操作方法。
JDK1.5后在Java中引入自动装箱和拆箱。
字符串相关类String、StringBuffer与StringBuilder:
String:不可变字符序列。
StringBuffer:可变字符序列,并且线程安全,但是效率低。
StringBuilder:可变字符序列,线程不安全,但是效率高(一般用它)。
日期与时间类Date、DateFormat、SimpleDateFormat、Calendar、GregorianCalendar。
Math类的常用方法:
pow(double a,double b)
max(double a,double b)
min(double a,double b)
random()
long round(double a)
与操作文件相关的File类。
当需要定义一组常量时,使用枚举类型。
Collection 表示一组对象,它是集中、收集的意思,就是把一些数据收集起来。
Collection接口的两个子接口:
1) List中的元素有顺序,可重复。常用的实现类有ArrayList、LinkedList和 vector。
Ø ArrayList特点:查询效率高,增删效率低,线程不安全。
Ø LinkedList特点:查询效率低,增删效率高,线程不安全。
Ø vector特点:线程安全,效率低,其它特征类似于ArrayList。
2) Set中的元素没有顺序,不可重复。常用的实现类有HashSet和TreeSet。
Ø HashSet特点:采用哈希算法实现,查询效率和增删效率都比较高。
Ø TreeSet特点:内部需要对存储的元素进行排序。因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。
实现Map接口的类用来存储键(key)-值(value) 对。Map 接口的实现类有HashMap和TreeMap等。Map类中存储的键-值对通过键来标识,所以键值不能重复。
Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
类 java.util.Collections 提供了对Set、List、Map操作的工具方法。
如下情况,可能需要我们重写equals/hashCode方法:
1) 要将我们自定义的对象放入HashSet中处理。
2) 要将我们自定义的对象作为HashMap的key处理。
3) 放入Collection容器中的自定义对象后,可能会调用remove、contains等方法时。
JDK1.5以后增加了泛型。泛型的好处:
1) 向集合添加数据时保证数据安全。
2) 遍历集合元素时不需要强制转换。
按流的方向分类:
输入流:数据源到程序(InputStream、Reader读进来)。
输出流:程序到目的地(OutPutStream、Writer写出去)。
按流的处理数据单元分类:
字节流:按照字节读取数据(InputStream、OutputStream)。
字符流:按照字符读取数据(Reader、Writer)。
按流的功能分类:
节点流:可以直接从数据源或目的地读写数据。
处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。
IO的四个基本抽象类:InputStream、OutputStream、Reader、Writer
InputStream的实现类:
FileInputStream
ByteArrayInutStream
BufferedInputStream
DataInputStream
ObjectInputStream
OutputStream的实现类:
FileOutputStream
ByteArrayOutputStream
BufferedOutputStream
DataOutputStream
ObjectOutputStream
PrintStream
Reader的实现类:
FileReader
BufferedReader
InputStreamReader
Writer的实现类:
FileWriter
BufferedWriter
OutputStreamWriter
把Java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为Java对象的过程称为对象的反序列化。
程序:Java源程序和字节码文件被称为“程序(Program)”,是一个静态的概念。
进程:执行中的程序叫做进程(Process),是一个动态的概念。每个进程由3部分组成:cpu、data、code。
线程:是进程中一个“单一的连续控制流程 (a single sequential flow of control)”。
在Java中实现多线程的方式:
▪ 继承Thread类实现多线程
▪ 实现Runnable接口实现多线程
线程的状态:
▪ 新生状态
▪ 就绪状态
▪ 运行状态
▪ 死亡状态
▪ 阻塞状态
暂停线程执行的方法:
▪ sleep()
▪ yield()
▪ join()
实现线程同步的两种方式:
▪ synchronized 方法 :
public synchronized void accessVal(int newVal);
▪ synchronized 块:
synchronized(syncObject)
{
//允许访问控制的代码
}
同步解决问题的另一种典型方式:生产者/消费者模式。
线程通信的方法:
▪ wait()
▪ notify()
▪ notifyAll()
都是Object类的方法,只能在同步方法和同步代码块中使用。
端口是虚拟的概念,并不是说在主机上真的有若干个端口。
在www上,每一信息资源都有统一且唯一的地址,该地址就叫URL(Uniform Resource Locator),它是www的统一资源定位符。
TCP与UDP的区别:
1)TCP是面向连接的,传输数据安全,稳定,效率相对较低。
2)UDP是面向无连接的,传输数据不安全,效率较高。
Socket通信是一种基于TCP协议,建立稳定连接的点对点的通信。
网络编程是由java.net包来提供网络功能。
1)InetAddress:封装计算机的IP地址和DNS(没有端口信息!)。
2)InetSocketAddress:包含IP和端口,常用于Socket通信。
3)URL:以使用它的各种方法来对URL对象进行分割、合并等处理。
基于TCP协议的Socket编程和通信:
1)“请求-响应”模式:
--Socket类:发送TCP消息。
--ServerSocket类:创建服务器。
UDP通讯的实现:
1)DatagramSocket:用于发送或接收数据报包。
2)常用方法:send()、receive()、 close()。
DatagramPacket:数据容器(封包)的作用。
1)常用方法:构造方法、getAddrress(获取发送或接收方计算机的IP地址)、getData(获取发送或接收的数据)、setData(设置发送的数据)。