Java学习手册4

2018-07-18 12:38:57 -0400
【1.3.6】

《版本1.4.0更新简介》

本次更新全新巨献,希望带给您更好的使用体验!

更新1.4.0简介:(更改应用名称至Java Study)
1.全新界面风格全新界面样式。
2.配置更多高亮语法及修复。
3.升级视频播放功能,更稳定播放。
4.添加一键便签功能及分享功能。
5.签到由固定5配额升级到随机3-8配额。
6.升级显示行数功能。
7.更新线更新,不用在重新进入界面。
8.升级Toast风格。
9.修复快捷栏问题。
10.更新无数细小细节欢迎自己体验。

作者申明:每次更新都期待给你更好的体验,每次更新都是新的开始。

下载地址:
fir.im/p8hb复制浏览器打开。

《第一个Java程序》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008723441_53ff2c1043414619a4541a054a257687_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceebc2acdaf669ba2275469fdfeb8e7cbb08318f69d5d13dde5afe0d94675b63f0d5e2d5cf6bd67caa8915efb961815c7fac5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
下面看一个简单的Java程序,它将打印字符串 Hello World

实例 public class HelloWorld {

/* 第一个Java程序
* 它将打印字符串 Hello World
*/
public static void main(String []args) {
System.out.println("Hello World"); // 打印 Hello World
}
}

基本语法 编写Java程序时,应注意以下几点:

大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。 主方法入口:所有的Java 程序由public static void main(String []args)方法开始执行。 Java标识符 Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

关于Java标识符,有以下几点需要注意:

所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线()开始 首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线()或数字的任何字符组合 关键字不能用作标识符 标识符是大小写敏感的 合法标识符举例:age、$salary、_value、__1_value 非法标识符举例:123abc、-salary Java修饰符 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:

访问控制修饰符 : default, public , protected, private 非访问控制修饰符 : final, abstract, strictfp 在后面的章节中我们会深入讨论Java修饰符。

《Java注解》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008726426_773d463a41fa4fcdb534afaf5d5d3525_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee1c5fcf090eba48e2fb971d866092cf595abde9bd70f06db5d36d04e0f0dc50fd2088f6d2cba34e268af5ca9a96622e96c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
public class HelloWorld {
/* 这是第一个Java程序
*它将打印Hello World
* 这是一个多行注释的示例
*/
public static void main(String []args){
// 这是单行注释的示例
/* 这个也是单行注释的示例 */
System.out.println("Hello World");
}
}

《equals和==判断区别》

1、java中equals和==的区别 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

2、==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

3、equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

4、==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。

//阅读第四点即可。
《字符串输出》

//等效于字符串连接,对应符号将自动替换数值。
%s输出一个字符串
%c以字符形式输出单个字符
%f 6位小数
%d十进制
%o八进制
%x十六进制

System.out.printf("这个数是%s",10);
//输出这个数是10。

说明:用printf方法可以连接字符串使用。

《扩展运算符》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008720434_fe1b865239a1405495bf06a707bd3dc1_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee6e6b7e93ce2350d521bc18ae66d46d2489f2c6bdef6147d6ed765bb332745bb054fd755647d69d610476c93b5961612ac5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
int a=1;
int b=2;

a+=b;
a-=b;
输入结果,3,-1
说明:等效于a+b在赋值给a,或a-b在赋值给a。

a+=b+1;
输入结果,4//说明一样先算等号后面。

《关系运算符》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008729366_475670fdf8574cc48e81c5d40917002d_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee3af389e748a3f9c1ce1e94e8e4448928053fa79cdd194fa1081772f6d91e5cb1cbe296e9c15e625decf3072f373934e1c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
==
!=
//可比较全部类型
<
>
<=
>=
//数值类型,包括char。

《逻辑运算符》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008729367_c6c14773e66b4c53880370a2799136f9_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceee14b0befc086474a376a2616236bae80a3746933b979aceaf5ebd9a4962b668caabbed5fec95686b272e0ca3e4c56977c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
&(与)
|(或)
^(异或)(两个条件为异时输出true)
!(取反)(true输出false于判断相反)

短路

||(当一个条件为false时直接出false可提高效率)
&&(同上原理可提高效率)

说明:只用于比较布尔值。

《三元运算符》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008726434_609cd069f22b4a138ba60417fb59dfbc_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceee2a06e3f15c1ff0162389780cd094efb28c7e410a7adbfd87e5cbac6ddefdab585aa036d7be108e88eaf762a85de2610c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
格式:x?y:z

例子:
int a=100;
int b=50;
String type=a>b?"true":"false";
System.out.println(type);

例子二:
int a=100;
int b=50;
String type=a>b?(a==100?"这是100":"false"):"false";
System.out.println(type);

说明:三元运算可用于简单的判断跟if一样,但是必须包含3项,x为判断语句,y为true值执行,z为false执行。

《自动类型转化》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008723463_946ca6d152d74d6e8894da687a77bb08_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee5429d09066c211dcbf25ffd2158ef6392680a89d825bdbf3befeed55c386a7164260479cd6707a266e847c122bd0e88cc5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
int a=5;
double b=a;
...

说明:容量小转到容量大内,参照数值类型。

《强制类型转换》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008722428_f81b25eaa4764405a3a45d3214457e4b_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee1dfe9d76d5437aea2e52ac0644b8c31d51e65e2dfd37e38a42fb075c24defb8efe38d5949f25f09c53ab66a4e6e90805c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
(type)int

例子:
double a=3.15;
int b=(int)a;

说明:前面加(type)类型即可,强制转化会损失精度。

溢出问题:数值前加(long)或者其他转化即可。

《BigDecimal 浮点数比较》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008726431_13fd99302a6045cbba0cea6006d82d1e_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceeb7211d7058562c492291eebf08844fd6889d37680b1ff286b4d84fd368fdd5565a9b2dfbac3ad7598d5f17cb41b69310c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
推荐方法:

BigDecimal a=BigDecimal.valueOf(0.1);
BigDecimal b=BigDecimal.valueOf(0.2);
System.out.println(a.equals(b));

输出 false

//精确比较两个浮点数大小。

《Math 类》
// math包含一些数学运算值,下列列出一些基本数值。
Math.PI 返回记录的圆周率
Math.E 返回记录e的常量
Math.abs 返回绝对值
Math.sin 返回正弦函数
Math.asin 反正弦函数
Math.cos 返回余弦函数
Math.acos 反余弦函数
Math.tan 返回正切函数
Math.atan 反正切函数
Math.atan2 商的反正切函数
Math.toDegrees 返回 弧度转化为角度
Math.toRadians 角度转化为弧度
Math.ceil 返回不小于某数的最大整数
例如
Math.ceil(10.2) = 11;
Math.ceil(-10.2) = -10;
Math.floor 返回不大于某数的最大整数
例如
Math.floor(10.2) = 10;
Math.floor(-10.2) = -11;

Math.exp 返回e的任意次方
Math.log10 返回以10为底的对数
Math.log 返回自然对数
Math.rint 返回距离某数最近的整数
例如:
Math.rint(10.5) = 10.0;
Math.rint(10.4) = 10.0;
Math.rint(10.6) = 11.0;

Math.round 四舍五入 返回int型或者long型(上一个函数返回double型)
Math.random 返回0,1之间的一个随机数
Math.IEEEremainder(x,y) 返x%y的值
Math.max 返回两数中最大
Math.min 返回两数中最小
Math.sqrt 返回开方
Math.pow 返回某数的任意次方
Math.sqrt(x):返回平方根
Math.pow(x,y):返回x的y次方
Math.nextDown(X)比X小0.00001
Math.nextUp(X)比X大0.00001
Math.addExact(1, 2); 加法运算
Math.subtractExact(3, 5);减法运算
Math.multiplyExact(2, 4); 乘法运算
Math.scalb(6, 3); 表示6 * (2的3次方)

《Scanner 获取键盘输入》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008723466_31481725dde64ffb870306f4b02ee6a7_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee3ba05c89dce1c02f2de8ad450278fda7ea48c342d291156fa233ef17afa1edd8da7089f9d87436ed6159f12b29fd76a1c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
Scanner scanner=new Scanner(System.in);
String nr=scanner.nextLine();
...
//需导入io流。

《产生随机数》

产生1-5随机数
int a=(int)(Math.random()*5+1);
说明,+1为补贴random为0-1数值+1进行补贴,可以近似把Math.random()看做为1更好理解。

《while 循环》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008728460_f0b4a126db464a2e8c2caf7569602f95_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee1508e49c54dad3a1dde7d4891fc0f6b7f70112cfa7dc9e52892eb440aaf9240360160714f814eb1f1ded8a513b618111c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
while( 布尔表达式 ) {
//循环内容
}

无限循环
whlie(true) {
}

实例

Test.java 文件代码:
public class Test {
public static void main(String args[]) {
int x = 10;
while( x < 20 ) {
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}
}
}

《do…while 循环》

//do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

do {
//代码语句
}while(布尔表达式);

实例

Test.java 文件代码:
public class Test {
public static void main(String args[]){
int x = 10;

do{
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}while( x < 20 );
}
}

《for 循环》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008726462_efcd9bf0a5e445f8920f5c26e6874534_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee31e2deba4613e45c0e8f666f810f079bada9f65500dc16c41e7f1d3cfecf309bb0d615743908e371f0918b46bed7e7ddc5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
for(初始化; 布尔表达式; 更新) {
//代码语句
}

无限循环
for(;;)
{
}

实例

Test.java 文件代码:
public class Test {
public static void main(String args[]) {

for(int x = 10; x < 20; x = x+1) {
System.out.print("value of x : " + x );
System.out.print("\n");
}
}
}


《foreach 循环》

for(声明语句 : 表达式)
{
//代码句子
}

实例

Test.java 文件代码:
public class Test {
public static void main(String args[]){
int [] numbers = {10, 20, 30, 40, 50};

for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}

《for 趣味实验》

//打印99乘法表。

for(int a =1;a<=9;a++){
for(int b=1;b<=a;b++)
{
System.out.print(b+"×"+a+"="+(b*a)+"\t");
}
System.out.println();
}

说明:println代表每次换行,print不换行。

《break 关键字》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008722439_f2130350eb4544a38e09a7e4c299fa3a_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee0d3b039929b1a4b038733094ece024a067bb01f675f843bfe91e7055a0008a338e1bc90ba5608f34a7ba8d6ed8ca927ec5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。

break;

《continue 关键字》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008722439_f2130350eb4544a38e09a7e4c299fa3a_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee0d3b039929b1a4b038733094ece024a067bb01f675f843bfe91e7055a0008a338e1bc90ba5608f34a7ba8d6ed8ca927ec5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
continue 适用于任何循环控制结构中。
作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句,下面不执行。

continue;

《if 语句》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008725472_6bbd3135c6944dacaf2f04024ce694d3_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceefec67d1eda3b011ad3f3d6cd01df5ec9aa4b6ccec6b5d39ab4782b32ba0d17883a28058b768d16ff077999cffedaaa4cc5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
if 语句的用语法如下:

if(布尔表达式)
{
//如果布尔表达式为true将执行的语句
}

如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。

Test.java 文件代码:
public class Test {

public static void main(String args[]){
int x = 10;

if( x < 20 ){
System.out.print("这是 if 语句");
}
}
}

《if...else 语句》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008722433_822f63722ac64ac88c3315a828f73f71_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee914f6f43459ce42976d5607e3ba662c7388cebc788a36939e33f5fe553d1ed2b18d8587c6da9bfa3327f0e86a4051294c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
if…else 的用法如下:

if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
实例

Test.java 文件代码:
public class Test {

public static void main(String args[]){
int x = 30;

if( x < 20 ){
System.out.print("这是 if 语句");
}else{
System.out.print("这是 else 语句");
}
}
}

《if...else if...else 语句》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008722434_3aca80a41c3348478e567cc726898640_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abcee9bce4ab2b558bc961f2a166d0e4fd15a38c3511e4b9c666f6ee16c95c53052a64d69817fc1a1c2269e022bb26baf8e26c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
if...else 语法格式如下:

if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
实例

Test.java 文件代码:
public class Test {
public static void main(String args[]){
int x = 30;

if( x == 10 ){
System.out.print("Value of X is 10");
}else if( x == 20 ){
System.out.print("Value of X is 20");
}else if( x == 30 ){
System.out.print("Value of X is 30");
}else{
System.out.print("这是 else 语句");
}
}
}

《嵌套的 if…else 语句》

嵌套的 if…else 语法格式如下:

if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}
}
你可以像 if 语句一样嵌套 else if...else。

实例

Test.java 文件代码:
public class Test {

public static void main(String args[]){
int x = 30;
int y = 10;

if( x == 30 ){
if( y == 10 ){
System.out.print("X = 30 and Y = 10");
}
}
}
}

《switch 语句》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008724481_d18be4b656fb4e83ac08a35c1ecc6d2c_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceee6c028ffee1e9807a4260ec579d6652a000c83ca0e711e014472bcf1df7fa5834ea0f6dcbe163083ba157604a77cb0cdc5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
switch 语法格式如下:

switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}

/*
switch 语句有如下规则:

switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串类型了,同时 case 标签必须为字符串常量或字面量。

switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。

case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。

当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。

当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。

switch 语句可以包含一个 default 分支,该分支必须是 switch 语句的最后一个分支。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
*/

实例

Test.java 文件代码:
public class Test {
public static void main(String args[]){
//char grade = args[0].charAt(0);
char grade = 'C';

switch(grade)
{
case 'A' :
System.out.println("优秀");
break;
case 'B' :
case 'C' :
System.out.println("良好");
break;
case 'D' :
System.out.println("及格");
case 'F' :
System.out.println("你需要再努力努力");
break;
default :
System.out.println("未知等级");
}
System.out.println("你的等级是 " + grade);
}
}
以上代码编译运行结果如下:

良好
你的等级是 C

《数组的创建》

int[] a = new int[4];
//创建一个int类型4组空数组,默认值0。
a[0]=1;
//设置数组。

int [] b={0,1,2,3};
//创建一个实数组。
System.out.println(b[0]);
//打印第一条数据0开始。

说明:可以创建不同数据类型数组,数据必须符合该数据类型。

char[] c={'a',2,1};
System.out.println(c[0]);

《数值初始化》

//数组的三种初始化
public class Main{

Main(){

//静态初始化
int [] a={0,1,2};

//默认初始化,创建三个数int默认值0
int [] b=new int[3];

//动态初始化
int [] c=new int[3];
c[1]=0;
c[2]=1;
c[3]=2;

}

}

《语句块》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008728463_c95a09bae5a24f198f244e36176f7c6c_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceea562273fcf58fb483dc88855b8a08e48f854471aa7c55cf6ac4fca1d06edb2cab39c6389e4669f51714c6b11bcc97955c5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
说明:语句块中的变量只限于语句。

实例:

int a;
{
int b;
int c;
}
//变量作用域到此为止。

《对象调用方法1》

public class Main
{
public static void main(String[] args)
{
//通过对象(Main)调用方法,可多次调用。
Main ma=new Main();
ma.方法1();
//带参数调用
ma.方法2(1,2,3);
//返回值,返回后把整体方法3看做为1个值。
int c=ma.方法3(1,2,3);
System.out.println(c);
}
//创建方法void无返回值,如要返回值需跟该数值类型。

void 方法1(){
//建议大家不要用中文定义,我是为了大家更易理解写的(因为这节比较重要)
System.out.println("嘻嘻");
System.out.println("哈哈");
//上面为输入代码可无限。
}

void 方法2(int a,int b,int c){
//带参数方法,注意:参数必须是对应数值类型。
System.out.println(a+b+c);
}

int 方法3(int a,int b,int c){
//带返回值方法,注意:retrun放回后void必须改为对应数值类型。
int sum=a+b+c;
return sum;
//retrun两种作用①结束方法②返回值
}

}

说明:JG特例篇,请认真查看编写(新手),类似于iapp板块原理。

《对象调用方法2》

public class Main
{
public static void main(String[] args)
{
//直接调用
int m=方法1(1,1);
System.out.println(m);
方法2();
}

static int 方法1(int a,int b){
//添加static(public static)可以方便调用,不需要通过Main类。
int sum = a+b;
return sum;
}

static void 方法2(){
System.out.println("调用方法2");
}

}

说明:请仔细阅读。

《类的创建》

class 方法名{
}

说明:用于创建一个新的类,一个class只能含有一个public类。

《递归方法》

//就像自己调用自己一样。
说明事项:如果自己调用自己会进入死循环直到占满系统内存报错,return可结束,递归及其暂用系统资源建议使用(while/for)循环。

例子:
public class Main
{
public static void main(String[] args)
{
main();
}
static int a=1;
//静态类静态方法创建。
static void main(){
System.out.println(a);
a++;
if(a<=10){
main();
}
else{
return;
//结束。
}
}
}

《类与对象》

//类是对象的一个模通常包括属性方法等。

public class Main
{
//定义一些属性(成员变量),定以后这个类都包含这些属性,默认值0;
int a;
static int b;

//定义方法,参照前面。
void 方法1(){
System.out.println("方法1");
}

static void 方法2(){
//静态类便于调用。
System.out.println("方法2");
}

//创建方法,main程序的执行入口。

public static void main(String[] args){
//创建对象。
Main main=new Main();
main.方法1();
方法2();
System.out.println(b);
}

}

请仔细阅读。

《多个类的创建》

public class Main
{
//只能有一个public类
}
//创建一个新类

class Complier{
//创建方法可多次创建。
public static void main(String[] args)
{
//获取Complier对象。
Complier m=new Complier();
m.main();
}

void main(){
System.out.println("1");
}

}

//多类调用Main方法实例。

public class Main
{

Main(int a){
System.out.println(a);
}

}

class fy{
public static void main(String[] args){
new Main(999);
//因为是同个类名所以直接new即可。
}
}


认真查看编程。

《类的构造和重载》

public class Main
{

int a;
int b;
//构造一个方法名字必须和类名相同。
Main(int a,int b){
this.a=a;
this.b=b;
//如果变量相同需要this进行区分(this表示构造好的函数)。
}

Main(double a,double b){
this.a=(int)a;
this.b=(int)b;
//强制转换,相同的方法不同的参数可构成重载。
}

public static void main(String[] args){
//构造一个方法执行口。
Main m=new Main(0,1);
System.out.println(m.a);
}

}

《this 关键词》

说明:this表示已创建的类,通常用于区分相同类。

例子:

public class Main
{

Main(){

}
//创建一个方法

Main(int a){
this();
//调用Main()方法this区分,如果用Main();将报错,原因是该方法已被创建。
}
//含变量重载一个方法。


《static 关键词》

说明:static是一个静态的类。

静态方法(类)可以互相调用,但是常量类需要申明成静态方法(类)。

说明:因为静态类在归类在类里面,变量归类在变量里面。

《static 修饰符》

静态变量:

static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

静态方法:

static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

对类变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。

《final 修饰符》
在数值前面加final即可

例:
final int a=5;

说明:常量不可修改
规范化:字母大写下划线,final int A=5;。

《synchronized 修饰符》

synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。

实例
public synchronized void showDetails(){
.......
}

《transient 修饰符》

序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。

该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

实例
public transient int limit = 55; // 不会持久化
public int b; // 持久化

《volatile 修饰符》

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

一个 volatile 对象引用可能是 null。

实例
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代码
}
}
public void stop()
{
active = false; // 第二行
}
}
通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行 中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止。

但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。

《Java 关键字》

类别 关键字 说明
访问控制 private 私有的
protected 受保护的
public 公共的
类、方法和变量修饰符 abstract 声明抽象
class 类
extends 扩允,继承
final 最终值,不可改变的
implements 实现(接口)
interface 接口
native 本地,原生方法(非Java实现)
new 新,创建
static 静态
strictfp 严格,精准
synchronized 线程,同步
transient 短暂
volatile 易失
程序控制语句 break 跳出循环
case 定义一个值以供switch选择
continue 继续
default 默认
do 运行
else 否则
for 循环
if 如果
instanceof 实例
return 返回
switch 根据值选择执行
while 循环
错误处理 assert 断言表达式是否为真
catch 捕捉异常
finally 有没有异常都执行
throw 抛出一个异常对象
throws 声明一个异常可能被抛出
try 捕获异常
包相关 import 引入
package 包
基本类型 boolean 布尔型
byte 字节型
char 字符型
double 双精度浮点
float 单精度浮点
int 整型
long 长整型
short 短整型
null 空
变量引用 super 父类,超类
this 本类
void 无返回值
保留关键字 goto 是关键字,但不能使用
const 是关键字,但不能使用

《静态初始语句块》

//static修饰,当有执行器后自动执行。
static{
System.out.println("static");
}

public static void main(String []args){

}

《package 包》

/*package概念域名倒着写
*com.jg.cn
*/

说明:必须为于第一行无注释,以后都要在第一行加上。

《import 导入包》

package com.mycompany.myapp;
//包
import java.util.Date;
//导入工具包Date类,也可以直接导入全部包*
public class MainActivity
{
//获取时间
Date w=new Date();
//如果不导入包可以这样写指定包
java.util.Date m=new java.util.Date();

}

说明:如果需要使用不在本包的对象都要导入包,java.lang不用导入。

《extends 类的继承》

//类的继承extends,可以继承父类的全部,只能继承一次。
public class Main
{

//创建执行方法main
public static void main(String []args){
new 类2().方法1();
//继承后可以调用父和子类里的方法。
new 类2().方法2();
}


}

//类写在Main类外面,写在里面要封装。
class 类1{
//父类
int a=1;
int b=2;
void 方法2(){
System.out.println(a-b);
}
}

class 类2 extends 类1{
//类2继承类1(父类)
int c=a;
int d=b;
//基础后可以使用父类内容
void 方法1(){
System.out.println(c+d);
System.out.println(new 类2() instanceof 类1);
//instanceof可判断左边的对象是否是右边的对象
}
//创建一个方法,代码必须写在方法里面
}

说明:请认真阅读。

《方法的重写》

//方法的重写
public class Main
{

//创建执行方法main
public static void main(String []args){
new 类2().方法2();
}

}

//创建类1
class 类1{
//父类
void 方法2(){
System.out.println("方法2");
}
}

class 类2 extends 类1{
void 方法2(){
System.out.println("重写方法2");
}
//重写方法2

}

说明:重写类名变量,要与原方法相同。

《toString 方法重写》

public class Main
{

//创建执行方法main
public static void main(String []args){
System.out.println(new Main());
//System.out.println(new Main().toString());自带方法可省略
//打印Main对象,这里自带使用了object类里toString方法
}

//重写toString方法
@Override
//重写注释符,看心情写
public String toString()
{
return "重写tostring方法";
}


}

说明:重写后覆盖了原类object类tostring方法。


Object类简介:
每个子类都可以使用object类,里面包含很多方法,可以查看源码。

《super 方法》
//super可以指向父类,下面关于两个super使用

public class Main
{
public static void main(String []args){
new 类2().方法2();
}

}
class 类1{
int a=5;
public void 方法1(){
System.out.println("方法1");
}
}
class 类2 extends 类1{
int a =6;
public void 方法2(){
super.方法1();
//用super执行父类方法1
System.out.println("方法2");
System.out.println(a);
System.out.println(super.a);
//super指向父类。
}
}

《类的封装》


public class Main
{
//public 公共的修饰符可被任意访问
public static void main(String []args){
new Main3().方法2();
//new Main3().a=5;访问失败
}
}

//建立一个类无修饰符,默认限本包访问
class Main2{
//创建一个private修饰符限本包访问(封装)
private int a;
//创建属性2
int b;
//无修饰符本包都可访问xx.xx.xx内
void 方法1(){
System.out.println(a);
}
}
//创建类3继承类2
class Main3 extends Main2{
void 方法2(){
//private修饰后无法访问System.out.println(a);
b=5;
System.out.println(b);
}
}


说明:更多修饰符参考类访问修饰符。

《封装的用法》

//创建Main类
public class Main{
//创建私有属性本类可使用
private int a;
private boolean b=false;
int c;
//通过本类创建方法来实现修改私有类属性
public void setA(int a){
//方法固定格式set/get后面首字母大小(设置a属性)
this.a=a;
}
public void setB(boolean b){
//boolean用is属性设置
this.b=b;
}
//创建获取方法
public int getA(){
return a;
//返回a值
}
//获取boolean属性,boolean获取用is,set一样
public boolean isB(){
return b;
}
}

//创建新类class2
class class2{
public static void main(String []args){
Main m=new Main();
//获取Main类对象
m.setA(5);
System.out.println(m.getA());
//获取boolean用is
System.out.println(m.isB());
}
}

说明:封装的好处可以使用户那些数据可以调用哪些数据是禁止调用的。

《Java 基本数据类型》
https://video.study.163.com/edu-video/nos/mp4/2018/03/08/1008722422_c5434cb34ab8429a8560474f64860049_sd.mp4?ak=99ed7479ee303d1b1361b0ee5a4abceeb4d13435410c7c5b285e66869fb5ab1b2ac2df64483f446a21085586dc9082541d21ca4023442b16579fcd93e612d93bc5c2392413a096f94c1b700ffc15fb5490b601143824cf18b58a69ea00438816e2c4caba0e116581c14e4824cb46dc107feb6d0bf73a0d052df948b3525aefb09eed6bb2ffe8530b0f8655d97b53dc6197cbdc8f6a5d1563323094d2340ba3cf2919f5e4aded4ea11a82dd96c04efc1a
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:

byte 数据类型是8位、有符号的,以二进制补码表示的整数;
最小值是 -128(-2^7);
最大值是 127(2^7-1);
默认值是 0;
byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
例子:byte a = 100,byte b = -50。
short:

short 数据类型是 16 位、有符号的以二进制补码表示的整数
最小值是 -32768(-2^15);
最大值是 32767(2^15 - 1);
Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
默认值是 0;
例子:short s = 1000,short r = -20000。
int:

int 数据类型是32位、有符号的以二进制补码表示的整数;
最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1);
一般地整型变量默认为 int 类型;
默认值是 0 ;
例子:int a = 100000, int b = -200000。
long:

long 数据类型是 64 位、有符号的以二进制补码表示的整数;
最小值是 -9,223,372,036,854,775,808(-2^63);
最大值是 9,223,372,036,854,775,807(2^63 -1);
这种类型主要使用在需要比较大整数的系统上;
默认值是 0L;
例子: long a = 100000L,Long b = -200000L。
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:

float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
float 在储存大型浮点数组的时候可节省内存空间;
默认值是 0.0f;
浮点数不能用来表示精确的值,如货币;
例子:float f1 = 234.5f。
double:

double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
浮点数的默认类型为double类型;
double类型同样不能表示精确的值,如货币;
默认值是 0.0d;
例子:double d1 = 123.4。
boolean:

boolean数据类型表示一位的信息;
只有两个取值:true 和 false;
这种类型只作为一种标志来记录 true/false 情况;
默认值是 false;
例子:boolean one = true。
char:

char类型是一个单一的 16 位 Unicode 字符;
最小值是 \u0000(即为0);
最大值是 \uffff(即为65,535);
char 数据类型可以储存任何字符;
例子:char letter = 'A';。

低 ---> 高

byte,short,char—> int —> long—> float —> double

《访问控制修饰符》

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

《非访问修饰符》

为了实现一些其他的功能,Java 也提供了许多非访问修饰符。

static 修饰符,用来修饰类方法和类变量。

final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

abstract 修饰符,用来创建抽象类和抽象方法。

synchronized 和 volatile 修饰符,主要用于线程的编程。

《abstract 修饰符》

抽象类:

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。

抽象类可以包含抽象方法和非抽象方法。

《抽象方法》

抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。

抽象方法不能被声明成 final 和 static。

任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

抽象方法的声明以分号结尾,例如:public abstract sample();。


《符号 字符含义》
\n 换行 (0x0a)
\r 回车 (0x0d)
\f 换页符(0x0c)
\b 退格 (0x08)
\0 空字符 (0x20)
\s 字符串
\t 制表符
\" 双引号
\' 单引号
\\ 反斜杠
\ddd 八进制字符 (ddd)
\uxxxx 16进制Unicode字符 (xxxx)


《创建字符串》

创建字符串最简单的方式如下:
String greeting = "内容";
在代码中遇到字符串常量时,这里的值是 "内容"",编译器会使用该值创建一个 String 对象。

和其它对象一样,可以使用关键字和构造方法来创建 String 对象。

String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:

StringDemo.java 文件代码:
public class StringDemo{
public static void main(String args[]){
char[] helloArray = { 'r', 'u', 'n', 'o', 'o', 'b'};
String helloString = new String(helloArray);
System.out.println( helloString );
}
}
以上实例编译运行结果如下:

runoob
注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。

如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。

《连接字符串》
String 类提供了连接两个字符串的方法:

string1.concat(string2);
返回 string2 连接 string1 的新字符串。也可以对字符串常量使用 concat() 方法,如:

"我的名字是 ".concat("Runoob");
更常用的是使用'+'操作符来连接字符串,如:

"Hello," + " runoob" + "!"
结果如下:
"Hello, runoob!"

下面是一个例子:
StringDemo.java 文件代码:
public class StringDemo {
public static void main(String args[]) {
String string1 = "JG教程";
System.out.println("1、" + string1 + "fir.im/p8hb");
}
}

《length() 获取字符串长度》

用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
下面的代码执行后,len变量等于14:

StringDemo.java 文件代码:
public class StringDemo
{
public static void main(String args[]) {
String site = "m.runoob.com";
int len = site.length();
System.out.println( "JG教程网址长度 : " + len );
}
}

以上实例编译运行结果如下: JG教程网址长度 : 14

《Character 方法》

下面是Character类的方法:

序号 方法与描述
1 isLetter()
是否是一个字母
2 isDigit()
是否是一个数字字符
3 isWhitespace()
是否是一个空格
4 isUpperCase()
是否是大写字母
5 isLowerCase()
是否是小写字母
6 toUpperCase()
指定字母的大写形式
7 toLowerCase()
指定字母的小写形式
8 toString()
返回字符的字符串形式,字符串的长度仅为1

《StringBuffer 方法》
以下是 StringBuffer 类支持的主要方法:

序号 方法描述
1 public StringBuffer append(String s)
将指定的字符串追加到此字符序列。
2 public StringBuffer reverse()
将此字符序列用其反转形式取代。
3 public delete(int start, int end)
移除此序列的子字符串中的字符。
4 public insert(int offset, int i)
将 int 参数的字符串表示形式插入此序列中。
5 replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。
下面的列表里的方法和 String 类的方法类似:

序号 方法描述
1 int capacity()
返回当前容量。
2 char charAt(int index)
返回此序列中指定索引处的 char 值。
3 void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
4 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst。
5 int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
6 int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7 int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
8 int lastIndexOf(String str, int fromIndex)
返回 String 对象中子字符串最后出现的位置。
9 int length()
返回长度(字符数)。
10 void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch。
11 void setLength(int newLength)
设置字符序列的长度。
12 CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列。
13 String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14 String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
15 String toString()
返回此序列中数据的字符串表示形式。

《获取当前日期时间》

Java中获取当前日期和时间很简单,使用 Date 对象的 toString() 方法来打印当前日期和时间,如下所示:

实例
import java.util.Date;

public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();

// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
}

以上实例编译运行结果如下:

Mon May 04 09:51:52 CDT 2013

《日期比较》

Java使用以下三种方法来比较两个日期:

使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。


《SimpleDateFormat 格式化日期》

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。例如:

实例
import java.util.*;
import java.text.*;

public class DateDemo {
public static void main(String args[]) {

Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

System.out.println("Current Date: " + ft.format(dNow));
}
}

SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
这一行代码确立了转换的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。

注意:有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制。

以上实例编译运行结果如下:

Current Date: Wed 2016.11.09 at 08:23:19 AM UTC

《日期和时间的格式化编码》

字母 描述 示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
' 文字定界符 Delimiter
" 单引号 `

《使用printf格式化日期》

printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。

F

"年-月-日"格式

2007-10-27

D

"月/日/年"格式

10/27/07

r

"HH:MM:SS PM"格式(12时制)

02:25:51 下午

T

"HH:MM:SS"格式(24时制)

14:28:16

R

"HH:MM"格式(24时制)

14:28


实例
import java.util.Date;

public class DateDemo {

public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();

//c的使用
System.out.printf("全部日期和时间信息:%tc%n",date);
//f的使用
System.out.printf("年-月-日格式:%tF%n",date);
//d的使用
System.out.printf("月/日/年格式:%tD%n",date);
//r的使用
System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);
//t的使用
System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);
//R的使用
System.out.printf("HH:MM格式(24时制):%tR",date);
}
}

以上实例编译运行结果如下:

全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012
年-月-日格式:2012-09-10
月/日/年格式:09/10/12
HH:MM:SS PM格式(12时制):10:43:36 上午
HH:MM:SS格式(24时制):10:43:36
HH:MM格式(24时制):10:43
如果你需要重复提供日期,那么利用这种方式来格式化它的每一部分就有点复杂了。因此,可以利用一个格式化字符串指出要被格式化的参数的索引。

索引必须紧跟在%后面,而且必须以$结束。


《解析字符串为时间》
SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。例如:

实例
import java.util.*;
import java.text.*;

public class DateDemo {

public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");

String input = args.length == 0 ? "1818-11-11" : args[0];

System.out.print(input + " Parses as ");

Date t;

try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}

以上实例编译运行结果如下:

$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

《Java 休眠(sleep)》

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。

你可以让程序休眠一毫秒的时间或者到您的计算机的寿命长的任意段时间。例如,下面的程序会休眠3秒:

实例
import java.util.*;

public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(1000*3); // 休眠3秒
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}

运行实例 »
以上实例编译运行结果如下:

Thu Sep 17 10:20:30 CST 2015

Thu Sep 17 10:20:33 CST 2015

《测量时间》

下面的一个例子表明如何测量时间间隔(以毫秒为单位):

实例
import java.util.*;

public class DiffDemo {

public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}

运行实例 »
以上实例编译运行结果如下:

Fri Jan 08 09:48:47 CST 2016

Fri Jan 08 09:48:50 CST 2016

Difference is : 3019


《Calendar类》
我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。

Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。


《创建一个代表系统当前日期的Calendar对象》

Calendar c = Calendar.getInstance();//默认是当前日期


《创建一个指定日期的Calendar对象》

使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);


《Calendar类对象字段类型》

Calendar类中用以下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想

常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意义完全相同
Calendar.HOUR 12小时制的小时
Calendar.HOUR_OF_DAY 24小时制的小时
Calendar.MINUTE 分钟
Calendar.SECOND 秒
Calendar.DAY_OF_WEEK 星期几

《Calendar类对象信息的设置》

Set设置

如:

Calendar c1 = Calendar.getInstance();
调用:

public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12
利用字段类型设置

如果只设定某个字段,例如日期的值,则可以使用如下set方法:

public void set(int field,int value)
把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算

c1.set(Calendar.DATE,10);
把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算

c1.set(Calendar.YEAR,2008);
其他字段属性set的意义以此类推

Add设置

Calendar c1 = Calendar.getInstance();
把c1对象的日期加上10,也就是c1也就表示为10天后的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, 10);
把c1对象的日期减去10,也就是c1也就表示为10天前的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, -10);
其他字段属性的add的意义以此类推

《Calendar类对象信息的获得》

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

《Java 正则表达式》

一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。

.(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1"。

下表列出了一些正则表达式的实例及描述:

正则表达式 描述
this is text

匹配字符串 "this is text"

this\s+is\s+text

注意字符串中的 \s+。

匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。

可以匹配这个实例:this is text

^\d+(\.\d+)?

^ 定义了以什么开始

\d+ 匹配一个或多个数字

? 设置括号内的选项是可选的

\. 匹配 "."

可以匹配的实例:"5", "1.5" 和 "2.21"。

Java 正则表达式和 Perl 的是最为相似的。

java.util.regex 包主要包括以下三个类:

Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

以下实例中使用了正则表达式 .*runoob.* 用于查找字符串中是否包了 runoob 子串:

实例
import java.util.regex.*;

class RegexExample1{
public static void main(String args[]){
String content = "I am noob " +
"from runoob.com.";

String pattern = ".*runoob.*";

boolean isMatch = Pattern.matches(pattern, content);
System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
}
}
实例输出结果为:

字符串中是否包含了 'runoob' 子字符串? true

《捕获组》

捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。

捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

((A)(B(C)))
(A)
(B(C))
(C)
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。

实例
下面的例子说明如何从一个给定的字符串中找到数字串:

RegexMatches.java 文件代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
public static void main( String args[] ){

// 按指定模式在字符串查找
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";

// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);

// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
System.out.println("Found value: " + m.group(3) );
} else {
System.out.println("NO MATCH");
}
}
}
以上实例编译运行结果如下:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?

《正则表达式语法》

在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。

字符

说明

\

将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,"n"匹配字符"n"。"\n"匹配换行符。序列"\\\\"匹配"\\","\\("匹配"("。

^

匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。

$

匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。

*

零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。

+

一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

?

零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。

{n}

n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。

{n,}

n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。

{n,m}

M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。

?

当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。

.

匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。

(pattern)

匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"\("或者"\)"。

(?:pattern)

匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。

(?=pattern)

执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

(?!pattern)

执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

x|y

匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。

[xyz]

字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。

[^xyz]

反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。

[a-z]

字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。

[^a-z]

反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。

\b

匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。

\B

非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。

\cx

匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。

\d

数字字符匹配。等效于 [0-9]。

\D

非数字字符匹配。等效于 [^0-9]。

\f

换页符匹配。等效于 \x0c 和 \cL。

\n

换行符匹配。等效于 \x0a 和 \cJ。

\r

匹配一个回车符。等效于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。

\S

匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。

\t

制表符匹配。与 \x09 和 \cI 等效。

\v

垂直制表符匹配。与 \x0b 和 \cK 等效。

\w

匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。

\W

与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。

\xn

匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。

\num

匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。

\n

标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。

\nm

标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。

\nml

当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。

\un

匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。

《索引方法》

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:

序号 方法及说明
1 public int start()
返回以前匹配的初始索引。
2 public int start(int group)
返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
3 public int end()
返回最后匹配字符之后的偏移量。
4 public int end(int group)
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
研究方法
研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

序号 方法及说明
1 public boolean lookingAt()
尝试将从区域开头开始的输入序列与该模式匹配。
2 public boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
3 public boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
4 public boolean matches()
尝试将整个区域与模式匹配。
替换方法
替换方法是替换输入字符串里文本的方法:

序号 方法及说明
1 public Matcher appendReplacement(StringBuffer sb, String replacement)
实现非终端添加和替换步骤。
2 public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤。
3 public String replaceAll(String replacement)
替换模式与给定替换字符串相匹配的输入序列的每个子序列。
4 public String replaceFirst(String replacement)
替换模式与给定替换字符串匹配的输入序列的第一个子序列。
5 public static String quoteReplacement(String s)
返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。

《start 和 end 方法》
下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子:

RegexMatches.java 文件代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
private static final String REGEX = "\\bcat\\b";
private static final String INPUT =
"cat cat cat cattie cat";

public static void main( String args[] ){
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获取 matcher 对象
int count = 0;

while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
以上实例编译运行结果如下:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
可以看到这个例子是使用单词边界,以确保字母 "c" "a" "t" 并非仅是一个较长的词的子串。它也提供了一些关于输入字符串中匹配发生位置的有用信息。

Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引,end 方法最后一个匹配字符的索引加 1。

《matches 和 lookingAt 方法》

matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。

lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配。

这两个方法经常在输入字符串的开始使用。

我们通过下面这个例子,来解释这个功能:

RegexMatches.java 文件代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
private static final String INPUT2 = "ooooofoooooooooooo";
private static Pattern pattern;
private static Matcher matcher;
private static Matcher matcher2;

public static void main( String args[] ){
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
matcher2 = pattern.matcher(INPUT2);

System.out.println("Current REGEX is: "+REGEX);
System.out.println("Current INPUT is: "+INPUT);
System.out.println("Current INPUT2 is: "+INPUT2);


System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
System.out.println("lookingAt(): "+matcher2.lookingAt());
}
}
以上实例编译运行结果如下:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
Current INPUT2 is: ooooofoooooooooooo
lookingAt(): true
matches(): false
lookingAt(): false

《replaceFirst 和 replaceAll 方法》

replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。

下面的例子来解释这个功能:

RegexMatches.java 文件代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
private static String REGEX = "dog";
private static String INPUT = "The dog says meow. " +
"All dogs say meow.";
private static String REPLACE = "cat";

public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
以上实例编译运行结果如下:

The cat says meow. All cats say meow.

《appendReplacement 和 appendTail 方法》
Matcher 类也提供了appendReplacement 和 appendTail 方法用于文本替换:

看下面的例子来解释这个功能:

RegexMatches.java 文件代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// 获取 matcher 对象
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
以上实例编译运行结果如下:

-foo-foo-foo-
PatternSyntaxException 类的方法
PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。

PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。

序号 方法及说明
1 public String getDescription()
获取错误的描述。
2 public int getIndex()
获取错误的索引。
3 public String getPattern()
获取错误的正则表达式模式。
4 public String getMessage()
返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。

《Java 方法》
在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢?

println() 是一个方法。
System 是系统类。
out 是标准输出对象。
这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 println()。
那么什么是方法呢?

Java方法是语句的集合,它们在一起执行一个功能。

方法是解决一类问题的步骤的有序组合
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
方法的优点

1. 使程序变得更简短而清晰。
2. 有利于程序维护。
3. 可以提高程序开发的效率。
4. 提高了代码的重用性。
方法的命名规则

1.方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。
2.下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>,例如 testPop_emptyStack。

《方法的定义》
一般情况下,定义一个方法包含以下语法:

修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
方法体:方法体包含具体的语句,定义该方法的功能。


如:

public static int age(int birthday){...}
参数可以有多个:

static float interest(float principal, int year){...}
注意: 在一些其它语言中方法指过程和函数。一个返回非void类型返回值的方法称为函数;一个返回void类型返回值的方法叫做过程。

实例

下面的方法包含 2 个参数 num1 和 num2,它返回这两个参数的最大值。

/** 返回两个整型变量数据的较大值 */
public static int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;

return result;
}

《方法调用》

Java 支持两种调用方法的方式,根据方法是否返回值来选择。

当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。

当方法返回一个值的时候,方法调用通常被当做一个值。例如:

int larger = max(30, 40);
如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:

System.out.println("欢迎访问菜鸟教程!");
示例

下面的例子演示了如何定义一个方法,以及如何调用它:

TestMax.java 文件代码:
public class TestMax {
/** 主方法 */
public static void main(String[] args) {
int i = 5;
int j = 2;
int k = max(i, j);
System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
}

/** 返回两个整数变量较大的值 */
public static int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;

return result;
}
}
以上实例编译运行结果如下:

5 和 2 比较,最大值是:5
这个程序包含 main 方法和 max 方法。main 方法是被 JVM 调用的,除此之外,main 方法和其它方法没什么区别。

main 方法的头部是不变的,如例子所示,带修饰符 public 和 static,返回 void 类型值,方法名字是 main,此外带个一个 String[] 类型参数。String[] 表明参数是字符串数组。

《void 关键字》
本节说明如何声明和调用一个 void 方法。

下面的例子声明了一个名为 printGrade 的方法,并且调用它来打印给定的分数。

示例

TestVoidMethod.java 文件代码:
public class TestVoidMethod {
public static void main(String[] args) {
printGrade(78.5);
}

public static void printGrade(double score) {
if (score >= 90.0) {
System.out.println('A');
}
else if (score >= 80.0) {
System.out.println('B');
}
else if (score >= 70.0) {
System.out.println('C');
}
else if (score >= 60.0) {
System.out.println('D');
}
else {
System.out.println('F');
}
}
}
以上实例编译运行结果如下:

C
这里printGrade方法是一个void类型方法,它不返回值。

一个void方法的调用一定是一个语句。 所以,它被在main方法第三行以语句形式调用。就像任何以分号结束的语句一样。

《通过值传递参数》
调用一个方法时候需要提供参数,你必须按照参数列表指定的顺序提供。

例如,下面的方法连续n次打印一个消息:

TestVoidMethod.java 文件代码:
public static void nPrintln(String message, int n) {
for (int i = 0; i < n; i++) {
System.out.println(message);
}
}
示例

下面的例子演示按值传递的效果。

该程序创建一个方法,该方法用于交换两个变量。

TestPassByValue.java 文件代码:
public class TestPassByValue {
public static void main(String[] args) {
int num1 = 1;
int num2 = 2;

System.out.println("交换前 num1 的值为:" +
num1 + " ,num2 的值为:" + num2);

// 调用swap方法
swap(num1, num2);
System.out.println("交换后 num1 的值为:" +
num1 + " ,num2 的值为:" + num2);
}
/** 交换两个变量的方法 */
public static void swap(int n1, int n2) {
System.out.println("\t进入 swap 方法");
System.out.println("\t\t交换前 n1 的值为:" + n1
+ ",n2 的值:" + n2);
// 交换 n1 与 n2的值
int temp = n1;
n1 = n2;
n2 = temp;

System.out.println("\t\t交换后 n1 的值为 " + n1
+ ",n2 的值:" + n2);
}
}
以上实例编译运行结果如下:

交换前 num1 的值为:1 ,num2 的值为:2
进入 swap 方法
交换前 n1 的值为:1,n2 的值:2
交换后 n1 的值为 2,n2 的值:1
交换后 num1 的值为:1 ,num2 的值为:2
传递两个参数调用swap方法。有趣的是,方法被调用后,实参的值并没有改变。

《方法的重载》
上面使用的max方法仅仅适用于int型数据。但如果你想得到两个浮点类型数据的最大值呢?

解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示:

public static double max(double num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
}
如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用;

如果传递的是double型参数,则double类型的max方法体会被调用,这叫做方法重载;

就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。

Java编译器根据方法签名判断哪个方法应该被调用。

方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。

重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。

《变量作用域》
变量的范围是程序中该变量可以被引用的部分。

方法内定义的变量被称为局部变量。

局部变量的作用范围从声明开始,直到包含它的块结束。

局部变量必须声明才可以使用。

方法的参数范围涵盖整个方法。参数实际上是一个局部变量。

for循环的初始化部分声明的变量,其作用范围在整个循环。

但循环体内声明的变量其适用范围是从它声明到循环体结束。它包含如下所示的变量声明:

你可以在一个方法里,不同的非嵌套块中多次声明一个具有相同的名称局部变量,但你不能在嵌套块内两次声明局部变量。

《命令行参数的使用》
有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。

命令行参数是在执行程序时候紧跟在程序名字后面的信息。

实例

下面的程序打印所有的命令行参数:

CommandLine.java 文件代码:
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
如下所示,运行这个程序:

$ javac CommandLine.java
$ java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

《构造方法》
当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。

通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。

不管你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,它把所有成员初始化为0。

一旦你定义了自己的构造方法,默认构造方法就会失效。

实例

下面是一个使用构造方法的例子:

// 一个简单的构造函数
class MyClass {
int x;

// 以下是构造函数
MyClass() {
x = 10;
}
}
你可以像下面这样调用构造方法来初始化一个对象:

ConsDemo.java 文件代码:
public class ConsDemo {
public static void main(String args[]) {
MyClass t1 = new MyClass();
MyClass t2 = new MyClass();
System.out.println(t1.x + " " + t2.x);
}
}
大多时候需要一个有参数的构造方法。

实例

下面是一个使用构造方法的例子:

// 一个简单的构造函数
class MyClass {
int x;

// 以下是构造函数
MyClass(int i ) {
x = i;
}
}
你可以像下面这样调用构造方法来初始化一个对象:

ConsDemo.java 文件代码:
public class ConsDemo {
public static void main(String args[]) {
MyClass t1 = new MyClass( 10 );
MyClass t2 = new MyClass( 20 );
System.out.println(t1.x + " " + t2.x);
}
}
运行结果如下:

10 20

《finalize() 方法》
Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。

例如,你可以使用 finalize() 来确保一个对象打开的文件被关闭了。

在 finalize() 方法里,你必须指定在对象销毁时候要执行的操作。

finalize() 一般格式是:

protected void finalize()
{
// 在这里终结代码
}
关键字 protected 是一个限定符,它确保 finalize() 方法不会被该类以外的代码调用。

当然,Java 的内存回收可以由 JVM 来自动完成。如果你手动使用,则可以使用上面的方法。

实例

FinalizationDemo.java 文件代码:
public class FinalizationDemo {
public static void main(String[] args) {
Cake c1 = new Cake(1);
Cake c2 = new Cake(2);
Cake c3 = new Cake(3);

c2 = c3 = null;
System.gc(); //调用Java垃圾收集器
}
}

class Cake extends Object {
private int id;
public Cake(int id) {
this.id = id;
System.out.println("Cake Object " + id + "is created");
}

protected void finalize() throws java.lang.Throwable {
super.finalize();
System.out.println("Cake Object " + id + "is disposed");
}
}
运行以上代码,输出结果如下:

$ javac FinalizationDemo.java
$ java FinalizationDemo
Cake Object 1is created
Cake Object 2is created
Cake Object 3is created
Cake Object 3is disposed
Cake Object 2is disposed

《Java 流(Stream)、文件(File)和IO》
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。

《读取控制台输入》

Java 的控制台输入由 System.in 完成。

为了获得一个绑定到控制台的字符流,你可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。

下面是创建 BufferedReader 的基本语法:

BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。

《从控制台读取多字符输入》

从 BufferedReader 对象读取一个字符要使用 read() 方法,它的语法如下:

int read( ) throws IOException
每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。

下面的程序示范了用 read() 方法从控制台不断读取字符直到用户输入 "q"。

BRRead.java 文件代码:
// 使用 BufferedReader 在控制台读取字符

import java.io.*;

public class BRRead {
public static void main(String args[]) throws IOException
{
char c;
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("输入字符, 按下 'q' 键退出。");
// 读取字符
do {
c = (char) br.read();
System.out.println(c);
} while(c != 'q');
}
}
以上实例编译运行结果如下:

输入字符, 按下 'q' 键退出。


《从控制台读取字符串》

从标准输入读取一个字符串需要使用 BufferedReader 的 readLine() 方法。

它的一般格式是:

String readLine( ) throws IOException
下面的程序读取和显示字符行直到你输入了单词"end"。

BRReadLines.java 文件代码:
// 使用 BufferedReader 在控制台读取字符
import java.io.*;
public class BRReadLines {
public static void main(String args[]) throws IOException
{
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String str;
System.out.println("Enter lines of text.");
System.out.println("Enter 'end' to quit.");
do {
str = br.readLine();
System.out.println(str);
} while(!str.equals("end"));
}
}
以上实例编译运行结果如下:

Enter lines of text.
Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
end
end
JDK 5 后的版本我们也可以使用 Java Scanner 类来获取控制台的输入。

《控制台输出》

在此前已经介绍过,控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。

PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

PrintStream 定义 write() 的最简单格式如下所示:

void write(int byteval)
该方法将 byteval 的低八位字节写到流中。

实例

下面的例子用 write() 把字符 "A" 和紧跟着的换行符输出到屏幕:

WriteDemo.java 文件代码:
import java.io.*;

// 演示 System.out.write().
public class WriteDemo {
public static void main(String args[]) {
int b;
b = 'A';
System.out.write(b);
System.out.write('\n');
}
}
运行以上实例在输出窗口输出 "A" 字符

A
注意:write() 方法不经常使用,因为 print() 和 println() 方法用起来更为方便。

《读写文件》

如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。

下图是一个描述输入流和输出流的类层次图。



下面将要讨论的两个重要的流是 FileInputStream 和 FileOutputStream:

《FileInputStream》

该流用于从文件读取数据,它的对象可以用关键字 new 来创建。

有多种构造方法可用来创建对象。

可以使用字符串类型的文件名来创建一个输入流对象来读取文件:

InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:

File f = new File("C:/java/hello");
InputStream out = new FileInputStream(f);
创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作。

序号 方法及描述
1 public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
2 protected void finalize()throws IOException {}
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。
3 public int read(int r)throws IOException{}
这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。
4 public int read(byte[] r) throws IOException{}
这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
5 public int available() throws IOException{}
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。
除了 InputStream 外,还有一些其他的输入流。

《FileOutputStream》

该类用来创建一个文件并向文件中写数据。

如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。

有两个构造方法可以用来创建 FileOutputStream 对象。

使用字符串类型的文件名来创建一个输出流对象:

OutputStream f = new FileOutputStream("C:/java/hello")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。

序号 方法及描述
1 public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
2 protected void finalize()throws IOException {}
这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。
3 public void write(int w)throws IOException{}
这个方法把指定的字节写到输出流中。
4 public void write(byte[] w)
把指定数组中w.length长度的字节写到OutputStream中。
除了OutputStream外,还有一些其他的输出流,更多的细节参考下面链接:

ByteArrayOutputStream
DataOutputStream
实例

下面是一个演示 InputStream 和 OutputStream 用法的例子:

fileStreamTest.java 文件代码:
import java.io.*;

public class fileStreamTest{
public static void main(String args[]){
try{
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream("test.txt");
for(int x=0; x < bWrite.length ; x++){
os.write( bWrite[x] ); // writes the bytes
}
os.close();

InputStream is = new FileInputStream("test.txt");
int size = is.available();

for(int i=0; i< size; i++){
System.out.print((char)is.read() + " ");
}
is.close();
}catch(IOException e){
System.out.print("Exception");
}
}
}
上面的程序首先创建文件test.txt,并把给定的数字以二进制形式写进该文件,同时输出到控制台上。

以上代码由于是二进制写入,可能存在乱码,你可以使用以下代码实例来解决乱码问题:

fileStreamTest2.java 文件代码:
//文件名 :fileStreamTest2.java
import java.io.*;

public class fileStreamTest2{
public static void main(String[] args) throws IOException {

File f = new File("a.txt");
FileOutputStream fop = new FileOutputStream(f);
// 构建FileOutputStream对象,文件不存在会自动新建

OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk

writer.append("中文输入");
// 写入到缓冲区

writer.append("\r\n");
//换行

writer.append("English");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入

writer.close();
//关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉

fop.close();
// 关闭输出流,释放系统资源

FileInputStream fip = new FileInputStream(f);
// 构建FileInputStream对象

InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
// 构建InputStreamReader对象,编码与写入相同

StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());
// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
reader.close();
// 关闭读取流

fip.close();
// 关闭输入流,释放系统资源

}
}

《文件和I/O》
还有一些关于文件和I/O的类,我们也需要知道:

File Class(类)
FileReader Class(类)
FileWriter Class(类)

《Java中的目录》

创建目录:

File类中有两个方法可以用来创建文件夹:

mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
mkdirs()方法创建一个文件夹和它的所有父文件夹。
下面的例子创建 "/tmp/user/java/bin"文件夹:

CreateDir.java 文件代码:
import java.io.File;

public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// 现在创建目录
d.mkdirs();
}
}
编译并执行上面代码来创建目录 "/tmp/user/java/bin"。

注意: Java 在 UNIX 和 Windows 自动按约定分辨文件路径分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/) ,路径依然能够被正确解析。

《读取目录》

一个目录其实就是一个 File 对象,它包含其他文件和文件夹。

如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。

可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。

下面展示的例子说明如何使用 list() 方法来检查一个文件夹中包含的内容:

DirList.java 文件代码:
import java.io.File;

public class DirList {
public static void main(String args[]) {
String dirname = "/tmp";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println( "目录 " + dirname);
String s[] = f1.list();
for (int i=0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " 是一个目录");
} else {
System.out.println(s[i] + " 是一个文件");
}
}
} else {
System.out.println(dirname + " 不是一个目录");
}
}
}
以上实例编译运行结果如下:

目录 /tmp
bin 是一个目录
lib 是一个目录
demo 是一个目录
test.txt 是一个文件
README 是一个文件
index.html 是一个文件
include 是一个目录

《删除目录或文件》
删除文件可以使用 java.io.File.delete() 方法。

以下代码会删除目录 /tmp/java/,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。

测试目录结构:

/tmp/java/
|-- 1.log
|-- test
DeleteFileDemo.java 文件代码:
import java.io.File;

public class DeleteFileDemo {
public static void main(String args[]) {
// 这里修改为自己的测试目录
File folder = new File("/tmp/java/");
deleteFolder(folder);
}

//删除文件及目录
public static void deleteFolder(File folder) {
File[] files = folder.listFiles();
if(files!=null) {
for(File f: files) {
if(f.isDirectory()) {
deleteFolder(f);
} else {
f.delete();
}
}
}
folder.delete();
}
}


《Java 异常处理》

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

异常发生的原因有很多,通常包含以下几大类:

用户输入了非法数据。
要打开的文件不存在。
网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:

检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

《Exception 类的层次》

所有的异常类是从 java.lang.Exception 类继承的子类。

Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。

Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。

Error 用来指示运行时环境发生的错误。

例如,JVM 内存溢出。一般地,程序不会从错误中恢复。

异常类有两个主要的子类:IOException 类和 RuntimeException 类。

在 Java 内置类中(接下来会说明),有大部分常用检查性和非检查性异常。

《Java 内置异常类》

Java 语言定义了一些异常类在 java.lang 标准包中。

标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。

Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。

异常 描述
ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。
ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
IllegalStateException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
IllegalThreadStateException 线程没有处于请求操作所要求的适当状态时抛出的异常。
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。
NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
SecurityException 由安全管理器抛出的异常,指示存在安全侵犯。
StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
UnsupportedOperationException 当不支持请求的操作时,抛出该异常。
下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。

异常 描述
ClassNotFoundException 应用程序试图加载类时,找不到相应的类,抛出该异常。
CloneNotSupportedException 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
IllegalAccessException 拒绝访问一个类的时候,抛出该异常。
InstantiationException 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
InterruptedException 一个线程被另一个线程中断,抛出该异常。
NoSuchFieldException 请求的变量不存在
NoSuchMethodException 请求的方法不存在

《异常方法》

下面的列表是 Throwable 类的主要方法:
序号 方法及说明
1 public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。
2 public Throwable getCause()
返回一个Throwable 对象代表异常原因。
3 public String toString()
使用getMessage()的结果返回类的串级名字。
4 public void printStackTrace()
打印toString()结果和栈层次到System.err,即错误输出流。
5 public StackTraceElement [] getStackTrace()
返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
6 public Throwable fillInStackTrace()
用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

《捕获异常》

使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

实例

下面的例子中声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常。

ExcepTest.java 文件代码:
// 文件名 : ExcepTest.java
import java.io.*;
public class ExcepTest{

public static void main(String args[]){
try{
int a[] = new int[2];
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
System.out.println("Out of the block");
}
}
以上代码编译运行输出结果如下:

Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

《多重捕获块》

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

多重捕获块的语法如下所示:

try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
上面的代码段包含了 3 个 catch块。

可以在 try 语句后面添加任意数量的 catch 块。

如果保护代码中发生异常,异常被抛给第一个 catch 块。

如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

如果不匹配,它会被传递给第二个 catch 块。

如此,直到异常被捕获或者通过所有的 catch 块。

实例

该实例展示了怎么使用多重 try/catch。

try
{
file = new FileInputStream(fileName);
x = (byte) file.read();
}catch(IOException i)
{
i.printStackTrace();
return -1;
}catch(FileNotFoundException f) //Not valid!
{
f.printStackTrace();
return -1;
}

《throws/throw 关键字》

如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:

import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException:

import java.io.*;
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}

《finally关键字》

finally 关键字用来创建在 try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

finally 代码块出现在 catch 代码块最后,语法如下:

try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
实例

ExcepTest.java 文件代码:
public class ExcepTest{
public static void main(String args[]){
int a[] = new int[2];
try{
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
finally{
a[0] = 6;
System.out.println("First element value: " +a[0]);
System.out.println("The finally statement is executed");
}
}
}
以上实例编译运行结果如下:

Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed
注意下面事项:

catch 不能独立于 try 存在。
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try, catch, finally 块之间不能添加任何代码。

《声明自定义异常》

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
可以像下面这样定义自己的异常类:

class MyException extends Exception{
}
只继承Exception 类来创建的异常类是检查性异常类。

下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。

一个异常类和其它任何类一样,包含有变量和方法。

实例

以下实例是一个银行账户的模拟,通过银行卡的号码完成识别,可以进行存钱和取钱的操作。

InsufficientFundsException.java 文件代码:
// 文件名InsufficientFundsException.java
import java.io.*;

//自定义异常类,继承Exception类
public class InsufficientFundsException extends Exception
{
//此处的amount用来储存当出现异常(取出钱多于余额时)所缺乏的钱
private double amount;
public InsufficientFundsException(double amount)
{
this.amount = amount;
}
public double getAmount()
{
return amount;
}
}
为了展示如何使用我们自定义的异常类,

在下面的 CheckingAccount 类中包含一个 withdraw() 方法抛出一个 InsufficientFundsException 异常。

CheckingAccount.java 文件代码:
// 文件名称 CheckingAccount.java
import java.io.*;

//此类模拟银行账户
public class CheckingAccount
{
//balance为余额,number为卡号
private double balance;
private int number;
public CheckingAccount(int number)
{
this.number = number;
}
//方法:存钱
public void deposit(double amount)
{
balance += amount;
}
//方法:取钱
public void withdraw(double amount) throws
InsufficientFundsException
{
if(amount <= balance)
{
balance -= amount;
}
else
{
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
//方法:返回余额
public double getBalance()
{
return balance;
}
//方法:返回卡号
public int getNumber()
{
return number;
}
}
下面的 BankDemo 程序示范了如何调用 CheckingAccount 类的 deposit() 和 withdraw() 方法。

BankDemo.java 文件代码:
//文件名称 BankDemo.java
public class BankDemo
{
public static void main(String [] args)
{
CheckingAccount c = new CheckingAccount(101);
System.out.println("Depositing $500...");
c.deposit(500.00);
try
{
System.out.println("\nWithdrawing $100...");
c.withdraw(100.00);
System.out.println("\nWithdrawing $600...");
c.withdraw(600.00);
}catch(InsufficientFundsException e)
{
System.out.println("Sorry, but you are short $"
+ e.getAmount());
e.printStackTrace();
}
}
}
编译上面三个文件,并运行程序 BankDemo,得到结果如下所示:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
at CheckingAccount.withdraw(CheckingAccount.java:25)
at BankDemo.main(BankDemo.java:13)

《通用异常》
在Java中定义了两种类型的异常和错误。

JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。
程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。

《安卓开发前沿》

Android编程是基于Java编程语言的,因此,如果你理解Java编程,这将利于你更好的学习Android应用程序开发。

《Android 应用程序组件》

应用程序组件是一个Android应用程序的基本构建块。这些组件由应用清单文件松耦合的组织。AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互。

以下是可以在Android应用程序中使用的四个主要组件。

(Activities) 描述UI,并且处理用户与机器屏幕的交互。 (Services) 处理与应用程序关联的后台操作。 (Broadcast Receivers) 处理Android操作系统和应用程序之间的通信。 (Content Providers) 处理数据和数据库管理方面的问题。

下面仔细说明,四个用法。

《Activities 组件》

一个活动标识一个具有用户界面的单一屏幕。举个例子,一个邮件应用程序可以包含一个活动用于显示新邮件列表,另一个活动用来编写邮件,再一个活动来阅读邮件。当应用程序拥有多于一个活动,其中的一个会被标记为当应用程序启动的时候显示。

一个活动是Activity类的一个子类,如下所示:

public class MainActivity extends Activity {

}

《Services 组件》

服务是运行在后台,执行长时间操作的组件。举个例子,服务可以是用户在使用不同的程序时在后台播放音乐,或者在活动中通过网络获取数据但不阻塞用户交互。

一个服务是Service类的子类,如下所示:

public class MyService extends Service {

}

《Broadcast Receivers 组件》 广播接收器简单地响应从其他应用程序或者系统发来的广播消息。举个例子,应用程序可以发起广播来让其他应用程序指导一些数据已经被下载到设备,并且可以供他们使用。因此广播接收器会拦截这些通信并采取适当的行动。

广播接收器是BroadcastReceiver类的一个子类,每个消息以Intent对象的形式来广播。

public class MyReceiver extends BroadcastReceiver {

}

《Content Providers 活动》

内容提供者组件通过请求从一个应用程序到另一个应用程序提供数据。这些请求由ContentResolver类的方法来处理。这些数据可以是存储在文件系统、数据库或者其他其他地方。

内容提供者是ContentProvider类的子类,并实现一套标准的API,以便其他应用程序来执行事务。

public class MyContentProvider extends ContentProvider {

}

《附件组件》

有一些附件的组件用于以上提到的实体、他们之间逻辑、及他们之间连线的构造。这些组件如下:

组件 描述 (Fragments) 代表活动中的一个行为或者一部分用户界面。 (Views) 绘制在屏幕上的UI元素,包括按钮,列表等。 (Layouts) 控制屏幕格式,展示视图外观的View的继承。 (Intents) 组件间的消息连线。 (Resources) 外部元素,例如字符串资源、常量资源及图片资源等。 (Manifest) 应用程序的配置文件。

《Android应用程序剖析》

在运行应用之前,你需要知道Android项目中的一些文件目录和文件 -

序号 文件夹、文件和说明 1 src:包含项目中所有的.java源文件,默认情况下,它包括一个 MainActivity.java源文件对应的活动类,当应用程序通过应用图标启动时,将运行它。 2 gen:这包含由编译器生成的.R文件,引用了所有项目中的资源。该文件不能被修改。 3 bin:这个文件夹包含Android由APT构建的.apk包文件,以及运行Android应用程序所需要的其他所有东西。 4 res/drawable-hdpi:这个目录下包括所有的为高密度屏幕设计所需的drawable对象。 5 res/layout:这个目录存放用于定义用户界面的文件。 6 res/values:这个目录存放各种各样的包含一系列资源的XML文件,比如字符串和颜色的定义。 7 AndroidManifest.xml:这个是应用程序的清单文件,描述了应用程序的基础特性,定义它的各种组件。

《主要活动文件》

主要活动代码在MainActivity.java的Java文件中。这是实际的应用程序文件,将被转化为Dalvik可执行文件并运行。下面是由应用向导为Hello World应用生成的默认代码 -

package com.example.helloworld;

import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

}

@Override public boolean onCreateOptionsMenu(Menu menu) {

  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;

} } 这里,R.layout.activity_main引用自res/layout目录下的activity_main.xml文件。onCreate()是活动被加载之后众多被调用的方法之一。

《Manifest文件》 无论你开发什么组件用作应用程序中的一部分,都需要在应用程序项目根目录下的manifest.xml文件中声明所有的组件。这个文件是Android操作系统与你的应用程序之间的接口,因此,如果没有在这个文件中声明你的组件,将无法被操作系统所识别。举个例子,一个默认的清单文件看起来如下:

<manifest xmlns:android="schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0" >

<uses-sdk

  android:minSdkVersion="8"
  android:targetSdkVersion="22" />

<application

   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >

   <activity
      android:name=".MainActivity"
      android:label="@string/title_activity_main" >

      <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>

   </activity>

这里,...标签之间是应用程序相关的组件。andnroid:icon属性指出位于res/drawable-hdpi下面的应用程序图标。这个应用使用drawable文件夹下名为ic_launcher.png的图片。

标签用于指定一个活动,android:name属性指定一个Activity类子类的全名。android:label属性指定用于活动名称的字符串。可以使用标签来指定多个活动。

意图过滤器的action被命名为android.intent.action.MAIN,表明这个活动被用做应用程序的入口。意图过滤器的category被命名为android.intent.category.LAUNCHER,表明应用程序可以通过设备启动器的图标来启动。

@string指的是strings.xml(将在后面介绍)。因此,@string/app_name指的是定义在strings.xml中的app_name,实际为"Hello World"。类似的,应用中的其他字符串也很流行。

《Strings 文件》

strings.xml文件在res/value文件夹下,它包含应用程序使用到的所有文本。例如,按钮、标签的名称,默认文本,以及其他相似的strings。这个文件为他们的文本内容负责。一个默认的strings文件看起来如下:

HelloWorld Hello world! Settings MainActivity

《R 文件》 gen/com.example.helloworld/R.java文件是活动的Java文件,如MainActivity.java的和资源如strings.xml之间的胶水。这是一个自动生成的文件,不要修改R.java文件的内容。下面是一个R.java文件的示例:

/ AUTO-GENERATED FILE. DO NOT MODIFY.

package com.example.helloworld;

public final class R { public static final class attr { }

public static final class dimen {

  public static final int padding_large=0x7f040002;
  public static final int padding_medium=0x7f040001;
  public static final int padding_small=0x7f040000;

}

public static final class drawable {

  public static final int ic_action_search=0x7f020000;
  public static final int ic_launcher=0x7f020001;

}

public static final class id {

  public static final int menu_settings=0x7f080000;

}

public static final class layout {

  public static final int activity_main=0x7f030000;

}

public static final class menu {

  public static final int activity_main=0x7f070000;

}

public static final class string {

  public static final int app_name=0x7f050000;
  public static final int hello_world=0x7f050001;
  public static final int menu_settings=0x7f050002;
  public static final int title_activity_main=0x7f050003;

}

public static final class style {

  public static final int AppTheme=0x7f060000;

} }

《Layout 文件》 activity_main.xml是一个在res/layout目录下的layout文件。当应用程序构建它的界面时被引用。你将非常频繁的修改这个文件来改变应用程序的布局。在"Hello World"应用程序中,这个文件具有默认的布局,内容如下:

<RelativeLayout xmlns:android="schemas.android.com/apk/res/android" xmlns:tools="schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" >

<TextView

  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerHorizontal="true"
  android:layout_centerVertical="true"
  android:padding="@dimen/padding_medium"
  android:text="@string/hello_world"
  tools:context=".MainActivity" />

这是一个简单的RelativeLayout的示例,更多内容会在独立的章节中讲解。TextView是一个Android的控件用于构建用户图形界面。它包含有许多不同的属性,诸如android:layout_width, android:layout_height等用来设置它的宽度和高度等。@string指的是res/values文件夹下的strings.xml文件。因此,@string/hello_world指的是定义在strings.xml中的名为hello的字符串:"Hello World!"。

《List View 列表使用》

String[] companies = new String[] { "Google", "Apple", "Facebook",
    "Blackberry", "Samsung", "Twitter", "Intel", "HTC", "Asus" };
    //创建数组
ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, companies);
//设置,R.布局文件,companies变量
ListView listView = (ListView) findViewById(R.id.mainListView1);
listView.setAdapter(adapter);

listView.setOnItemClickListener(new OnItemClickListener() {

//列表点击事件,下面可自动补齐

        @Override
        public void onItemClick(AdapterView<?> l, View v, int position, long id)
        {
            String s = (String) l.getItemAtPosition(position);
            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show() ;
            //获取内容提示
        }
    });

    ListAdapter adapter = new ArrayAdapter< String > (this, R.layout.entry, R.id.entryTextView1, companies); 

//自定义list(界面,控件id,内容)

《Activity 绑定界面》

package com.demo.test;

import android.app.Activity; import android.os.Bundle;

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

/方法1 setContentView setContentView(R.layout.activity_main); /

/方法2 先得到一个窗体,利用窗体绑定view ,view是用inflater压力泵压过来 this.getWindow().setContentView(this.getLayoutInflater().inflate(R.layout.activity_main, null)); /

} }

《Action Bar 标题栏修改》

ActionBar actionBar=getActionBar(); //获取标题栏对象给actionBar

actionBar.setDisplayShowTitleEnabled(false); //隐藏leble标签 actionBar.setDisplayShowHomeEnabled(false); //隐藏logo,icon

设置标题栏: actionBar.setSubtitle("Inbox"); actionBar.setTitle("Label:important"); //主标题,子标题

Resources r = getResources();

Drawable myDrawable = r.getDrawable(R.drawable.ic_launcher); actionBar.setBackgroundDrawable(myDrawable); //设置标题栏Background,ic_launcher为资源图片,需自动补齐类

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); //标题栏浮于Activity上,需写在setContentView(R.layout.main);代码上面

《菜单的使用和menu属性》

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate main_menu.xml 
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;

}

//创建菜单menu public boolean onOptionsItemSelected(MenuItem item)

{ //点击菜单事件

switch (item.getItemId())
{
    case R.id.mainMenuAbout:
        Toast.makeText(this, "This is my app!!!", Toast.LENGTH_SHORT).show();
        return true;
    case R.id.mainMenuExit:
        finish();
        return true;
    case R.id.b:
        Toast.makeText(this, "提示", Toast.LENGTH_SHORT).show();
        break;

}

return false;

}

//menu属性 title:菜单项标题(菜单项显示的文本)

titleCondensed:菜单项的短标题。当菜单项标题太长时会显示该属性值

icon:菜单项图标资源ID

alphabeticShortcut:菜单项的字母快捷键

numericShortcut:菜单项的数字快捷键

checkable:表示菜单项是否带复选框。该属性可设计为true或false

checked:如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为true或false

visible:菜单项默认状态是否可视

enable:菜单项默认状态是否被激活

《在eclipse中组织资源》

你需要将每种资源放置在项目中 res/ 目录的特定子目录下。例如,这是一个简单项目的文件层级:

MyProject/

src/  
    MyActivity.java  
res/
    drawable/  
        icon.png  
    layout/  
        activity_main.xml
        info.xml
    values/  
        strings.xml 

res/ 目录在各种子目录中包含了所有的资源。这里有一个图片资源,两个布局资源和一个字符串资源文件。下表详细的给出了在项目中 res/ 目录里面支持的资源。

目录 资源类型 anim/ 定义动画属性的XML文件。它们被保存在res/anim/文件夹下,通过R.anim类访问

color/ 定义颜色状态列表的XML文件。它们被保存在res/color/文件夹下,通过R.color类访问

drawable/ 图片文件,如.png,.jpg,.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问

layout/ 定义用户界面布局的XML文件。它们被保存在res/layout/文件夹下,通过R.layout类访问

menu/ 定义应用程序菜单的XML文件,如选项菜单,上下文菜单,子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问

raw/ 任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource()来打开raw文件

values/ 包含简单值(如字符串,整数,颜色等)的XML文件。这里有一些文件夹下的资源命名规范。arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问

xml/ 可以通过调用Resources.getXML()来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件

《替代资源》

你的应用程序需要为特定的设备配置提供替代的资源支持。比如说,你需要为不同的屏幕分辨率提供替代的图片资源,为不同的语言提供替代的字符串资源。在运行时,Android 检测当前设备配置,并为应用程序加载合适的资源。

要为特定的配置的确定一系列替代资源,遵循如下的步骤:

在res/ 下创建一个新的目录,以 _ 的方式命名。这里的 resources_name 是上表中提到的任意资源,如布局、图片等。 qualifier 将确定个性的配置使用哪些资源。你可以查看官方文档来了解不同类型资源的一个完整 qualifier 列表。 在这个目录中保存响应的替代资源。这些资源文件必须与下面例子中展示的默认资源文件名一致,然而这些文件将确定的内容进行替代。例如:虽然图片的文件名一样,但是高分辨率的屏幕,图片的分辨率也会高。 下面是一个例子,指定默认屏幕的图片和高分辨率的替代图片。

MyProject/ src/

main/
java/
   MyActivity.java  
   res/
      drawable/  
        icon.png
        background.png
    drawable-hdpi/  
        icon.png
        background.png  
    layout/  
        activity_main.xml
        info.xml
    values/  
        strings.xml

下面是另外一个例子,指定默认语言的布局和阿拉伯语言的替代布局。

MyProject/ src/

main/
java/
   MyActivity.java  
  res/
     drawable/  
        icon.png
        background.png
    drawable-hdpi/  
        icon.png
        background.png  
    layout/  
        activity_main.xml
        info.xml
    layout-ar/
        main.xml
    values/  
        strings.xml

《在代码访问资源》

当 Android 应用程序被编译,生成一个 R 类,其中包含了所有 res/ 目录下资源的 ID。你可以使用 R 类,通过子类+资源名或者直接使用资源 ID 来访问资源。

实例

访问 res/drawable/myimage.png,并将其设置到 ImageView 上,你将使用以下代码:

ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage); 这里第一行代码用 R.id.myimageview 来在布局文件中获取定义为 myimageview 的 ImageView。第二行用 R.drawable.myimage 来获取在 res/ 的 drawable 子目录下名为 myimage 的图片。

实例

考虑下一个例子,其中 res/values/strings.xml 有如下定义:

<?xml version="1.0" encoding="utf-8"?>

Hello, World!

现在你可以在 ID 为 msg 的 TextView 对象上使用资源 ID 来设置文本,具体如下:

TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello); 实例

考虑如下定义的布局 res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >

<TextView android:id="@+id/text"

  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Hello, I am a TextView" />

<Button android:id="@+id/button"

  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Hello, I am a Button" />

这个应用程序代码将为活动加载这个布局,onCreate() 方法中如下:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity);

《在XML中访问》

考虑下面的 XML 资源文件 res/values/strings.xml,其中包含一个颜色资源和一个字符串资源 -

<?xml version="1.0" encoding="utf-8"?>

#f00 Hello!

现在,你可以在下面的布局文件中使用这些资源来设置文本颜色和文本内容:

<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="schemas.android.com/apk/res/android"

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="@string/hello" />

《findViewByld 获取ID》

TextView textView = (TextView) findViewById(R.id.mainTextView1)

说明,textView为返回变量,(TextView)为控件类型文本改为对应即可,R.id.为xml分配ID。

控件对应值: TextView=文本 Button=按钮 ...

《setOnClickListener 事件监听器》

ID.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View p1)
        {
            //代码
        }
    });

控件长按事件

ID.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(View p1)
        {
            //代码
            return false;
            //true,表示已处理
        }
    });
    说明:ID为获取控件ID。

  《set 设置控件属性》

        ID.setText("内容");
        ID.setTextSize("20dp")

        说明:ID为获取ID,set后面跟控件类型首首字母大写,()内为设置内容,如果是设置变量要加.toString();

        《intent 切换界面》

        Intent intent=new Intent(MainActivity.this,two.class);

startActivity(intent);

《get 获取控件内容》

String m=id.getText().toString();

//等待更新

《AndroidManifest.xml 属性说明1-15》

一、关于AndroidManifest.xml

AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

二、AndroidManifest.xml结构

<?xmlversion="1.0"encoding="utf-8"?>

三、各个节点的详细介绍

上面就是整个am(androidManifest).xml的结构,下面以外向内开始阐述~~(1-14)

《1、第一层():(属性)》

<manifest xmlns:android="schemas.android.com/apk/res/android"

  package="com.woody.test"
  android:sharedUserId="string"
  android:sharedUserLabel="string resource"
  android:versionCode="integer"
  android:versionName="string"
  android:installLocation=["auto" | "internalOnly" | "preferExternal"] >

A、xmlns:android

定义android命名空间,一般为schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

B、package

指定本应用内java主程序包的包名,它也是一个应用进程的默认名称

C、sharedUserId

表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。

D、sharedUserLabel

一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义

E、versionCode

是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。

F、versionName

这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。

G、installLocation

安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal

选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)

选择auto,系统将会根据存储空间自己去适应

选择internalOnly是指必须安装到内部才能运行

(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)

《2、第二层():属性》

一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon,label,permission等)

<application android:allowClearUserData=["true" | "false"]

     android:allowTaskReparenting=["true" | "false"]
     android:backupAgent="string"
     android:debuggable=["true" | "false"]
     android:description="string resource"
     android:enabled=["true" | "false"]
     android:hasCode=["true" | "false"]
     android:icon="drawable resource"
     android:killAfterRestore=["true" | "false"]
     android:label="string resource"
     android:manageSpaceActivity="string"
     android:name="string"
     android:permission="string"
     android:persistent=["true" | "false"]
     android:process="string"
     android:restoreAnyVersion=["true" | "false"]
     android:taskAffinity="string"
     android:theme="resource or theme" >

A、android:allowClearUserData('true' or 'false')

用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然

B、android:allowTaskReparenting('true' or 'false')

是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务

C、android:backupAgent

这也是Android2.2中的一个新特性,设置该APP的备份,属性值应该是一个完整的类名,如com.project.TestCase,此属性并没有默认值,并且类名必须得指定(就是个备份工具,将数据备份到云端的操作)

D、android:debuggable

这个从字面上就可以看出是什么作用的,当设置为true时,表明该APP在手机上可以被调试。默认为false,在false的情况下调试该APP,就会报以下错误:

Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.

Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.

E、android:description/android:label

此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生

F、android:enabled

Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。

G、android:hasCode('true' or 'false')

表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码

一个应用程序自身不会含有任何的代码,除非内置组件类,比如Activity类,此类使用了AliasActivity类,当然这是个罕见的现象

(在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,因为这个APP本身已经不含有任何的JAVA代码了)

H、android:icon

这个很简单,就是声明整个APP的图标,图片一般都放在drawable文件夹下

I、android:killAfterRestore

J、android:manageSpaceActivity

K、android:name

为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。

若该类(比方androidMain类)是在声明的package下,则可以直接声明android:name="androidMain",但此类是在package下面的子包的话,就必须声明为全路径或android:name="package名称.子包名成.androidMain"

L、android:permission

设置许可名,这个属性若在上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的

M、android:presistent

该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。

N、android:process

应用程序运行的进程名,它的默认值为元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候

O、android:restoreAnyVersion

同样也是android2.2的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是false

P、android:taskAffinity

拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是元素中设定的package名

Q、android:theme

是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。

《3、第三层():属性》

<activity android:allowTaskReparenting=["true" | "false"]

  android:alwaysRetainTaskState=["true" | "false"]
  android:clearTaskOnLaunch=["true" | "false"]
  android:configChanges=["mcc", "mnc", "locale",
                         "touchscreen", "keyboard", "keyboardHidden",
                         "navigation", "orientation", "screenLayout",
                         "fontScale", "uiMode"]
  android:enabled=["true" | "false"]
  android:excludeFromRecents=["true" | "false"]
  android:exported=["true" | "false"]
  android:finishOnTaskLaunch=["true" | "false"]
  android:icon="drawable resource"
  android:label="string resource"
  android:launchMode=["multiple" | "singleTop" |
                      "singleTask" | "singleInstance"]
  android:multiprocess=["true" | "false"]
  android:name="string"
  android:noHistory=["true" | "false"]  
  android:permission="string"
  android:process="string"
  android:screenOrientation=["unspecified" | "user" | "behind" |
                             "landscape" | "portrait" |
                             "sensor" | "nosensor"]
  android:stateNotNeeded=["true" | "false"]
  android:taskAffinity="string"
  android:theme="resource or theme"
  android:windowSoftInputMode=["stateUnspecified",
                               "stateUnchanged", "stateHidden",
                               "stateAlwaysHidden", "stateVisible",
                               "stateAlwaysVisible", "adjustUnspecified",
                               "adjustResize", "adjustPan"] >   

(注:有些在application中重复的就不多阐述了)

1、android:alwaysRetainTaskState

是否保留状态不变, 比如切换回home, 再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true

2、android:clearTaskOnLaunch 比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 重新启动 P,是否显示 Q

3、android:configChanges

当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation". 这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到呢? 正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载. 如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.

4、android:excludeFromRecents

是否可被显示在最近打开的activity列表里,默认是false

5、android:finishOnTaskLaunch

当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false

如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented

6、android:launchMode(Activity加载模式)

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式

Activity有四种加载模式:

standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard

standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。

singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例

singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

singleInstance:

首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效

7、android:multiprocess

是否允许多进程,默认是false

具体可看该篇文章:www.bangchui.org/simple/?t3181.html

8、android:noHistory

当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹

9、android:screenOrientation

activity显示的模式

默认为unspecified:由系统自动判断显示方向

landscape横屏模式,宽度比高度大

portrait竖屏模式, 高度比宽度大

user模式,用户当前首选的方向

behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)

sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换

nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了

10、android:stateNotNeeded

activity被销毁或者成功重启时是否保存状态

11、android:windowSoftInputMode

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。

这个属性能影响两件事情:

〔A〕当有焦点产生时,软键盘是隐藏还是显示

〔B〕是否减少活动主窗口大小以便腾出空间放软键盘

各值的含义:

〔A〕stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

〔B〕stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

〔C〕stateHidden:用户选择activity时,软键盘总是被隐藏

〔D〕stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

〔E〕stateVisible:软键盘通常是可见的

〔F〕stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

〔G〕adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

〔H〕adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

〔I〕adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

《4、第四层()》

结构图:

<intent-filter android:icon="drawable resource"

       android:label="string resource"
       android:priority="integer" >
intent-filter属性 android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高) Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料作对比动作 action属性 action很简单,只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。有关android:name具体有哪些值,可参照这个网址:hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html category属性 category也只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里) 有关android:name具体有哪些值,可参照这个网址:chroya.javaeye.com/blog/685871 data属性 〔1〕每个元素指定一个URI和数据类型(MIME类型)。它有四个属性scheme、host、port、path对应于URI的每个部分: scheme://host:port/path scheme的值一般为"http",host为包名,port为端口号,path为具体地址。如:com.test.project:200/folder/etc 其中host和port合起来构成URI的凭据(authority),如果host没有指定,则port也会被忽略 要让authority有意义,scheme也必须要指定。要让path有意义,scheme+authority也必须要指定 〔2〕mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件 〔3〕而pathPattern和PathPrefix主要是为了格式化path所使用的 《5、第五层》 这是该元素的基本结构.可以包含在 四个元素中。 android:name(解释:元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried) android:resource(解释:资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。) android:value(解释:指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean]) 《6、第六层》 是为activity创建快捷方式的,如下实例: 其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名) android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标 《7、第七层》 〔1〕service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的 〔2〕service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法 〔3〕service与activity间的通信 Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责。具体可参照:zhangyan1158.blog.51cto.com/2487362/491358 〔4〕 service标签内的属性之前已有描述,在此不重复了~ 《8、第八层》 receiver的属性与service一样,这里就不显示了 BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,具体参照kevin2562.javaeye.com/blog/686787 《9、第九层属性》 contentProvider(数据存储) 〔1〕android:authorities: 标识这个ContentProvider,调用者可以根据这个标识来找到它 〔2〕android:grantUriPermission: 对某个URI授予的权限 〔3〕android:initOrder 《11、第十层》 这是在android1.6以后的新特性,支持多屏幕机制 各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度 《12、第十一层》 这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。 《13、第十二层》 描述应用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3 在此属性中可以指定支持的最小版本,目标版本以及最大版本 《14、第十三层》 定义一些用于探测和分析应用性能等等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化 android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false) 《14丶其他》 最常用的当属,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明,此与同级,具体权限列表请看此处 通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用 这个标签。很显然这个标签可以让我们声明自己的权限。比如: 那么在activity中就可以声明该自定义权限了,如: android:permission="com.teleca.project.MY_SECURITY"> 当然自己声明的permission也不能随意的使用,还是需要使用来声明你需要该权限 就是声明一个标签,该标签代表了一组permissions,而是为一组permissions声明了一个namespace。这两个标签可以看之前的系列文章。 《Android 权限大全》 访问网络 android.permission.INTERNET,访问网络连接,可能产生GPRS流量 android.permission.CHANGE_WIFI_STATE Wifi 改变状态 android.permission.ACCESS_WIFI_STATE WiFi 状态 android.permission.ACCESS_NETWORK_STATE 网络状态 录制视频 android.permission.CAMERA android.permission.RECORD_AUDIO android.permission.WRITE_EXTERNAL_STORAGE 底层访问权限 android.permission.CWJ_GROUP,允许CWJ账户组访问底层信息 手机优化大师扩展权限 android.permission.CELL_PHONE_MASTER_EX,手机优化大师扩展权限 控制定位更新 android.permission.CONTROL_LOCATION_UPDATES,允许获得移动网络定位信息改变 删除缓存文件 android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件 删除应用 android.permission.DELETE_PACKAGES,允许程序删除应用 电源管理 android.permission.DEVICE_POWER,允许访问底层电源管理 应用诊断 android.permission.DIAGNOSTIC,允许程序到RW到诊断资源 禁用键盘锁 android.permission.DISABLE_KEYGUARD,允许程序禁用键盘锁 转存系统信息 android.permission.DUMP,允许程序获取系统dump信息从系统服务 状态栏控制 android.permission.EXPAND_STATUS_BAR,允许程序扩展或收缩状态栏 工厂测试模式 android.permission.FACTORY_TEST,允许程序运行工厂测试模式 使用闪光灯 android.permission.FLASHLIGHT,允许访问闪光灯 强制后退 android.permission.FORCE_BACK,允许程序强制使用back后退按键,无论Activity是否在顶层 访问账户Gmail列表 android.permission.GET_ACCOUNTS,访问GMail账户列表 获取应用大小 android.permission.GET_PACKAGE_SIZE,获取应用的文件大小 获取任务信息 android.permission.GET_TASKS,允许程序获取当前或最近运行的应用 允许全局搜索 android.permission.GLOBAL_SEARCH,允许程序使用全局搜索功能 硬件测试 android.permission.HARDWARE_TEST,访问硬件辅助设备,用于硬件测试 注射事件 android.permission.INJECT_EVENTS,允许访问本程序的底层事件,获取按键、轨迹球的事件流 安装定位提供 android.permission.INSTALL_LOCATION_PROVIDER,安装定位提供 安装应用程序 android.permission.INSTALL_PACKAGES,允许程序安装应用 内部系统窗口 android.permission.INTERNAL_SYSTEM_WINDOW,允许程序打开内部窗口,不对第三方应用程序开放此权限 结束后台进程 android.permission.KILL_BACKGROUND_PROCESSES,允许程序调用killBackgroundProcesses(String).方法结束后台进程 管理账户 android.permission.MANAGE_ACCOUNTS,允许程序管理AccountManager中的账户列表 管理程序引用 android.permission.MANAGE_APP_TOKENS,管理创建、摧毁、Z轴顺序,仅用于系统 高级权限 android.permission.MTWEAK_USER,允许mTweak用户访问高级系统权限 社区权限 android.permission.MTWEAK_FORUM,允许使用mTweak社区权限 软格式化 android.permission.MASTER_CLEAR,允许程序执行软格式化,删除系统配置信息 修改声音设置 android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息 修改电话状态 android.permission.MODIFY_PHONE_STATE,修改电话状态,如飞行模式,但不包含替换系统拨号器界面 格式化文件系统 android.permission.MOUNT_FORMAT_FILESYSTEMS,格式化可移动文件系统,比如格式化清空SD卡 挂载文件系统 android.permission.MOUNT_UNMOUNT_FILESYSTEMS,挂载、反挂载外部文件系统 允许NFC通讯 android.permission.NFC,允许程序执行NFC近距离通讯操作,用于移动支持 永久Activity android.permission.PERSISTENT_ACTIVITY,创建一个永久的Activity,该功能标记为将来将被移除 处理拨出电话 android.permission.PROCESS_OUTGOING_CALLS,允许程序监视,修改或放弃播出电话 读取日程提醒 android.permission.READ_CALENDAR,允许程序读取用户的日程信息 读取联系人 android.permission.READ_CONTACTS,允许应用访问联系人通讯录信息 屏幕截图 android.permission.READ_FRAME_BUFFER,读取帧缓存用于屏幕截图 读取收藏夹和历史记录 com.android.browser.permission.READ_HISTORY_BOOKMARKS,读取浏览器收藏夹和历史记录 读取输入状态 android.permission.READ_INPUT_STATE,读取当前键的输入状态,仅用于系统 读取系统日志 android.permission.READ_LOGS,读取系统底层日志 读取电话状态 android.permission.READ_PHONE_STATE,访问电话状态 读取短信内容 android.permission.READ_SMS,读取短信内容 读取同步设置 android.permission.READ_SYNC_SETTINGS,读取同步设置,读取Google在线同步设置 读取同步状态 android.permission.READ_SYNC_STATS,读取同步状态,获得Google在线同步状态 重启设备 android.permission.REBOOT,允许程序重新启动设备 开机自动允许 android.permission.RECEIVE_BOOT_COMPLETED,允许程序开机自动运行 接收彩信 android.permission.RECEIVE_MMS,接收彩信 接收短信 android.permission.RECEIVE_SMS,接收短信 接收Wap Push android.permission.RECEIVE_WAP_PUSH,接收WAP PUSH信息 录音 android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克 排序系统任务 android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务 结束系统任务 android.permission.RESTART_PACKAGES,结束任务通过restartPackage(String)方法,该方式将在外来放弃 发送短信 android.permission.SEND_SMS,发送短信 设置Activity观察其 android.permission.SET_ACTIVITY_WATCHER,设置Activity观察器一般用于monkey测试 设置闹铃提醒 com.android.alarm.permission.SET_ALARM,设置闹铃提醒 设置总是退出 android.permission.SET_ALWAYS_FINISH,设置程序在后台是否总是退出 设置动画缩放 android.permission.SET_ANIMATION_SCALE,设置全局动画缩放 设置调试程序 android.permission.SET_DEBUG_APP,设置调试程序,一般用于开发 设置屏幕方向 android.permission.SET_ORIENTATION,设置屏幕方向为横屏或标准方式显示,不用于普通应用 设置应用参数 android.permission.SET_PREFERRED_APPLICATIONS,设置应用的参数,已不再工作具体查看addPackageToPreferred(String)介绍 设置进程限制 android.permission.SET_PROCESS_LIMIT,允许程序设置最大的进程数量的限制 设置系统时间 android.permission.SET_TIME,设置系统时间 设置系统时区 android.permission.SET_TIME_ZONE,设置系统时区 设置桌面壁纸 android.permission.SET_WALLPAPER,设置桌面壁纸 设置壁纸建议 android.permission.SET_WALLPAPER_HINTS,设置壁纸建议 发送永久进程信号 android.permission.SIGNAL_PERSISTENT_PROCESSES,发送一个永久的进程信号 状态栏控制 android.permission.STATUS_BAR,允许程序打开、关闭、禁用状态栏 访问订阅内容 android.permission.SUBSCRIBED_FEEDS_READ,访问订阅信息的数据库 写入订阅内容 android.permission.SUBSCRIBED_FEEDS_WRITE,写入或修改订阅内容的数据库 显示系统窗口 android.permission.SYSTEM_ALERT_WINDOW,显示系统窗口 更新设备状态 android.permission.UPDATE_DEVICE_STATS,更新设备状态 使用证书 android.permission.USE_CREDENTIALS,允许程序请求验证从AccountManager 使用SIP视频 android.permission.USE_SIP,允许程序使用SIP视频服务 使用振动 android.permission.VIBRATE,允许振动 唤醒锁定 android.permission.WAKE_LOCK,允许程序在手机屏幕关闭后后台进程仍然运行 写入GPRS接入点设置 android.permission.WRITE_APN_SETTINGS,写入网络GPRS接入点设置 写入日程提醒 android.permission.WRITE_CALENDAR,写入日程,但不可读取 写入联系人 android.permission.WRITE_CONTACTS,写入联系人,但不可读取 写入外部存储 android.permission.WRITE_EXTERNAL_STORAGE,允许程序写入外部存储,如SD卡上写文件 写入Google地图数据 android.permission.WRITE_GSERVICES,允许程序写入Google Map服务数据 写入收藏夹和历史记录 com.android.browser.permission.WRITE_HISTORY_BOOKMARKS,写入浏览器历史记录或收藏夹,但不可读取 读写系统敏感设置 android.permission.WRITE_SECURE_SETTINGS,允许程序读写系统安全敏感的设置项 读写系统设置 android.permission.WRITE_SETTINGS,允许读写系统设置项 编写短信 android.permission.WRITE_SMS,允许编写短信 写入在线同步设置 android.permission.WRITE_SYNC_SETTINGS,写入Google在线同步设置 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内 访问定位额外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令 GPS定位获取模拟定位信息 android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用 获取网络状态 android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效 访问Surface Flinger android.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图 获取WiFi状态 android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息 账户管理 android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限 验证账户 android.permission.AUTHENTICATE_ACCOUNTS,允许一个程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息 电量统计 android.permission.BATTERY_STATS,获取电池电量统计信息 绑定小插件 android.permission.BIND_APPWIDGET,允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限 绑定设备管理 android.permission.BIND_DEVICE_ADMIN,请求系统管理员接收者receiver,只有系统才能使用 绑定输入法 android.permission.BIND_INPUT_METHOD ,请求InputMethodService服务,只有系统才能使用 绑定RemoteView android.permission.BIND_REMOTEVIEWS,必须通过RemoteViewsService服务来请求,只有系统才能用 绑定壁纸 android.permission.BIND_WALLPAPER,必须通过WallpaperService服务来请求,只有系统才能用 使用蓝牙 android.permission.BLUETOOTH,允许程序连接配对过的蓝牙设备 蓝牙管理 android.permission.BLUETOOTH_ADMIN,允许程序进行发现和配对新的蓝牙设备 变成砖头 android.permission.BRICK,能够禁用手机,非常危险,顾名思义就是让手机变成砖头 应用删除时广播 android.permission.BROADCAST_PACKAGE_REMOVED,当一个应用在删除时触发一个广播 收到短信时广播 android.permission.BROADCAST_SMS,当收到短信时触发一个广播 连续广播 android.permission.BROADCAST_STICKY,允许一个程序收到广播后快速收到下一个广播 WAP PUSH广播 android.permission.BROADCAST_WAP_PUSH,WAP PUSH服务收到后触发一个广播 拨打电话 android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码 通话权限 android.permission.CALL_PRIVILEGED,允许程序拨打电话,替换系统的拨号器界面 拍照权限 android.permission.CAMERA,允许访问摄像头进行拍照 改变组件状态 android.permission.CHANGE_COMPONENT_ENABLED_STATE,改变组件是否启用状态 改变配置 android.permission.CHANGE_CONFIGURATION,允许当前应用改变配置,如定位 改变网络状态 android.permission.CHANGE_NETWORK_STATE,改变网络状态如是否能联网 改变WiFi多播状态 android.permission.CHANGE_WIFI_MULTICAST_STATE,改变WiFi多播状态 改变WiFi状态 android.permission.CHANGE_WIFI_STATE,改变WiFi状态 清除应用缓存 android.permission.CLEAR_APP_CACHE,清除应用缓存 清除用户数据 android.permission.CLEAR_APP_USER_DATA,清除应用的用户数据 《Theme 主题大全》 android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式 android:theme="@android:style/Theme.NoTitleBar" 不显示应用程序标题栏 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 不显示应用程序标题栏,并全屏 android:theme="Theme.Light " 背景为白色 android:theme="Theme.Light.NoTitleBar" 白色背景并无标题栏 android:theme="Theme.Light.NoTitleBar.Fullscreen" 白色背景,无标题栏,全屏 android:theme="Theme.Black" 背景黑色 android:theme="Theme.Black.NoTitleBar" 黑色背景并无标题栏 android:theme="Theme.Black.NoTitleBar.Fullscreen" 黑色背景,无标题栏,全屏 android:theme="Theme.Wallpaper" 用系统桌面为应用程序背景 android:theme="Theme.Wallpaper.NoTitleBar" 用系统桌面为应用程序背景,且无标题栏 android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" 用系统桌面为应用程序背景,无标题栏,全屏 android:theme="Theme.Translucent " 透明背景 android:theme="Theme.Translucent.NoTitleBar" 透明背景并无标题 android:theme="Theme.Translucent.NoTitleBar.Fullscreen" 透明背景并无标题,全屏 android:theme="Theme.Panel " 面板风格显示 android:theme="Theme.Light.Panel" 平板风格显示 《Onlick 按钮点击事件》 public void onClick(View view) { //事件 } 说明:onClick为分配控件的值。 《Toast 提示内容》 Toast.makeText(this, "内容", Toast.LENGTH_SHORT).show(); Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show() ; //变量型 说明:将 Toast.LENGTH_SHORT 改为 Toast.LENGTH_LONG ,设置更长的提示时间。 《Android 控件属性①》 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物 第二类:属性值必须为id的引用名“@id/id-name” android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 第三类:属性值为具体的像素值,如30dip,40px android:layout_marginBottom 离某元素底边缘的距离 android:layout_marginLeft 离某元素左边缘的距离 android:layout_marginRight 离某元素右边缘的距离 android:layout_marginTop 离某元素上边缘的距离 EditText的android:hint 设置EditText为空时输入框内的提示信息。 android:gravity  android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右 android:layout_gravity android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右 android:scaleType: android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别: CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示 CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽 FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示 FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置 FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置 FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示 MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。 ** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。 《Android 控件属性②》 android:id 为控件指定相应的ID android:text 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串 android:gravity 指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件中的文本位置并不是控件本身 android:layout_gravity 指定Container组件的对齐方式.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为 例,android:layout_gravity="right"则button靠右 android:textSize 指定控件当中字体的大小 android:background 指定该控件所使用的背景色,RGB命名法 android:width 指定控件的宽度 android:height 指定控件的高度 android:layout_width 指定Container组件的宽度 android:layout_height 指定Container组件的高度 android:layout_weight View中很重要的属性,按比例划分空间 android:padding* 指定控件的内边距,也就是说控件当中的内容 android:sigleLine 如果设置为真的话,则控件的内容在同一行中进行显示 android:scaleType 是控制图片如何resized/moved来匹对ImageView的siz android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物 android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 android:layout_marginBottom 离某元素底边缘的距离 android:layout_marginLeft 离某元素左边缘的距离 android:layout_marginRight 离某元素右边缘的距离 android:layout_marginTop 离某元素上边缘的距离 android:paddingLeft 本元素内容离本元素右边缘的距离 android:paddingRight 本元素内容离本元素上边缘的距离 android:hint 设置EditText为空时输入框内的提示信息 android:LinearLayout 它确定了LinearLayout的方向,其值可以为vertical, 表示垂直布局horizontal, 表示水平布局 android:interpolator 可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha,scale,translate,rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下: AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速 AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速 CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线 DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速 LinearInterpolator 在动画的以均匀的速率改变 对于 LinearInterpolator ,变化率是个常数,即 f(x)=x.public float getInterpolation(floatinput) { return input; } Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果。 《TextView 属性汇总》 android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) android:autoText如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。 android:bufferType指定getText()方式取得的文本类别。选项editable 类似于StringBuilder可追加字符,也就是说getText后可调用append方法设置文本内容。spannable 则可在给定的字符区域使用样式,参见这里1、这里2。 android:capitalize设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。 android:cursorVisible设定光标为显示/隐藏,默认显示。 android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()” android:drawableBottom在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。 android:drawableLeft在text的左边输出一个drawable,如图片。 android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。 android:drawableRight在text的右边输出一个drawable。 android:drawableTop在text的正上方输出一个drawable。 android:editable设置是否可编辑。 android:editorExtras设置文本的额外的输入数据。 android:ellipsize设置当文字过长时,该控件该如何显示。有如下值设置:”start”—-省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动) android:freezesText设置保存文本的内容以及光标的位置。 android:gravity设置文本位置,如设置成“center”,文本将居中显示。 android:hintText为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在 EditView中使用,但是这里也可以用。 android:imeOptions附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。 android:imeActionId设置IME动作ID。 android:imeActionLabel设置IME动作标签。 android:includeFontPadding设置文本是否包含顶部和底部额外空白,默认为true。 android:inputMethod为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。 android:inputType设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。 android:linksClickable设置链接是否点击连接,即使设置了autoLink。 android:marqueeRepeatLimit在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为 marquee_forever时表示无限次。 android:ems设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度 android:maxEms设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。 android:minEms设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。 android:maxLength限制显示的文本长度,超出部分不显示。 android:lines设置文本的行数,设置两行就显示两行,即使第二行没有数据。 android:maxLines设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。 android:minLines设置文本的最小行数,与lines类似。 android:lineSpacingExtra设置行间距。 android:lineSpacingMultiplier设置行间距的倍数。如”1.2” android:numeric如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。 android:password以小点”.”显示文本 android:phoneNumber设置为电话号码的输入方式。 android:privateImeOptions设置输入法选项,此处无用,在EditText将进一步讨论。 android:scrollHorizontally设置文本超出TextView的宽度的情况下,是否出现横拉条。 android:selectAllOnFocus如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。 TextView中设置后无效果。 android:shadowColor指定文本阴影的颜色,需要与shadowRadius一起使用。 android:shadowDx设置阴影横向坐标开始位置。 android:shadowDy设置阴影纵向坐标开始位置。 android:shadowRadius设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。 android:singleLine设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行 android:text设置显示文本. android:textAppearance设置文字外。如 “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse android:textColor设置文本颜色 android:textColorHighlight被选中文字的底色,默认为蓝色 android:textColorHint设置提示信息文字的颜色,默认为灰色。与hint一起使用。 android:textColorLink文字链接的颜色. android:textScaleX设置文字之间间隔,默认为1.0f。 android:textSize设置文字大小,推荐度量单位”sp”,如”15sp” android:textStyle设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开 android:typeface设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3] android:height设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米) android:maxHeight设置文本区域的最大高度 android:minHeight设置文本区域的最小高度 android:width设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width 的区别看这里。 android:maxWidth设置文本区域的最大宽度 android:minWidth设置文本区域的最小宽度 《Android activity属性汇总》 android:allowTaskReparenting 是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务。 android:alwaysRetainTaskState 是否保留状态不变, 比如切换回home, 再从新打开, activity处于最后的状态 android:clearTaskOnLanunch 比如P是activity,Q是被P触发的activity,然后返回Home,从新启动P,是否显示Q android:configChanges 当配置list发生修改时,是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation". android:enabled activity 是否可以被实例化, android:excludeFromRecents 是否可被显示在最近打开的activity列表里 android:exported 是否允许activity被其它程序调用 android:finishOnTaskLaunch 是否关闭已打开的activity当用户重新启动这个任务的时候 android.icon android:label android:launchMode activity启动方式,"standard""singleTop""singleTask""singleInstance" 其中前两个为一组, 后两个为一组 android:multiprocess 允许多进程 android:name activity的类名, 必须指定 androidnHistory 是否需要移除这个activity当用户切换到其他屏幕时。这个属性是 API level 3 中引入的 android:permission android:process 一 个activity运行时所在的进程名,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中的元素process属性能够为所有组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。 如果这个属性被分配的名字以:开头,当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。如果这个进程名以小写字母开头,这个activity将会运行在全局的进程中,被它的许可所提供。 android:screenOrientation activity显示的模式, "unspecified" 默认值 "landscape" 风景画模式,宽度比高度大一些 "portrait" 肖像模式, 高度比宽度大。 "user" 用户的设置 "behind" "sensor" "nosensor" android:stateNotNeeded 是否 activity被销毁和成功重启并不保存状态 android:taskAffinity activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系 android:theme activity的样式主题, 如果没有设置,则activity的主题样式从属于应用程序,参见元素的theme属性 android:windowSoftInputMode activity主窗口与软键盘的交互模式, 自从API level 3 被引入 活动的主窗口如何与包含屏幕上的软键盘窗口交互。这个属性的设置将会影响两件事情: 1> 软键盘的状态——是否它是隐藏或显示——当活动(Activity)成为用户关注的焦点。 2> 活动的主窗口调整——是否减少活动主窗口大小以便腾出空间放软键盘或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。 它的设置必须是下面列表中的一个值,或一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用|分开。例如: 在这设置的值(除"stateUnspecified"和"adjustUnspecified"以外)将覆盖在主题中设置的值 值 描述 "stateUnspecified" 软键盘的状态(是否它是隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。这个是为了软件盘行为默认的设置。 "stateUnchanged" 软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。 "stateHidden" 当用户选择该Activity时,软键盘被隐藏——也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。 "stateAlwaysHidden" 软键盘总是被隐藏的,当该Activity主窗口获取焦点时。 "stateVisible" 软键盘是可见的,当那个是正常合适的时(当用户导航到Activity主窗口时)。 "stateAlwaysVisible" 当用户选择这个Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该Activity时,而不是返回到它由于离开另一个Activity。 "adjustUnspecified" 它不被指定是否该Activity主窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为设置。 "adjustResize" 该Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间。 "adjustPan" 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。 《AndroidEditText 属性汇总》 android:layout_gravity="center_vertical" 设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint="请输入数字!" 设置显示在空间上的提示信息 android:numeric="integer" 设置只能输入整数,如果是小数则是:decimal android:singleLine="true" 设置单行输入,一旦设置为true,则文字不会自动换行。 android:password="true" 设置只能输入密码 android:textColor="#ff8c00" 字体颜色 android:textStyle="bold" 字体,bold,italic,bolditalic android:textSize="20dip" 字体大小 android:capitalize="characters" 以大写字母写 android:textAlign="center" EditText没有这个属性,但TextView有 android:textColorHighlight="#cccccc" 被选中文字的底色,默认为蓝色 android:textColorHint="#ffff00" 设置提示信息文字的颜色,默认为灰色 android:textScaleX="1.5" 控制字与字之间的间距 android:typeface="monospace" 字型,normal,sans,serif,monospace android:background="@null" 空间背景,这里没有,指透明 android:layout_weight="1" 权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。 android:textAppearance="?android:attr/textAppearanceLargeInverse" 文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。不知道这样理解对不对? 通过EditText的layout xml文件中的相关属性来实现: 1. 密码框属性 android:password="true" 这条可以让EditText显示的内容自动为星号,输入时内容会在1秒内变成*字样。 2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入 3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证 下面是一些扩展的风格属性 android:editable="false" 设置EditText不可编辑 android:singleLine="true" 强制输入的内容在单行 android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时 《RelativeLayout 布局》 android:layout_marginTop="25dip" //顶部距离 android:gravity="left" //空间布局位置 android:layout_marginLeft="15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于给定ID的控件之上; android:layout_below 将该控件的底部置于给定ID的控件之下; android:layout_toLeftOf 将该控件的右边缘与给定ID的控件左边缘对齐; android:layout_toRightOf 将该控件的左边缘与给定ID的控件右边缘对齐; android:layout_alignBaseline 将该控件的baseline与给定ID的baseline对齐; android:layout_alignTop 将该控件的顶部边缘与给定ID的顶部边缘对齐; android:layout_alignBottom 将该控件的底部边缘与给定ID的底部边缘对齐; android:layout_alignLeft 将该控件的左边缘与给定ID的左边缘对齐; android:layout_alignRight 将该控件的右边缘与给定ID的右边缘对齐; // 相对于父组件 android:layout_alignParentTop 如果为true,将该控件的顶部与其父控件的顶部对齐; android:layout_alignParentBottom 如果为true,将该控件的底部与其父控件的底部对齐; android:layout_alignParentLeft 如果为true,将该控件的左部与其父控件的左部对齐; android:layout_alignParentRight 如果为true,将该控件的右部与其父控件的右部对齐; // 居中 android:layout_centerHorizontal 如果为true,将该控件的置于水平居中; android:layout_centerVertical 如果为true,将该控件的置于垂直居中; android:layout_centerInParent 如果为true,将该控件的置于父控件的中央; // 指定移动像素 android:layout_marginTop 上偏移的值; android:layout_marginBottom 下偏移的值; android:layout_marginLeft   左偏移的值; android:layout_marginRight   右偏移的值; android:id --- 为控件指定相应的ID android:text --- 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串 android:grivity --- 指定控件的基本位置,比如说居中,居右等位置这里指的是控件中的文本位置并不是控件本身。 android:textSize --- 指定控件当中字体的大小 android:background --- 指定该控件所使用的背景色,RGB命名法 android:width --- 指定控件的宽度 android:height --- 指定控件的高度 android:padding* --- 指定控件的内边距,也就是说控件当中的内容 android:sigleLine --- 如果设置为真的话,则控件的内容在同一行中进行显示 下边是相对布局属性的说明:RelativeLayout android:layout_above 将该控件的底部至于给定ID控件之上 android:layout_below 将该控件的顶部至于给定ID的控件之下 android:layout_toLeftOf 将该控件的右边缘和给定ID的控件左边缘对齐 android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐 android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐 android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘对齐 android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐 android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐 android:layout_alignTop 将该控件的顶部边缘与给定ID控件的顶部对齐 android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐 android:layout_alignParentLeft 如果该值为true,则将该控件左边与父控件的左边对齐 android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐 android:layout_alignParentTop 如果该值为true,则将该控件的顶部与父控件的顶部对齐 android:layout_centerHorizontal 如果为真,该控件将被至于水平方向的中央 android:layout_centerInParent 如果为真,该控件将被至于父控件水平方向和垂直方向的中央 android:layout_centerVertical 如果为真,该控件将被至于垂直方向的中央 android:layout_marginLeft此属性用来设置控件之间的间隙(控件和控件之间和内边距不同) android:padding="3dip"说明了四边的内边距是3dip TableLayout android:stretchColumns="0"第一列作为拉伸列填满整行
«Newer      Older»
Comment:
Name:

Back to home

Subscribe | Register | Login | N