1 java概述
开发服务器端应用程序最流行语言,产生网页、运行后端逻辑。
当对java了解到一定程度,阅读源码才能解决问题。
Applet:在网页中运行的java程序,
Java的应用领域:
桌面应用系统开发
企业级应用开发
多媒体系统开发
分布式系统开发
Web应用系统开发
Java SE 桌面应用程序开发
Java EE 企业级分布式的网络程序 如电子商务网站、ERP(企业资源规划)系统,核心为EJP(企业java组件模型)
Java ME 嵌入式系统开发
2 Eclipse快捷键
Ctrl + z 撤销
Ctrl + y 反撤销
Ctrl + d 删除
Ctrl + Alt + 上/下 复制行
Alt + 上/下 移动行
Alt + * 代码提示
Ctrl + / 注释
Ctrl + F11 运行
Ctrl + Shift + O 自动导包
Ctrl + Alt + / 关键字自动补全
Alt + / 代码辅助菜单 如syso
Ctrl + 1 代码修正
Ctrl + m 放大视图
Shift + Enter 新建一行
F5 单步跳入
F6 单步跳过
3 8种基本数据类型
整型 byte short int long 占字节数1 2 4 8
浮点型 float double
字符型 2字节
布尔型
long型数字后加L/l
float型数字后加F/f
char 与 int可以相互显式转换
转义字符
4 数值表示
加上前缀0b可以写二进制:0b0010
为数字字面量加下滑线:1_000_000 或 0b0100_1101_0110_0000
下划线只为易读,编译器会去掉这些下划线。
数值类型所占内存与平台无关,没有无符号类型(unsigned)。
浮点数不适用于禁止出现舍入误差的金融计算中,此时使用BigDecimal。
声明常量:
final 数据类型常量名称 [=值]
常量名称大写
为成员变量时必须赋初值
5 字符编码UTF-16
代码单元(code unit):16位
代码点(code point):表示字符,两种情况:
1基本字符:一个代码单元;
2辅助字符:一对代码单元。
强烈建议不使用char类型
6 变量名
Java中“字母”和“数字”的范围更大。
使用Character类中的isJavaIdentifierStart和isJavaIdentifierPart方法进行检测。
7 变量
成员变量
实例变量
静态变量 static
局部变量
常量 final
8 控制台输入
Scanner in = new Scanner(System.in);
in.next(); 下一单词
in.nextLine(); 下一行
in.nextInt();
in.nextDouble();
in.hasNext();
in.hasNextInt();
in.hasNextDouble();
控制台读取密码
Console cons = System.console();
String username = cons.readLine(“User name: ”);
Char[] passwd = cons.readPassword(“Password: ”);
9 运算符
逻辑 与 或非
&& || !
& 与 && 的不同:无短路
按位 与 或 取反 异或
& | ~ ^
左移 右移 无符号右移
<< >> >>>
运算符优先级:
单目运算符
算术运算
比较运算
逻辑运算
赋值运算
可读性第一,效率第二
程序中注释要占程序代码总量的20%-50%
程序的开发与维护不是同一个人,应尽量使用简单的技术完成程序需要的功能。
10 格式化字符串
转换符:
十进制 d
十六进制 x
浮点数 f
指数浮点数 e
字符串 s
字符 c
布尔 b
散列码 h
日期时间 tx
与平台有关的行分隔符 n
标志:
参数索引:$ 从1开始
格式化前面说明数值: <
String.format(); //创建格式化字符,但不输出
11 文件输入输出
Scanner in = new Scanner(Paths.get(“C:\......”));
PrintWriter out = new PrintWriter(“myfile.txt”);
12 switch
case的标签可以是:数值、枚举常量、字符串字面量
switch(表达式)
{case 常量值1:语句块1break;case 常量值2:语句块2break;default:语句块1
}
foreach语句
for(int x : array)
... ...
13 带标签的break与continue
标签放在希望跳出的循环之前,紧跟冒号。
break跳到带标签语句块末尾。
continue语句跳到与标签匹配的循环首部。
14 字符串处理
不可变字符串:编译器可以让字符串共享。
共享带来的高效率远远胜过提取、拼接字符串带来的低效率。
String类
下标从0开始
new 出来的是字符串变量
“ ” 之间的是字符串常量
连接字符串:+
字符串长度:length()
字符串定位:indexOf(String s) lastIndexOf(String s)
获取指定位置字符:charAt(int index)
获取子串:substring(int beginIndex)
Substring(int beginIndex, int endIndex)
去除前后空格:trim()
字符替换:replace(char oldChar, char newChar)
判断头尾:startsWith(String prefix) endsWith(String suffix)
判断相等:equals(String str) equalsIgnoreCase(String str)
比较大小:compareTo(String str)
大小写转换:toLowerCase() toUpperCase() 不影响数字和非字符
字符串分割:split(String sign) split(String sing, int limit) limit为分割次数
格式化字符串:
String类的静态format()方法
(1)format(String format, Objects ...args)
(2)format(Local l, String format, Object ..args)
例子:
Date date = new Date();
String day = String.format(“%te”, date); 返回几号
String hour = String.format(“%tH”, date); 返回小时
String time = String.format(“%tF”, date); 返回年月日
String str = String.format(“%d”, 400 / 2) 十进制
String str2 = String.format(“%b”, 3 > 5) 布尔值
String str3 = String.format(“%x”, 200) 十六进制
正则表达式:符合一定规则的表达式。Pattern类
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配:String matches(regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split(regex);
3,替换:String replaceAll(regex,str);
4,获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
String str = "ming tian jiu yao fang jia le ,da jia。";
String reg = "\\b[a-z]{4}\\b";
Pattern p = Pattern.compile(reg); //将规则封装成对象。
Matcher m = p.matcher(str); //让正则对象和要作用的字符串相关联。获取匹配器对象。
//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
//System.out.println(m.matches());
// boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
// System.out.println(b);
// System.out.println(m.group());//用于获取匹配后结果。
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
字符串生成器
StringBuilder builder = new StringBuilder(“”);
append()
insert(int offset, arg)
delete(int start, int end)
toString()
15 数组
Java数组的维数可以接收变量;
数组的基本操作:
java.util.Arrays类
填充替换数组元素:
(1)fill(int[] a, int value)
(2)fill(int[] a, int fromIndex, int toIndex, int value)
对数组进行排序:
Arrays.sort() //优化的快速排序
复制数组:
Arrays.copyOf(arr, int newlength)
Arrays.copyOfRange(arr, int fromIndex, int toIndex)
二分查找:
Arrays.binarySearch(arr, key);
Arrays.binarySearch(arr, int fromIndex, int toIndex, key)
数组打印:
Arrays.toString(一维数组);
Arrays.deepToString(多维数组);
匿名数组 new int[]{1,2,3}
不规则数组:利用数组中存放的是对象指针的性质。
16 面向对象
Java是完全面向对象的。
类 class
构造 construct
实例 instance
实例域 instance field
方法 method
封装 encapsulation 信息隐藏
继承 inheritance
超类 Object
对象三个主要特性:
行为:behavior
状态:state
标识:identity
编程中如何识别类:名词为类,动词为方法。
类之间的关系:
依赖:uses-a
聚合:has-a
继承:is-a
统一建模语言:UML Unified Modeling Language
17 构造器(constructor)
特殊的方法,用来构造并初始化对象。
·构造器的名字与类名相同。
·可以有多个构造器
·可以有0、1、多个参数
·无返回值
·与new 操作符一起使用
所有java对象都是在堆中构造的,构造器总是伴随着new操作符一起调用。
对象变量:是一个指向对象的指针。
对象:在内存中实际的实例。
一个对象变量并没用实际包含一个对象,而仅仅引用一个对象。
在java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用。
New操作符的返回值也是一个引用。
所用的java对象都存储在堆中,当一个对象包含另一个对象变量时,这个变量依然包含着指向另一个堆对象的指针。
更改器方法:mutator method
访问器方法:accessor method
文件名必须与public类的名字相匹配。
在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。
当Java编译器发现一个源文件使用了其他类时,会查找名为其他类.class的文件,如果没有,则查找其他类.java文件并编译。如果其他类.java较其他类.class新,则重新编译其他类.java。
18 隐式参数与显示参数
隐式参数(implicit):出现在方法名前的对象(this);
显示参数(explicit):括号中的形参。
this的作用:
1、引用隐式参数
2、调用该类其他的构造器。
私有数据域
公有的域访问器方法
公有的域更改器方法 不能编写返回对象指针的访问器方法,应返回其clone出来的新对象。
19 基于类的访问权限
方法可以访问所属类的私有属性(feature),而不仅限于访问隐式参数的私有特性。
20 私有方法
私有方法为公有方法的辅助方法,外部不会出现依赖私有方法的代码,可以删除;
公有方法不能删除。
21 final实例域
必须保证在每个构造器执行之后,这个域的值被设置。
final修饰符应用于基本(primitive)类型域,或不可变(immutable)类的域。
静态方法不能使用this
22 静态域与静态方法
静态域:类域,只存一份,对象共享
静态常量:
public class Math
{
pubic static final double PI=3.14159265358...;
}
Public class System
{
public static final PrintStream out = ...;
}
静态方法:没有隐式this参数,不能向对象实施操作。
不能在静态方法中访问实例域。
使用类名调用静态方法。
使用静态方法的两种情况:
1、不需要访问对象状态,参数通过显示参数提供;
2、只需要访问静态域。
静态方法的一个常见用途:工厂方法
对象名都是引用,存放地址
== 比较的是两个对象的地址
System.gc()强制启动垃圾回收器
单元测试技巧:每一个可以有一个main方法进行单元测试。
23 方法参数
按引用调用(call by reference)C++引用
按值调用(call by value)java全部是call by value
方法参数有两种类型:
基本数据类型(数字、布尔)
对象引用(进行的是值传递)
总结:
一个方法不能修改一个基本数据类型的参数;
一个方法不能让对象参数引用一个新的对象;
一个方法可以改变一个对象参数的状态。
24 对象构造
重载(overloading):多个方法名字相同,参数不同。
调用过程首先重载解析(overloading resolution)。
方法签名(signature):方法名+参数类型。
默认域初始化:0 null false 无参默认构造函数的工作。
当类没有提供任何构造器时,系统才提供一个默认的无参构造函数。
一个构造器中可以用this(参数)调用另一个构造器。
调用构造器的具体步骤:
1、初始化为默认值;
2、初始化块;
3、如果这个构造器调用其它构造器,执行其它构造器
4、执行这个构造器。
对静态域,使用静态初始化块。在类的第一次加载时执行。
不提供finalize析构方法。
25 包
包(package):将类组织起来。
确保类名唯一。
域名逆序为包名,不同项目使用不同子包。
一个类可以使用包中的所有类,以及其他包中的公有类(public class)。
静态导入:导入静态方法和静态域
import static java.lang.system.*;
将包中的文件放到与完整的包名匹配的子目录中。
编译器将类文件也放在相同的目录结构中。
编译器对文件进行操作:javac com/mycompany/PayrollApp.java
解释器加载类:java com.mycompany.PayrollApp
包作用域:
如果类、方法、属性没有指定public或private,这个部分可以被同一个包中的所有方法访问。即默认为包范围的public。
禁止加载用户自定义的,包名以“java.”开始的类。
包密封(package sealing)机制:(JAR)如果一个包密封起来,就不能向这个包中再添加类了。解决将各种包混在在一起的问题。
26 类路径
类可以存储在文件系统子目录中,也可放在jar文件中。
为了使类能够被多个程序共享,需要做到以下几点:
1、把类放到一个目录中,如/home/user/classdir;
2、将jar文件放在一个目录中,如/home/user/archives;
3、设置类路径class path。类路径是所有包含类文件的路径的集合。
如:java -classpath /home/user/classdir:.:/home/user/archives/archive.jar
或CLASSPATH环境变量。
虚拟机定位类文件:
1、jre/lib 和 jre/lib/ext;
2、依次在类路径中查找。
编译器定位文件:
1、查找当前包;
2、查找所有import的包,import次序无关紧要。
如果有多个同名类则报错。
查看源文件(source file)是否比类文件新,如果是则重新编译。
27 文档注释
javadoc 可以有源文件生成一个HTML文档
/** ... */
注释的插入:
javadoc实用程序(utility)从下面几个特性抽取信息:
·包
·公有类与接口
·公有的和受保护的构造器及方法
·公有的和受保护的域
类注释:import语句之后,类定义之前。
方法注释:所描述方法之前
@parameter
@return
@throws
域注释:对公有域,通常是静态常量
通用注释:
@author
@version
@since version 1.7.1
@deprecated 不再使用标记,文本中给出了取代的建议。
@see引用 可用于类中,也可用于方法中。
package.class#feature label 只要提供类、方法或变量的名字,javadoc就在文档中插入一个超链接。
@see com.horstmann.corejava.Employee#raiseSalary(double)
@see <a href=URL>The core java home page</a>
@link 同上,在注释中的任何位置放置指向其他类或方法的超级链接。
包与概述注释
包注释,在包目录中添加一个单独的文件。
可以有两个选择:
1、提供一个以package.html命名的HTML文件,在标记<body>...</body>之间的文本都会被抽取出来;
2、提供一个以package-info.java命名的java文件。
这个文件在包语句之后跟注释 /** ... */
还可以为所有源文件提供一个概述性注释。这个注释放置在一个名为overview.html的文件中,这个文件位于所有源文件的父目录中。所有在标记<body>...</body>之间的文本都会被抽取出来。
注释的抽取:
1、切换到包含想要生成文档的源文件目录,此目录包含包和overview.html;
2、运行命令 javadoc -d docDirectory nameOfPackage
Javadoc -author -version -d docDirectory nameOfPackage
在文档中包含作者和版本信息(默认不包含)
Javadoc -link http://docs.oracle.com/javase/7/docs/api *.java
所有的标准类库类都会自动链接到Oracle网站de文档。
-linksource选项:每个类和方法名将转变为指向源代码的超链接。
28 类设计技巧
1、数据一定私有;
2、一定要数据初始化;
3、不要在类中使用过多的基本类型;
4、不是所有的域都需要独立的域访问器和域更改器;
5、将职责过多的类进行分解;
6、类名和方法名能够体现他们的职责。
类名:首字母大写 名词、形容词+名词、动名词+名词
访问器get开头,更改器set开头。
29 包装类
Number
BigDecimal BigInteger Byte Integer Long Short Double Float
Character
Boolean
30 数字格式化
java.text.DecimalFormat格式化数字
0 # . - , E % \u2030 \u00A4 ‘
String pattern;
DecimalFormat myFormat = new DecimalFormat();
myFormat.applyPattern(pattern);
DecimalFormat myFormat = new DecimalFormat(pattern);
myFormat.format(value)
Value Pattern Output
123456.789 ###,###.### 123,456.789
123456.789 00000000.###kg 00123456.789kg
123.78 000000.000 000123.780
0.789 #.###% 78.9
123456.789 ###.## 123456.79
0.789 0.00\u2030 789.00%。
myFormat.setGroupingSize(2); 设置分组大小
myFormat.setGroupingUsed(false); 是否支持分组
数学运算
Math类
常量:
Math.PI
Math.E
三角函数方法:
double sin(double a)
double cos(double a)
double tan(double a)
double asin(double a)
double acos(double a)
double stan(double a)
double toRadians(double angdeg) 角度转弧度
double toDegrees(double angrad) 弧度转角度
指数函数方法
double log(double a)
double log10(double a)
double sqrt(double a)
double cbrt(double a)
double pow(double a, double b)
最大、最小、绝对值
max( , )
min( , )
abs( )
取整函数
double ceil(double a)
double floor(double a)
double rint(double a) double -> double四舍五入,五取偶数
int round(float a) float -> int
long round(double a) double -> long
31 随机数
两种方式产生随机数
Math类的random()方法
Random类的产生各种数据类型的方法
Math.random() 产生double型随机数范围[0.0 - 1.0)
伪随机数,当前时间作为伪随机数的参数
(int)(Math.random()*n) [0 - n)
(int)(m + Math.random()*(m - n)) [m, m+n)
(char)(‘a’ + Math.random()*(‘z’-’a’+1)) [a, z]
32 大数字运算
java.math.BigDecimal
33 控制台键盘录入
Scanner s = new Scanner(System.in);//接受从键盘输入的数值
//receive string
String str = s.next();//获取输入的参数
//receive integer
Integer i = s.nextInt();//接受一个int的输入参数
//receive double
Double d = s.nextDouble();
Object类中的方法:getClass() toString() equals() clone()
对象向上转型
对象向下转型 判断 myobject instanceof ExamleClass
34 接口
implements interface
属性:public static final
方法:public abstract
导入静态成员 import static ...
35 Final
final 变量 不变修改
final 方法 不能重写
final 类 不能继承
36 内部类
成员内部类 局部内部类 匿名类
CLI Command Line User Interface
GUI Graphical User Interface
java.Awt
重量级控件
Abstract Window ToolKit 抽象窗口工具
需要调用本地系统方法实现
javax.Swing
轻量级控件
在Awt基础上建立,完全由Java实现