java知识宝库
前言
撰写本文的目的:
1.呈现java方面的知识点;
2.指导同学们循序渐进学习java知识;作者QQ:78638703@qq.com。
第一节 javaSE相关知识
语法规则(Java4版本之前的):
结构化程序语法,与类、抽象类、接口、内部类((静态)成员类、局部类、匿名类)、包有关的语法;
语法规则(Java5、Java6、Java7发布的新语法特性),主要如下,这里用#作为标志:
#泛型Generic(java5新特性)
本质:参数化类型对象(断句为:参数化、类型、对象) | ||
种类 | 泛型类 | 定义方式如下 publicclass GenericsFoo<T> { private T x; public GenericsFoo(T x) {this.x = x;} public T getX() {returnx;} publicvoid setX(T x) {this.x = x;} }
泛型类被定义后,如果指定< >内的具体类型名,这个表达式可以有以下用途:(参见新特性) (0)定义对象 List<String> a=new ArrayList<String>(); // ArrayList<String> b=new ArrayList<String>() (1)作为方法参数的类型; void printListOfStrings(List<String> list, PrintStream out) (2)作为方法的返回类型 List<String> getListOfStrings() {} (3)作为类型参数。即指定具体类型名时,仍然继续用泛型来指定 Map<String,List<String>> map = new HashMap<String, List<String>>(); (4)在遍历中使用 for (Iterator<String> i = listOfStrings.iterator(); i.hasNext();) {String s = i.next();} |
泛型接口 | 与“泛型类”相似 | |
泛型方法 | 泛型方法即是对方法中的参数进行泛型时,可以仅将泛型参数列表置于返回值前,而不是置于“类名后面”,这样该参数只作用于某方法而不影响整个类。如: public <T> void f(T x) //<T>若移到类名后去,则是“泛型类” {System.out.println(x.getClass().getName());} | |
高级应用 | 限制类型参数 | extends限制;supper限制; 如:class Foo<T extends Collection> |
通配符?泛型 | ?只能用于声明句柄处 class User extends ArrayList<String> {} class Foo<T extends User> { void fun() { Foo<? extends User> f = new Foo<User>();//声明了f句柄 } } | |
扩展泛型类、接口时的写法 | 根据继承时, 是否指定具体类型, 来分情况 | 1.class UserArrayList1 extends ArrayList{} 默认会用Object去配置父类ArrayList中的参数 2.class UserArrayList2 extends ArrayList<String>{} 子类指定了用String类去配置父类的类型参数; 3.class UserArrayList3<T> extends ArrayList<T>{} 子类继续用泛型名来,一旦指定了子类的T的具体类型,它将向父类传递 |
泛型时,依然存在不得不使用强制转换的情况 | 即当被调用方法返回值的内部“类型参数”不能确定时。 强制转换可能发生失败而报运行异常。 这种情况普遍存在。如hibernate的Query.list()方法返回List对象,该对象的内部元素“类型”不可知。 | |
示例: class Test { List fun() { //此处被警告 ArrayList<Integer> a = new ArrayList<Integer>(); a.add(new Integer(7)); a.add(new Integer(8)); return a; } void pun() { List<Integer> b = fun();//此处被警告。进行了强制转换。 //fun()返回的List的内部元素类型未知 for (Integer i : b) {System.out.println(i);} } publicstaticvoid main(String args[]) { new Test().pun(); } } 若想消除警告,解决办法是:修改List fun(){}为List<Integer> fun(){} |
#泛型实例化类型自动推断。比如List<String> tempList = new ArrayList<>();(java7新特性)
#语法上支持集合,而不一定是数组。比如final List<Integer> piDigits = [ 1,2,3,4,5,8 ]; (java7新特性)
#注释:Annotation(java5新特性)
标准注释:@Deprecated、@Override、@SuppressWarnings、@Target、@Retention; |
自定义注释(包括第三方注释):如junit的@test,hibernate的@Entity、@Table、@Id等; |
#枚举:enum关键字(java5新特性,对早期的枚举功能加强了)
其values()方法可得到枚举数组,之后便可利用.length或利用增强的for循环来遍历取得枚举元素。 |
类库中同时增加了类EnumSet、EnumMap。 |
#自动装箱与拆箱(autoboxing/unboxing):Primitive类型与Wrapper类型在语法级别的自动转换。
#可变参数:重载方法的另一种形式。由于可变参数列表会被当成数组对待,因此可以调用.length属性。
#增强型for循环
用途一:遍历数组。排除了使用数组的.length属性 |
用途二:遍历集合对象。排出了使用集合的iterator对象 |
#静态导入:import static。(1)导入静态成员;(2)导入静态枚举类型对象;
#switch语句中可以使用字串了(java7新特性)
Jvm的一些机制:即java虚拟机的运行特征
jdk工具集:包括可执行程序java, javac, javadoc, jar, javah, javap, jdb等
反射:Class、Object、Field、Constructor、Method等类。(是开发框架的基础)
加载器:java.lang.ClassLoader、java.lang.Class 类。注意 Class.forName(…)和ClassLoader.loadClass(…)的区别
创建实例的各种办法
一 | new 类型名() |
| 耦合性高 |
二 | Class.forName("类型名").newInstance(); 注:步骤分为 (1)获取“类对象”Class.forName("类型名") (2)用“类对象”调用newInstance()方法 | 只能调用无参构造器。 | 具灵活性; 降低耦合; |
三 | Constructor.newInstance(对象数组) 注:之前的步骤分为 (1)获取“类对象”Class.forName("类型名").; (2)用“类对象”获取“方法对象”getDeclaredConstructor(…) (3)用方法对象调用newInstance(…)方法 | 可调用有参数的构造器; 甚至调用private构造器。 |
本地化:与其它语言接口(如C语言),native关键字
异常处理:异常处理语法,Throwable, Exception类以及它们的子类
格式化:主要用在文本输出,比如数字、日期、金额。涉及java.util.Formatter、String.format()、System.out.printf()等;
数学运算
Math类的各种功能 |
BigInteger类:任意大整数操作; BigDecimal类:任意大浮点数数操作; |
精确浮点:strictfp关键字; |
安全的加减乘除运算math.XXX()方法(java7新特性) |
字符串常用类
String类 | 内容不可变,且是final类 | 线程安全的 |
Stringbuffer类 | 内容可变 | 线程安全的 |
StringBuilder类(java5新特性) | 内容可变 | 不是线程安全的 |
Pattern类:用于处理正则表达式 Matcher类:用于处理正则表达式 |
|
|
对象克隆:Cloneable接口
对象比较:Comparable接口(常被数组排序所使用)
集合(数组):最顶层Collectiong接口及其子接口、类。(这里所称数组或Array并非基本数据类型的,而是对象)。
Collectiong接口的子接口Set、List、Map是3大高层接口,分别代表着3个大的方面;
java5支持泛型,给集合带来了巨大影响。java5还增加了类Arrays、Queue、PriorityQueue等有用数据类型。
遍历集合的两种方式:
方式一:获取迭代器,然后用迭代器的hasNext()、next()方法来遍历
方式二:利用集合的求大小、取元素的方法。例如List的size()方法可求集合中的元素个数,get(i)方法可取元素。
Set接口只能放不同元素 | HashSet类:哈希表。 | 系统自动计算hashcode |
List接口(有序集合,可放相同元素) | ArrayList类:像数组表,随机访问快 |
|
LinkedList类:链表:适合频繁插入、删除 | 可用于实现队列 | |
迭代器 | Iterator接口:单向迭代器; (Enumeration早期的) | 可调用其他集合对象的工厂方法来取得迭代器 |
ListIterator接口:双向迭代器 | ||
映射:Map接口(key-value键值对) | HashMap类 |
|
TreeMap类 |
| |
向量 | Vector类:不同类型元素共存的变长数组 |
|
堆栈 | Stack类 |
|
嵌入式小程序:APPLET类以及其子类
基础类库、图形窗口界面库:JFC (AWT,SWING,java2D,Accessibility,Drag&Dop等),SWT
名称 | 开发者 | 组件 | 界面风格 | 其它 | 共性 |
AWT | java官方 | 背后藏匿着平台的Native Peer 组件来起作用,即底层是平台相关的。 | 不同操作系统上界面相同 | 组件数量少(最大公约数) | 给Application提供统一的API接口 |
SWING | 容器常采用AWT的,但自身直接调用Java2D画出了许多组件如Table和Tree。 由于Java2D API是平台无关的,因此Swing组件的Java实现代码在每个平台都是一样的。 | 补充了AWT所不具有很多强大组件(最小公倍数) | |||
SWT | IBM | SWT组件本身的Java代码实现部分在各个平台是不同的。 | 目标是与平台界面风格一致 | (最大公约数) |
事件处理模型 | 机制 |
等级事件模型 | 需改写父类的事件处理方法。(这点也强制了必须继承父类组件); 当前组件如果没有处理该事件,则事件消息传到外层组件(容器); |
委托模型(jdk1.1以后引入) | 一个源产生一个事件并将它送到一个或多个监听器Listener(注册了的)那里。 监听器简单的等待,直到收到一个事件,然后处理这个事件,返回相应结果。 |
输入、输出流
InputStream,OutputStream,Reader,Writer及其子类 |
文件、目录管理:java.io.File类 |
文件、目录管理流:.FileInputStream,.FileOutputStream类 |
随即访问文件流:RandomAccessFile类 |
对象串行化/序列化/持久化:ObjectInputStream和ObjectOutputStream类, Serializable接口,transient关键字 |
线程管理
早期 | Tread类,Runnable接口,以及一些线程方法; |
守护线程的创建和使用; | |
互斥、同步机制:synchronized关键字、wait()、notify()、notifyAll()、volatile关键字 | |
java5版本后的线程新特性 | callable接口等 |
新的互斥、同步机制:??? |
网络编程
URL类、URLConnection抽象类、InetAddress类 | |
资源获取 | Applet获取网络图像getImage() |
Applet获取网络声音play()、getAudioClip() | |
获取网络文件资源URL.openStream() | |
套接字通信 (较低层的端口级、字符级编程) | (面向连接TCP/IP)SOCKET通信:ServerSocket类,Socket类 |
(无连接UDP/IP)DatagramSocket通信:DatagramPacket类,DatagramSocket类 |
多媒体编程JMF(操作系统厂商提供扩展包)
Player、Manager、MediaLocator等类,ControllerListener接口以及各种媒体事件。 播放器Player的状态转换。 |
其它: Player.getVisualComponent():能得到媒体内容显示组件(即显示帧图像的布); Player.getControlPanelComponent():能得到控制播放器Player的面板组件(含有播放、暂停、滚动条、音量等按钮) …… |
数据库编程JDBC
相关类:Class类、DriverManager类;Connection、Statement、PreparedStatement、ResultSet等接口 | |
公共数据库访问连接类的开发: 包括一个生成Connection的方法和分别关闭Connection、Statement、PreparedStatement、ResultSet等的方法 | |
DAO设计: Data Access Object | 目的:面向DAO接口编程 |
模式:工厂模式 | |
包括: (1)DAO接口:声明抽象操作 (2)DAO实现类:对DAO接口的实现 (3)DAO工厂类:选择合适的DAO实现类实例返回给调用者,调用者紧接着面向DAO接口编程 | |
ORM(对象关系映射)框架 | 包括Hibernate、ibatis、JPA等等 |
第二节 javaWeb编程相关知识
学习javaWeb之前可能需要了解的:
面向对象、面向关系、面向切面编程的概念 | |||
HTTP协议、TCP/IP协议的简单特征;Web消息生命周期; URL、URI、域名解析等的概念; 静、动态网页的概念,Web2.0的特征; | |||
服务器的简单使用 (如Tomcat) | 虚拟主机的配置:server.xml文件中的相关节点<Host appBase="*" /> 虚拟目录的配置:server.xml文件中的相关节点<Context docBase="*" path="*" /> ???数据访问池的配置 ???Jndi ???其它一些配置 | ||
数据库系统如MySql的使用知识 | |||
HTML5基础、CSS3基础 | |||
集成开发工具Eclipse、MyEclipse(插件辅助功能强大)、NetBean的使用知识; | |||
javaScript | 一种在浏览器上解释执行的语言; 基于对象;但内置对象无法被扩展,即类没有继承的功能,一些有名的库利用其原型特征尽可能的提升了其面向对象的能力; 基础变量类型少,常规语法稍简单。但其解释执行的特点使之具有一些貌似诡异的语法; | ||
Ajax | 核心是可随时向服务器发送请求的XMLHttpRequest对象。Ajax的整个过程以javaScript语言贯穿始终。结合DOM后能起到局部刷新页面的效果。它的 1.重要属性如下: onreadystatechange:指定响应到来时的操作。仅用于异步。 readyState响应文本状态、status服务器HTTP状态、statusText; responseText:代表响应的纯文本 responseXML:代表响应的XMLDocument对象。(即像window.document一样去取得内部节点信息) 此外还有responseBody、responseStream等。 2.重要方法是:open()、send()。 | ||
库 | 或被称为框架或Ajax框架(只不过因为有的库中包含了Ajax功能); 包括Prototype和YUI ,Dojo、MooTools、RubyOnRails(依赖于Prototype)等; 当前最成熟流行的是JQuery、ExtJS,简单、高效,只要有javaScript基础就能学会。 | ||
DOM | 文档对象模型:代表XML或者HTML文档,与平台和语言无关。 1.用编译型语言操作DOM 2.用解释型语言操作DOM,如浏览器运行javaScript语句操作此文档对象,用“window.document”引用文档对象,javaScript提供了大量的访问、查找、增、删、修改节点的函数。 |
XML重量级文档
XML | 验证 | 法一:DTD(标签<!DOCTYPE…>指定*.dtd文件,紧跟<?xml>行); 法二:schemal(schemaLocation="*.xsd"来指定,在根节点上) |
显示 | XLST | |
解析技术 | DOM:基于树的存储 SAX:事件模型 JDOM: DOM4J: |
JSON:轻量级
Java WEB项目结构:即通常的目录组织(也包括在不同IDE上创建项目时的目录命名区别)
Java Web组件概览
Jsp页面组件 | 运行机制:即如何转换成java类并被运行的过程 | |||
语法 | 注释<%-- |
| ||
脚本元素 | 声明:<%! | 其中声明变量作为servlet成员变量(对页面成全局) | ||
表达式:<%= | 每对中只能有一个表达式 | |||
Scriptlets:<% | 其中声明变量作为servlet某方法的局部变量 | |||
指令元素<%@ | page指令 | |||
include指令 | ||||
taglib指令 | ||||
动作指令<jsp: | 很多,不一一举例 | |||
9个隐含对象 | Request、response、out、 pageContext、session、application、 conifg、page、 exception |
| ||
自定义标记 (对JSP动作标记的扩展) | 1.实现相关接口: javax.Sevlet.jsp.tagext.Tag(简单标记处理)、 javax.Sevlet.jsp.tagext.BodyTag(体标记处理) 2.编写TLD文件 3.调用:<%@taglib prefix=”*” uri=”*”%> | |||
JSTL标签库(由apache实现) | EL表达式:内置 | |||
核心标签库:core,c | ||||
格式化标签库:fmt,fmt | ||||
XML标签库:?,? | ||||
函数标签库:functions,fn |
控制器组件
Servlet | 扩展HttpServlet | 处理http请求 重要方法:service()、doGet()、doPost()等方法 |
扩展GenericServlet | 处理包括http、ftp等各种协议请求 重要方法:service()方法 | |
Filter过滤器 | Servlet2.3版新增功能 | 用于过滤多个URL请求 |
Listener监听器 | Servlet2.3版新增功能 | 包括Servlet上下文监听器、Http会话监听器、客户请求监听器 |
JavaBean组件 | 动作指令 | <jsp:usebean id= <jsp:setProperty name= <jsp:getProperty name= |
另外,id指示的实例名,可以用在脚本<%中,去调用getXXX、setXXX等方法 |
java web编程需要了解下表中的一些内容:
一、范围: | 含义:原指对象的作用域:时间和空间。这里体现在设置各种范围的属性setAttribute()、getAttribute() | |
范围名直接用内置对象来描述:(1)request、(2)page、(3)application、(4)session | ||
内置的(1)request、(2)pageContext、(3)application、(4)session都有setAttribute(属性名,属性值)方法;而(2)pageContext可以设置多个范围的属性; | ||
二、生命周期: | 含义:各对象构建、调用方法、消亡的时机 | |
需要了解以下对象的生命周期 1.servlet(jsp): 2.filter:注意与servlet的区别 3.Listener:此对象的生命周期并不重要。 4.javabean:可以设置4种范围的javabean实例,因此其生命周期根据设置有所不同。默认是page。 | ||
三、会话 | 1.代表服务器与客户端的一次交互的对象。(不因http连接的断开而消亡) 2.当浏览器关闭、超时,服务器会清除该session对象,session中的所有数据同时消亡。(即便session对象没有及时清除,但当同一个客户端的新请求到来时,也会创建新的session)。 3.一般,用户点击“注销”、“退出”时,程序只把session中“证实已登录”的数据清除即可,但session依然保持; 4.各浏览器在新建窗口、新建卡片窗口是否沿用先前的session对象则可能有不同的对待; | |
四、web组件配置标签 (web.xml) | Servlet | <servlet>、<servlet-name>、<servlet-class>、<servlet-mapping>、<url-pattern> |
Filter过滤器 | <filter>、<filter-name>、<filter-class>、<filter-mapping>、<url-pattern> | |
Listener监听器 | <listener>、<listener-class > |
第三节企业级编程或其它
Enterprise java bean
Ejb3 |
|
|
|
JTA事务处理 | 由容器执行事务 |
|
SOA | Web Service | SOAP(以http协议传送xml数据) |
COBAR | ||
javaEE | ||
DCOM | ||
Rmi | RMI 是面向对象方式的 Java RPC 。(RPC远程过程调用) | |
Jmail | java邮件编程 | |
JMS | java 消息系统 |
RCP Rich Client Platform,富客户机平台。
其它
第三方插件或类库
版本管理: CVS:eclipse的标准的版本插件。练习则可在windows系统新建一个账户,安装CVS服务器,使服务开机运行。在eclipse上的客户端透视图为“Repository Exploring”。连接时使用新建的账户名、密码即可。 此外还有SVN等,需单独安装插件。 |
junit(插件,类库):单元测试工具 |
Tomcat插件 |
XMLBuddy:XML文档编辑器 |
UML插件 |
EMF:“模型—代码”生成工具; GMF: |
UML:辅助设计插件 |
Ant项目管理工具(取代make)
Maven项目管理工具
第四节 javaME
javaME:java移动版本体系(很大一部分类是javaSE库的微型版)。
目前由Google引领的Android系统流行起来,大量的移动开发使用这种系统,在此基础之上开发java程序需依照Android的API框架。
第五节三大框架SSH
框架有很多,struts1不讨论,ibatis、JPA是应用程序持久化层的框架,EJB3含重量级持久化层的框架。JSF:java Server face等等。本人其它文章总结了三大框架Struts2,spring,hibernate。