final
finanl 修饰的变量只能赋值一次
- final修饰的实例变量的,系统不赋默认值,要求手动赋值
- 实例变量在new的时候赋值
- final修饰的实例变量一般添加static修饰,最好是静态,存储在方法区,节省内存,static final修饰的通常是常量,建议全部大写,并用下划线连接,一般还是public
抽象类、接口
抽象类abstract
- 抽象类无法实例化,无法创建对象
- 有构造方法
- final和abstract是对立
- 抽象方法:没有方法体的方法;带有abstract;以分号;结尾
- 可存在非抽象 方法
- **继承了抽象类的非抽象类,必须把抽象类的方法实现
- 子抽象类,可以不重写父抽象类的抽象方法
- 抽象类可以引用,多态
- ***没有方法体的方法不一定是抽象方法,native调用的c++动态链接库不用sbstract,表示调用JVM本地程序;
接口
语法
- 也是一种引用数据类型
- 完全抽象,抽象类是半抽象,特殊的抽象类
- [修饰符] interface 接口名{}
- 接口编译后是class字节码文件
- 接口间可以继承,支持多继承
- 只有两部分内容:常量和抽象方法
- public abstract可以省略
- 常量都是public static final修饰,方法都是public abstract修饰,除了类型都可以省略
- 抽象方法不可以带有方法体.
- 当编写类时,继承接口implements,抽象类也可以继承
- **非抽象类,要实现接口中所有的抽象方法
- 接口可实现多态
- *****一个类可以支持多个接口,弥补了类与类之间单继承
- 当多态时,对象只能调用引用类方法
- ****接口之间,没有继承关系,也可以强转类型,编译没事,运行时可能会出现classcast异常,需要if + instanceof 判断
- extends在前,implements在后
开发中 - 接口类似于多态的作用
- 降低耦合度,提高扩展力
- 符合ocp
- 接口都有调用者和实现者,实现解耦
is-a、has-a、like-a
- is-a:cat is a animal 表示继承
- has-a:i has a pen :表示关联关系。以属性存在
- like-a:cooker like a foodmenu;表示实现关系,类实现接口
包、import
包
- 出现在源代码的第一行
- 命名规范:公司域名倒序+项目名+模块名+功能名
- 划分不同的功能
编译
- javac -d . 文件.java;从当前目录自动生成源代码的包路径
import
- 使用的类不在同一个包下
- java. lang.*下的不需要导,但子包需要
访问权限
Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四种访问权限的含义和权限控制见下面表格:
访问权限 | 含义 | 本类 | 本包的类 | 非本包子类 | 非本包非子类 |
---|---|---|---|---|---|
public | 公共的 | 是 | 是 | 是 | 是 |
protected | 保护访问权限 | 是 | 是 | 是 | 否 |
default | 包访问权限 | 是 | 是 | 否 | 否 |
private | 私有的 | 是 | 否 | 否 | 否 |
object
API
应用程序编程接口
javadoc 提取源代码中的注释信息
- toString方法
输出引用的时候,会自动调用该引用的toString()方法 - equals(obj)方法
以后编程,判断两个对象是否相等,默认采用 "==”
双等号 “==”是判断变量的内存地址
需要在子类中重写,equal是判断对对象类的属性判断
- finaliaze方法,protected修饰 (了解即可)
不需要程序员手动调用,JVM的垃圾回收器负责调用
如果希望在对象销毁时执行代码的话,需要写到finalize方法中
System.gc();建议启动垃圾回收器
- hashcode(),底层调用C++
返回对象内存地址的哈希值,等同看作内存地址
- hashcode(),底层调用C++
匿名内部类
- 内部类:在类内部又定义了一个新的类
- 静态内部类(static修饰)、实例内部类、局部内部类(在方法中定义)
- 较少使用
class Test01 {
//该类在类的内部,所以称为内部类
//由于前面有static,所以称为静态内部类"
static class Inner1 {
//该类在类的内部,所以称为内部类
//没有static叫做实例内部类。
class Inner2 {
}
public void doSome () {
. //局部变量
int i=100;
. //该类在类的内部,所以称为内部类
//局部内部类。
class Inner3{
}
public void doother() {
new Test01 () .new Inner2 () ;
}
}
匿名内部类
快捷键 alt+enter
- 匿名内部类实现接口方法
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
- 匿名内部类,实现抽象类方法
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
数组Array
一维数组
- 引用数据类型,基本数据
- 实际是一个容器,容纳多个元素
- 存储在堆,当中可以存储基本数据和引用数据
- 如存储对象,实际上存储的是对象的引用即内存地址,元素内存地址是连续的
- 数组一旦创建,长度不可变,并且存储类型必须统一
- length(),返回数组元素的个数
- 所有数组都是用第一个元素的内存地址作为整个数组对象的内存地址
- 缺点:增删减效率低,不能存储大数量的数据
初始化数组
1.静态初始化
int[] array = {100,200,300};
2.动态初始化
int[] array = new int[5];
- 当时对象数组,可以存储其子类
- 数组扩容:先创建一个大容量数组,把旧数组的数据一个一个拷贝到大数组中
src:目标源,srcpos拷贝数据起始位,dest目标源,destpos:拷贝的起始位,length:拷贝数据个数
二维数组
- 特殊的一维数组,特殊是一个一维数组当中每一个元素是一维数组
- length(),即返回第一层元素的个数,即行数
算法
- 冒泡算法
public void BubbleSort(int[] arr){
for (int i = arr.length-1;i>0;i--){
for (int j=0;j<i;j++){
if (arr[j]>arr[j+1]){
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
- 选择排序
public void SelectSort(int[] arr){
for (int i=0;i<arr.length-1;i++){
int min = i;
for (int j=i+1;j<arr.length;j++){
if (arr[min]>arr[j]){
min=j;
}
}
if (min != i){
int temp = arr[min];
arr[min]=arr[i];
arr[i]=temp;
}
}
}
- 二分法查找
public static int binarySearch(int[] arr,int dest){
int begin =0;
int end = arr.length-1;
while (begin<end) {
int mid = (begin+end)/ 2;
if (dest == arr[mid]) {
return mid;
} else if (dest > arr[mid]) {
begin = mid+1;
}else if(dest<arr[mid]){
end = mid +1;
}
}
return -1;
}
Arrays工具类
String 类
-
双引号的字符串,直接存储在方法区的字符串常量池中
-
字符串创建方式不同,存储方式不同
静态赋值直接存储在方法区,新建对象引用堆中内存地址,堆中再指向方法区
-
字符串对象比较需要equals()
-
创建的对象
-
string类已重写tostrng,不输出内存地址,输出字符串本身
-
String str= String(bytes[]),把字符数组组合成字符串输出
-
String(bytes,offse:数组元素下标起始位置,length:长度),把字符数组的一部分转换成字符串
-
char charAt(int index);返回字符串指定索引的字符值
-
int comparedTo(string);逐个字符比较大小
-
boolean comtains(string); 判断 前字符串是否包含此字符串
-
boolean endswith(string);判断前字符串是否以strng结尾
boolean startswith(string);判断前字符串是否以strng开始 -
boolean equals(string);
-
boolean equalsIgnoreCase(string);忽略大小写,判断是否相同
-
byte[] getBytes();返回字符串的字符数组
-
int indexOf(string);判断string第一次出现在字符串的索引
lastIndexOf(string);最后一次出现的索引 -
boolean isEmpty();判断字符串是都为空
-
replace(oldChar,new char);把字符串中所有指定的字符换成新字符; String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 -
String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。并可以限制数量
-
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。直到最尾
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。不包含endindex所以字符 -
char[] toCharArray()
将此字符串转换为一个新的字符数组。 -
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 -
String trim()
返回字符串的副本,忽略前导空白和尾部空白。
StringBuffer 类
- StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq)
public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。 - 底层实际是一个byte[] 数组
- append(xxx);使字符串追加
- synchronized修饰,在多线程环境下运行时安全的
StringBuilder 类
- 将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
Integer
为8种基本数据类型,提供了8种包装类,属于引用数据类型
因为基本数据类型不够用,
- 装箱:基本数据类型转换为引用数据类型
拆箱:引用数据类型转换为基本数据类型
- Integer(int value)
构造一个新分配的 Integer 对象,它表示指定的 int 值。
Integer(String s)
构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
- 上述构造方法已过时,jdk5具备自动装箱和自动拆箱
- integer存储机制**********
底层是static在类加载是存储在静态方法区
- 经典异常
- static int parseInt(String s)
将字符串参数作为有符号的十进制整数进行解析。
static int parseInt(String s, int radix)
使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
传参:string 返回int
- 类型互转
日期date类
- 获取系统当前时间Date nowTime=new Date()
- SimpleDateFormat类在Java.text,格式化类
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
日期和时间模式 | 结果 |
---|---|
“yyyy.MM.dd G ‘at’ HH:mm:ss z” | 2001.07.04 AD at 12:08:56 PDT |
“EEE, MMM d, ''yy” | Wed, Jul 4, '01 |
“h:mm a” | 12:08 PM |
“hh ‘o’‘clock’ a, zzzz” | 12 o’clock PM, Pacific Daylight Time |
“K:mm a, z” | 0:08 PM, PDT |
“yyyyy.MMMMM.dd GGG hh:mm aaa” | 02001.July.04 AD 12:08 PM |
“EEE, d MMM yyyy HH:mm:ss Z” | Wed, 4 Jul 2001 12:08:56 -0700 |
“yyMMddHHmmssZ” | 010704120856-0700 |
“yyyy-MM-dd’T’HH:mm:ss.SSSZ” | 2001-07-04T12:08:56.235-0700 |
- public StringBuffer format(Date date,
StringBuffer toAppendTo,
FieldPosition pos)
将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。
-
string转换为Date类
-
System.currentTimeMiliis();获取1970的毫秒数
-
public Date(long date);date - 自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。
数字类Number
- DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。
- BigDecimal,在java.math.BigDecimal属于大数据不属于基本数据类型,属于引用数据,运用在财务软件
- 随机数:
Random random = new Random( ) ; .//随机产生int类型数字
int num1 = random . nextInt( ) ;
System. out .println(num1);
int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、
在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
产生五个不重复的随机数
Random random = new Random();
int[] arr= new int[5];
Arrays.fill(arr, -1);
int index= 0;
while(index < arr.length){
int num = random.nextInt(101);
if (contains(arr, num,index)){
arr[index++]=num;
}
}
System.out.println(Arrays.toString(arr));
public static boolean contains(int[] arr, int key,int index){
for (int i=0;i<=index;i++){
if (arr[i]==key){
return false;
}
}
return true;
}
枚举 ENUM类
- 枚举是一种引用数据类型
- 结果只有两种情况使用布尔类型,如结果超过两种且每种情况能列举出来的使用枚举
public class test1 {
public static void main (String[] args){
Result r = divide(10, 2);
System.out.println(r == Result.SUCCESS? "成功":"失败");
}
public static Result divide(int a,int b){
try{
int c=a/b;
return Result.SUCCESS;
}catch(Exception e){
return Result.FAIL;
}
}
}
enum Result{
//枚举中每一个值可看作是常量
SUCCESS,FAIL
}
异常
- 以类和对象存在
- 每个异常类都可以创造实例对象
异常处理机制
- 异常继承结构
- 所有Exception的直接子类,都是叫编译时异常;表示在编写时预先处理,不然编译时出现编译器报错
- 所有的RuntimeException及子类,都是叫运行时异常,可处理可不处理
- 处理:
- 在方法声明的位置上,使用throws关键字,抛给上一级,谁调用,就抛给谁,可逐级上报,main抛给Jvm
- 使用try…catch语句进行异常的捕捉
- Exception e,e引用保存的内存地址就是new出来异常对象的内存地址
- jdk8新特性异常可或
- 异常对象有两个非常重要的方法:
获取异常简单的描述信息:
String msg = exception. getMessage(); .
打印异常追踪的堆栈信息:
exception. printStackTrace(); .是JVM的另一个线程输出的 - 捕捉文件流异常的
- try…finally可以连用; 先执行try语句,再执行finally,在执行return; 但后面没机会执行
自定义异常
final,finally,fianlize区别
fianl
final可以用来修饰类、方法、变量。
变量只能赋值一次,如果是对象,内部属性能改变
方法不能被更改
类不能被继承,内部方法不能被重写
fianlly
在try…cathch中,
保证重点代码一定要被执行的一种机制。最常用的地方:通过try-catch-finally来进行类似资源释放、保证解锁等动作
finally中释放资源的操作,更推荐使用Java7中添加的try-with-resources语句
finalize
在CG要回收某个对象时,让这个对象有底气的大喊一声:“报告,我还能再抢救一下!”。但是也正是因为如此,JVM要对它进行额外处理。finalize也就成为了CG回收的阻碍者,也就会导致这个对象经过多个垃圾收集周期才能被回收。