①理解:final在英文中本意为最终的,不可变的,可便于理解为final修饰的东西无法修改;
②用法:
<1>.final修饰的类无法继承;
<2>.final修饰的方法无法被覆盖;
<3>.final修饰的变量仅能赋一次值;
final修饰的引用仅能指向一个对象,并且无法指向其他对象,但对象中的数值可被改变;final修饰的实例变量必须手动赋值;
③常量:无法被改变;
常量常常使用“static final”修饰,且全部大写,单词间使用下划线分隔。
例如:public static final double PI = 3.1415926;
package关键字:
①定义:java中的“包”机制,方便程序的管理;
②语法:package+包名;
常常允许出现在java源代码的第一行;
③定义规范:公司域名倒序+项目名+模块名+功能名;
④编译与运行:
<1>编译:javac -d.(被编译的java文件名.java);
"-d"代表带包编译,“.”代表当前目录;
<2>运行:java (命名规范);
import关键字:
①定义:导包关键字;
②使用情况:
<1>A类中使用B,A与B不在一个包,使用import;
<2>A类中使用B,A与B在一个包,不使用import;
<3>在java.lang.*包下无需导包import。
③用法:
<1>import只能出现在package下面,类的声明上面;
<2>import (命名规范);
抽象类(Abstract class):
①概述:
<1>类和类之间存在共同特征,将共同特征提取出来,形成抽象类;
<2>抽象类属于引用数据类型;
<3>抽象类无法实例化,用于被子类继承;
<4>final和abstract对立,不可联合使用;
<5>抽象类的子类也是抽象类,存在构造方法,供子类使用;
②语法规则:
[修饰符列表] abstract class 类名{…}
抽象方法(Abstract method):
①概述:
<1>抽象方法没有方法体,例如:public abstract void dosome();
<2>抽象类不一定有抽象方法,但抽象方法必须出现在抽象类中;
<3>非抽象类继承抽象类时,必须实现其中的抽象方法,或者将非抽象类改为抽象类。
②语法:
[修饰符列表] abstract 返回值类型 方法名();
接口(interface):
①概述:
<1>接口是一种引用数据类型,是完全抽象的;
<2>接口支持多继承,一个接口可继承多个多个接口;
<3>接口中仅包含两部分内容:
a.常量,例如:public static final int PI;
b.抽象方法,例如:public abstract void xx();
<4>接口都是公开的(public),接口中的public abstract可以省略;
<5>接口中的常量修饰部分public static abstract可省略;
②语法:
[修饰符列表] interface 接口名{…}
接口与抽象类:
①类与类之间的继承关系在类与接口中叫作“实现(implements)”;
②继承使用extends关键字,实现使用implements关键字;
③当一个非抽象类实现接口时,必须将接口中的所有抽象方法实现;
④接口与接口之间支持多继承,一个类可实现多个接口;
⑤当implements和extends同时存在时,先写extends;
⑥抽象类和接口的区别:
<1>抽象类是半抽象的,而接口完全抽象;
<2>抽象类有构造方法,接口无构造方法;
<3>接口与接口间支持多继承,类与类中仅能继承一个类;
<4>一个类可同时实现多个接口,而只能继承一个类;
①相关关键字:public,protected,默认,private。
②控制范围比较:public>protected>默认>private。
控制权限详解:
数组概述:
①引用数据类型,其父类是Object,被存在堆内存中;
②可储存“基本数据类型”,也可储存“引用数据类型”;
③若数组中存的是Java对象,应存的其内存地址;
④数组一经创建,其长度不可变且自带Length属性;
⑤所储存的数据必须类型统一;
⑥数组在内存方面存储,其中的内存地址与第一个元素内存地址相同,且连续;
⑦下标从“0”开始,到Length-1结束;
⑧优缺点:
<1>优点:
检索效率高,通过数学表达式可计算某个下标的内存地址,从而定位元素;
<2>缺点:
a.在数组上随机增删元素时,效率较低;
b.很难在内存空间上找到一块特别大的连续的内存空间;
一维数组:
①语法:
<1>静态初始化:
数据类型[] 变量名 = {,,,};
数据类型 变量名[] = {,,,};
<2>动态初始化:
数据类型[] 变量名 = new 数据类型[数组长度];
②数组的扩容:
新建(大容量) —> 拷贝 ----> 删除旧的数组;
③数组的拷贝:
调用System类中的arraycopy方法:
**System.arraycopy(源变量,源起点,目标变量,目标起点,长度);
二维数组:
①语法:
<1>静态初始化:
数据类型[][] 变量名 = {{…},{…},…};
<2>动态初始化:
数据类型[][] 变量名 = new 数据类型[数组长度][数组长度];
<3>元素访问:
变量名 [下标][下标];
②二维数组是特殊的一维数组,其中每个元素都是一个一维数组。
数组工具类Arrays:(java.util.Arrays)
①static sort(数据类型[] xx);
用于给数组中元素排序。
②static binarySearch(数组名 xx,数据类型 xx);
用于查找数组中的某个元素。
Ⅰ.JDK中凡是双引号括起来的字符串存储在方法区的
字符串常量池中
。
Ⅱ.new String(参数列表)将在堆中创建字符串对象。
Ⅲ.String类型的变量保存的是字符串常量池
中的内存地址而非数据。
//一个参数的构造方法 new String(byte[] bytes); //三个参数的构造方法 /* *@param bytes byte类型的数组 *@param offset 起始下标(从0开始) *@param length 选取长度 */ new String(byte[] bytes,int offset,int length); /*char同理*/
使用案例:
String string = "中国人"; char str1 = string.charAt(1); System.out.println(str1);//str1 = "国"
使用案例:
/* *对比前后字符串大小。 *@param anotherString 需要对比的字符串 *@return result: * >0 前大后小 * =0 两值相等 * <0 前小后大 */ String num1 = "5"; String num2 = "6"; int result = num1.compareTo(num2); System.out.println(result);//result = -1
源码解析:
/* *判断前字符串是否包含后字符串 */ public boolean contains(CharSequence s) { return indexOf(s.toString()) >= 0; }
源码解析:
/* *判断前字符串是否以suffix结尾 */ public boolean endsWith(String suffix) { return startsWith(suffix, length() - suffix.length()); }
/* *判断某字符串是否以prefix开始 */
/* *判断两字符串是否相等,忽略大小写 */
/* *@return 返回str在当前字符串中第一次出现的下标 */
/* *将字符串对象转换为byte[]数组 */
源码解析:
/* *判断该字符串是否为空 */ public boolean isEmpty() { return value.length == 0; }
/* *@return 返回str在当前字符串中最后一次出现的下标 */
/* *使用replacement替换原来的target部分 *@return 返回新的字符串 */
/* *截取字符串 *@param beginIndex:起始下标 *@return 截取后的字符串 */
/* *截取字符串 *@param beginIndex:起始下标 endIndex:结尾下标 范围:[begin,end) *@return 返回截取后的字符串 */
/* *将字符串转换为char[]数组 */
/* *将字符串转为小写 */
/* *将字符串转换为大写 */
/* *将非字符串转换为字符串 */
用于字符串的拼接
new StringBuffer(); new StringBuffer(int capacity);//手动设置容量
StringBuffer底层创建一个容量为16的byte[]数组,可自动扩容。
StringBuffer buffer = new StringBuffer(16); buffer.append("中"); buffer.append("国"); buffer.append("人"); System.out.println(buffer);
优化StringBuffer性能:
Ⅰ.在创建对象时可给定一个初始化容量;
Ⅱ.最好减少数组的扩容次数,给预估的初始化容量。
对比StringBuilder和StringBuffer:
Ⅰ.方法,构造方法均类似;
Ⅱ.本质区别是
StringBuffer是线程安全的;
StringBuilder是线程不安全的;
对比String和StringBuffer:
Ⅰ.StringBuffer对象的内容可以修改,而String对象一旦产生后就不可以被修改;
Ⅱ.StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
Ⅲ.String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的(方法区中的【字符串常量池】)。
基本数据类型 父类(均在java.lang包) 包装类型
byte java.lang.Byte Byte
short java.lang.Short Short
int java.lang.Integer Integer
long java.lang.Long Long
float java.lang.Float Float
double java.lang.Double Double
boolean java.lang.Boolean Boolean
char java.lang.Character Character
装箱:利用包装类将“基本数据类型”转为“引用数据类型”
利用Integer的构造方法:
//将int类型包装为Integer类型(已过时) Integer i = new Integer(int value); //将String类型包装为Integer类型(已过时) Integer i = new Integer(String str); //使用Integer的静态方法valueOf()(主流方法) int inti = Integer.valueOf(int value);
拆箱:利用一些方法将“引用数据类型”转为“基本数据类型”
利用包装类自带的((数据类型)+Value()
)方法
Integer i = new Integer(123); int inti = i.intValue();
//获取int类型的极限值 int max_Int = Integer.MAX_VALUE;//max_Int=2^31-1 int min_Int = Integer.MIN_VALUE;//min_Int=-2^31 int min_byte = Byte.MIN_VALUE;//min_byte=-2^7 int min_short = Short.MIN_VALUE;//min_short=-2^15
简介:
数字格式化异常。
案例:
Integer x = new Integer("中文");
由于包装类是高级数据类型,合理利用包装类可有效预防NullPointerException。
int inti = 123; Integer i = 123; String stri = "123"; //int--->Integer(装箱) (Integer) i = Integer.valueOf(inti); //Integer--->int(拆箱) (int) inti = i.intValue(); //int--->String (String) stri = String.valueOf(inti); (String) stri = inti+" "; //String--->int (int) inti = parseInt(stri); //String--->Integer (Integer) i = Integer.valueOf(stri); //Integer--->String (String) stri = String.valueOf(i);
构造方法:
//输出当前时间 Date date = new Date(); System.out.println(date.toString);
作用:
专门负责日期的格式化;
构造方法:
//有参构造 /* *@param pattern 输出日期的格式 比如:标准格式 "yyyy-MM-dd HH:mm:ss:SSS" */ public SimpleDateFormat(String pattern);
方法:
a.调用该类中的format(Date)方法可输出修改后格式的时间;
b.调用System类中的currentTimeMills()方法可知道从【1970-1-1 00:00:00】到现在的时间毫秒数。
//以指定格式输出当前时间: Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); String currentTime = sdf.format(date); System.out.println(currentTime);
Ⅰ.System.out //输出函数包
Ⅱ.System.gc() //启动垃圾回收机制
Ⅲ.System.currentTimeMills() //获取从1970-1-1 00:00:00到当前的毫秒数
Ⅳ.System.exit(0) //退出JVM
数字格式的介绍:
#
:任意数字
,
:千分位
.
:小数点
0
:位数不够时补零
作用:专门负责数字的格式化。
构造方法:
/* *param pattern:输出数字的格式 *例如:标准格式:#,###.## */ new DecimalFormat(String pattern);
方法:
//输出更改格式后的数字 DecimalFormat df = new DecimalFormat("#,###.##"); String format = df.format(Integer.MAX_VALUE); System.out.println(format);
简介:属于引用数据类型,称为“大数据”。
构造方法:
/* *@param var:需要在大数据中存入的变量 *形参处存在字符,字符串,浮点型,数组等等。 */ new BigDecimal(int var);
方法:
BigDecimal bd1 = new BigDecimal(-123); BigDecimal bd2 = new BigDecimal(456); //求和函数 BigDecimal addResult = bd1.add(bd2);//addResult=333 //绝对值函数 BigDecimal absResult = bd1.abs();//absResult=123 //求差函数 BigDecimal subResult = bd1.subtract(bd2);//subResult=-579
作用:生成一定范围的随机数。
构造方法:
new Random();
方法:
Random r = new Random(); //生成int范围内的随机数 int numble = r.nextInt(); //生成指定范围内的随机数[0,bound) int numble = r.nextInt(int bound);
作用:一种引用数据类型,结果超过两种可用一枚一枚列举出的结果。
语法规则:
//季节枚举 enum Season{ SPRING,SUMMER,AUTUMN,WINTER }
Ⅰ.异常时程序执行过程中的不正常情况;
Ⅱ.其作用是增强程序的健壮性;
Ⅲ.异常在java中以类的形式存在,每个异常类都可以实例化对象;
Ⅳ.编译时异常(受检异常)和运行时异常(未受检异常)都发生在运行阶段。
Ⅰ.方法声明位置上,使用
throws
关键字抛出异常(谁调用方法抛给谁);
Ⅱ.使用try…catch
语句进行异常捕捉;
Ⅲ.throw
手动抛出异常;
Ⅳ.只要异常没有被捕捉,那么采用throws方法时,后续代码不会执行;
Ⅴ.try…catch捕捉后,后续代码可以执行。
构造方法:
//无参构造 new Exception(); //有参构造 /* *@param message:添加打印异常描述信息 */ new Exception(String message);
方法:
Exception exception = new Exception(); //获取异常简单描述信息 String massage = exception.getMassage(); //打印异常的堆栈信息 exception.printStackTrace();
概述:
Ⅰ.在finally子句中的代码最后执行且一定会执行;
Ⅱ.finally子句必须和try…catch
一起出现;
Ⅲ.finally子句也可和try…
语句一起使用,try语块中的return最后执行;
Ⅳ.可用于关闭IO流和jdbc;
final,finally,finalize的区别:
a.final用于修饰变量,方法和类,表示不可变;
b.finalize是Object中的一个方法名;
c.finally用于处理异常。
Ⅰ.默认实现:类名+@(对象的内存地址16进制形式);
Ⅱ.作用:将一个java对象转换为字符串形式;
Ⅲ.为了得到简介,详实的输出结果,需重写toString()方法。
Ⅰ.作用:使用该方法判断两个对象是否相等;
Ⅱ.“==”对于对象来说比较对象的内存地址而非对象内容;
Ⅲ.“equals()”中存在着Ⅱ中的比较方式;
Ⅳ.调用equals()方法时需重写该方法,比较内容而并非其内存地址;
Ⅴ.String类中已重写了equals和toString方法,可在String中直接使用。
作用:得到对象的哈希值。