abstract修饰类,这个类就是抽象类,抽象类中可以有非抽象变量和成员变量,也可以有普通方法、构造方法。但是不能实例化,只能被子类继承。
如果子类不是抽象类,则必须重写父类的抽象方法。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
}
abstract修饰方法,这个方法就是抽象方法。抽象方法必须存在于抽象类中。抽象方法不能有具体实现。
abstract public E get(int index);
assert表示“断言”,有两种使用方法:
assert 表达式;
若表达式为真,程序继续执行;若表达式为假,则抛出一个AssertionError异常。
assert 表达式:错误信息;
与第一种方法相同,只是异常中带有错误信息。
使用assert时不能在表达式中完成任何程序实际所需的行为(只能做判断)。因为正常发布的代码都是断言无效的,即正常发布的代码中断言语句都不不执行的。
boolean是Java的基本类型之一(默认值false)。只有两个值:true和false。区别C的判断句,Java不能直接使用1和0来表示真假,且boolean类型也不能强转到其他基本类型。
boolean a = true;
boolean b = false;
case value:expression;
break;
while(...){
...
break;
}
flag:
for(...){
for(...){
break flag;
}
}
byte是Java的基本类型之一(默认值0)。表示8位有符号整数。
范围:-128~127
byte a = 100;
case用于switch中,用于判断和执行语句。用法:
case 变量值:语句;
若变量值和switch(变量值)
中的变量值相等,就执行后面的语句。执行完后继续执行下一个case语句。
catch用于捕获异常。
用法:
catch(异常类型 异常){...}
在try/catch语句块中,catch捕获发生的异常,并应对错误做一些处理。
当catch捕获到异常后,try中执行的语句终止,并跳到catch后的语句中。
char是Java的基本类型之一(默认值\u000)。表示16位、在Unicode编码表中的字符。使用单引号来表示字符常量,例如’A’。
范围:0-65535
char a = 'A';
class表示类。用于声明一个类。
[访问控制] (abstract) class 类名 (implements){...}
const是Java的一个保留关键字,没有实际意义,但是不能用于做变量名(因为被保留作为关键字了)。在C语言中表示常量,类似Java的final。
while(...){
...
continue;
}
flag:
for(...){
for(...){
continue flag;
}
}
default关键字:
default:语句;
public interface a{
default void b(){
具体方法;
}
}
default用于接口时,必须要有具体实现。
(API>=24)
do用于和while组成循环,do/while循环不同于while循环,属于先执行循环体再判断。
do{
循环体;
}while(...)
double是Java的基本类型之一(默认值0.0d),表示双精度、64位的浮点数。
double a = 0.1d;
else用于分支结构中的判断。例如:
if(判断1){
语句1;
}else if(判断2){
语句2;
}else{
语句3;
}
enum表示枚举,用于限制变量值的类型,例如:
public enum Alpha (implements 接口){
(public static final)a,b,c,d
}
规定Color的实例只能为a,b,c,d其中之一。
枚举类中可以有成员变量和方法。
extends表示继承。例如:
class 子类 extends父类{}
Java中的继承是单继承,即子类只能有一个直接父类。
除了private,子类可以访问父类的方法和成员变量。
finally在try/catch语句块中处理一些后续的工作。例如关闭网络连接和输入输出流等。
float是Java的基本类型之一(默认值0.0f)。表示单精度、32位的浮点数。
float a = 0.1f;
for用于循环:
for(初始化循环变量; 判断执行条件;更新循环变量){
语句
}
for(变量:数组){
语句
}
Java中的保留关键字,没有实际意义,但是不能用做变量名。在C中表示无条件跳转语句。
if用于分支结构中的判断。常与else和else if使用。
if(表达式){语句}
若表达式为真,则执行后面的语句。
implements用于接入接口。接上接口的类必须实现接口的抽象方法(可以不实现默认方法和静态方法)。
class A implements B{
@Override
do(){
...
}
}
用于导入包。
import android.content.Intent;
instanceof用于判断类与对象的关系。例如:
a instanceof b
若a是b的一个实例(或子类对象),则整个表达式的结果是true,否则结果为false。
int是Java的基本类型之一(默认值为0)。表示32位、有符号的整数。
范围:[-231,231-1)
int a = 1;
interface用于声明一个接口,例如:
public interface A{
void b();
}
声明a为一个接口,若接上该接口,则必须实现其中的抽象方法b。
接口中的成员变量是static、final、public的。接口中的方法为静态方法或默认方法和静态方法(API>=24)。
long是Java的基本类型之一(默认值为0L),表示64位、有符号的整数。
范围:[-263,263)
long a = 3216846849646L;
native可以让Java运行非Java实现的方法。例如c语言,要编译后用javah产生一个.h文件。导入该.h文件并且实现native方法,编译成动态链接库文件。在Java加载动态链接库文件,这个native方法就可以在Java中使用了。
public native void aVoid();
new用于生成类的实例。
Object a = new Object();
package用于规定当前文件的包。
package com.example.zhangyijun.testdefactivity;
访问控制的一种。
私有的方法和变量只能在本类中访问。类和接口不能为私有。
private int a = 1;
private void b(){
...
}
访问控制的一种。
受保护的方法和变量只能给子类和基类访问。
protected int a = 1;
protected void b(){
...
}
访问控制的一种。
公有的方法、类、变量、接口能够被任何其他类访问。
方法中返回数据,并结束方法。
使用strictfp关键字来声明一个类、接口或者方法时,那么该类、接口或者方法会遵循IEEE-754标准来执行,提高浮点运算的精度,并且减少不同硬件平台之间由于浮点运算带来的差异。
public strictfp double aDouble(){
return 0d;
}
short是Java的基本类型之一(默认值0),表示16位、有符号的整数。
范围:[-215,215)
short a = 0;
static修饰的语句块存放在堆的方法区中。
static int a = 0;
publlic static void b(){
...
}
static{
...
}
super即超类
super.xxx
super(xxx);
switch用于分支结构,判断某个变量与一系列值是否相等。switch 语句中的变量类型可以是: byte、short、int 、char、String、enum。
switch(变量){
case value1:语句1;
break;
case value2:语句2;
break;
...
default:语句;
}
synchronized关键字用于保证线程安全。由这个关键字修饰的方法或者代码块保证了同一时刻只有一个线程执行该代码。
synchronized(obj){...}
当一个线程访问同步代码块时,检查obj是否有锁,如果有就挂起。如果没有就获得这个obj的锁,也就是把其他线程锁在了外面。当代码执行完毕时释放该锁,其他线程获得锁继续执行代码。
用于抛出一个异常。
throw (Exception);
在方法中将发生的异常抛出。
[控制访问](返回类型)(方法名)([参数列表])[throws(异常类)]{...}
类接上序列化接口后,可以通过transient关键字将某些变量变得无法序列化。
transient int a = 1;
在try/catch中,将可能出现异常的语句放在try{}块中,出现异常之后代码将会终止并跳到catch中继续执行。
try{
...
}catch(Exception e){
...
}finally{
...
}
修饰方法,表示方法没有返回值。
volatile关键字修饰的变量在多线程中保持同步。相比synchronized效率要高,不会阻塞线程。但只能保证数据的可见性,不能保证数据的原子性。例如在处理i++的时候另外一个线程修改i的值,那么i的值将会发生错误,这是原子性导致的。
volatile int a;
while用于两种循环结构:
while(判读语句){
循环体...
}
do{
循环体...
}while(判读语句)
多态就是同一个行为,使用不同的实例而发生不同的作用。在使用多态调用方法的时候,编译器检查父类中是否有该方法,如果有才能编译通过,例如:
public class Animals{
void voice(){动物叫}
}
class Cat extends Animals{
void voice(){猫叫}
}
public static void testVoice(Animals a){
a.voice();
}
public static void main(String[] args) {
testVoice(new Cat());
Animals a = new Cat();
a.voice();
}
猫继承自动物这个类,Animals a = new Cat()是向上转型(父类引用指向子类对象),实际的运行时类型还是Cat,也就是说a instanceof Cat 表达式为真,因此调用a的voice()方法是猫叫。结合C的指针和内存分析来理解多态。
public static <T extends Closable> void close(T... a){
for(T temp:a){
try{
if(temp!=null){
temp.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
Class<?> a = Object.getClass();
Class<?> b = T.class;
Class<?> c = Class.forName(...);
通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象
//a.获取指定的构造函数(公共/继承)
Constructor<T> getConstructor(Class<?>... parameterTypes);
//b.获取所有的构造函数(公共/继承)
Constructor<?>[] getConstructors();
//c.获取指定的构造函数(不包括继承)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);
//d.获取所有的构造函(不包括继承)
Constructor<?>[] getDeclaredConstructors();
//a.获取指定的属性(公共/继承)
Field getField(String name);
//b.获取所有的属性(公共/继承)
Field[] getFields();
//c.获取指定的所有属性(不包括继承)
Field getDeclaredField(String name);
//d.获取所有的所有属性(不包括继承)
Field[] getDeclaredFields();
//a.获取指定的方法(公共/继承)
Method getMethod(String name, Class<?>... parameterTypes);
//b.获取所有的方法(公共/继承)
Method[] getMethods();
//c.获取指定的方法 (不包括继承)
Method getDeclaredMethod(String name, Class<?>... parameterTypes);
//d.获取所有的方法(不包括继承)
Method[] getDeclaredMethods();
Iterator<String> iterator = list.iterator();
while(ite.hasNext()){
Log.d("TAG",ite.next());
}
//第一种:map.keySet()
for (String key : map.keySet()) {
System.out.println("key= "+ key + " value= " + map.get(key));
}
//第二种:map.entrySet().iterator()
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());
}
//第三种:map.entrySet()
for (Map.Entry<String, String> entry : map.entrySet()){
System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());
}
//第四种:map.values()
for (String v : map.values()) {
System.out.println("value= " + v);
}
RegexBuddy
\n \t \\ \^ \$ \( \) \{
\} \? \+ \* \| \[ \]
\d | 0~9的任意一个数字 |
---|---|
\w | A~Z, a~z, 0~9, _中任意一个 |
\s | 空格、制表符、换行符等空白符的任意一个 |
. | 匹配任意一个字符 |
[] | 匹配方括号中任意一个字符 |
^ | 方括号取反 |
- | 方括号中表示范围 |
{} | 花括号前正则表达式的重复次数,{m,n}至少m次,最多n次 |
? | 花括号后加,非贪婪模式。非花括号后加,相当于{0,1} |
+ | 前面的正则表达式至少出现一次,相当于{1,} |
* | 表达式不出现或出现多次,相当于{0,} |
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个字符边界 |
| | 匹配左边或者右边 |
(?=exp) | 断言自身出现的位置的后面能匹配表达式exp |
(?<=exp) | 断言自身出现的位置的前面能匹配表达式exp |
(?!exp) | 断言此位置的后面不能匹配表达式exp |
(? | 断言此位置的前面不能匹配表达式exp |