final
修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally
异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入
finally 块(如果有的话)。一般异常处理块需要。
finalize
方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 Java中所有类都从Object类中继承finalize()方法。
当垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法。Java中是没有析构函数的。C++的析构函数是在对象消亡时运行的。但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。
那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。
构造代码块
- 构造代码块的作用是给对象进行初始化。
- 对象一建立就运行构造代码块了,而且优先于构造函数执行。这里要强调一下,有对象建立,才会运行构造代码块,类不能调用构造代码块的,而且构造代码块与构造函数的执行顺序是前者先于后者执行。
- 构造代码块与构造函数的区别是:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。
静态代码块
- 它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的
- 静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的
- 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别
- 一个类中可以有多个静态代码块
public class StaticCode {
static int cnt=6;
static{
cnt+=9;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(cnt);
}
static{
cnt/=3;
}
}
//运行结果:5
public class StaticCode {
public StaticCode(){//构造函数
System.out.println("A的构造函数");
}
{//构造代码块
System.out.println("A的构造代码块");
}
static {//静态代码块
System.out.println("A的静态代码块");
}
public static void main(String[] args) {
StaticCode a=new StaticCode();
}
}
//运行结果
A的静态代码块
A的构造代码块
A的构造函数
序列化
一个类的对象要想序列化成功,必须满足两个条件:
- 该类必须实现 java.io.Serializable 对象。
- 该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。
implements Serializable
- ObjectOutputStream和ObjectInputStream实现序列化和反序列化
- 在类中增加writeObject 和 readObject 方法可以实现自定义序列化策略
native
- 一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现.
- 在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。
JNI
- Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。
- JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。
[图片上传失败...(image-ca25d1-1557841284036)]
class HelloWorld {
public native void hello();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().hello();
}
https://blog.csdn.net/qq_23994787/article/details/79066336
自动拆箱和自动装箱
自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。
自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。
https://www.jianshu.com/p/0ce2279c5691
static
- 修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()
- 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
- 静态内部类(static修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
- 静态导包(用来导入类中的静态资源,1.5之后的新特性): 格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
静态内部类
静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:
- 它的创建是不需要依赖外围类的创建。
- 它不能使用任何外围类的非static成员变量和方法。
instanceof(对象是否是类的实例)
是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。可以用在继承中的子类的实例是否为父类的实现。
public interface A {}
public class B implements A{
public static void main(String[] args) {
// TODO Auto-generated method stub
A a=null;
B b=null;
System.out.println(a instanceof A); //false
System.out.println(b instanceof B); //false
System.out.println(a instanceof B); //false
System.out.println(b instanceof A); //false
a=new B();
System.out.println(a instanceof A); //true
System.out.println(a instanceof B); //true
b=new B();
System.out.println(b instanceof A); //true
System.out.println(b instanceof B); //true
}
}
class.forname():动态加载类
class.newInstance():静态方法来实例
Collections工具类方法
- void reverse(List list)//反转
- void shuffle(List list)//随机排序
- void sort(List list)//按自然排序的升序排序
- void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑
- void swap(List list, int i , int j)//交换两个索引位置的元素
- void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。
查找删除
- int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
- int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
- int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
- void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。
- int frequency(Collection c, Object o)//统计元素出现次数
- int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
- boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素
Array 工具类方法
- 排序 : sort()
- 查找 : binarySearch()
- 比较: equals()
- 填充 : fill()
- 转列表: asList()
- 转字符串 : toString()
- 复制: copyOf()
泛型
ArrayList<Integer> arrayInteger = new ArrayList<Integer>();
ArrayList<String> arrayString = new ArrayList<String>();
System.out.println(arrayInteger.equals(arrayString)); //输出true
泛型它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的。这就是为什么,Java的泛型被称为“伪泛型”的原因
通配符泛型<?>
- 如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。
- 通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。
- 泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。
Class<T>在实例化的时候,T要替换成具体类
Class<?>它是个通配泛型,?可以代表任何类型
<? extends T>受限统配,表示T的一个未知子类
<? super T>下限统配,表示T的一个未知父类
https://blog.csdn.net/ikownyou/article/details/65630385
Enumeration
- hasMoreElemnet
- nextElemet
Iterator
- hasNext
- next