1.方法内部的变量(局部变量)必须初始化后才能使用。
@Test
public void testInnerVariable(){
int a = 0 ;
System.out.println("实例变量=="+this.a+"局部变量为"+a );
}
2.数组的形式:
int[] a = new int[]{1,2,3};{1,2,3}是一个一维数组,{{1,2,3},{2,3,4},{5,6,7}}是一个二维数组。
数组排序:java.util.Arrays.sort(Object o);
3.Java 序列化的用途:
将一个对象的状态写进一个Byte流里,并且可以从其他地方把该byte流里的数据读出来,重新构造一个 相同的对象。
1.比如有一个类记录用户信息设置等,当你程序退出后下次再运行要保留上次的信息设置,那你就可以把这个类作为配置文件存在磁盘上,每次运行的时候再读取。这样的例子有很多,总之一切需要保留的数据都可以这么做。
2.比如你做一个云服务,需要把用户数据从服务器端传输给用户,那也可以这么做。
当然现在序列化用的不是很多,因为有很多替代方法,甚至很多比序列化方便很多,而且通常第二种情况,客户端服务器端也不是完全对称的,所以直接传输并不好。
4.访问权限:
public protected friendly private
5.String 被定义为final的,子类不可继承。StringBuffer是线程安全的,可变的,StringBuilder不是线程安全的
6.class.forName:
调用该访问一个以字符串指定类名的类的对象。
返回字节码(编译后的class文件字):
1.如果这个字节码没有被加载到虚拟机中,就使用类加载器把加载进来的字节码缓存在虚拟机种,以后就不用在加载。
2.字节码已经被加载过到虚拟机中直接返回
类加载器:BootStrapClassLoader ExtentionClassLoader appClassLoader 三者来利用委托模型进行搜索和加载。其实程序中分为预先加载和按需加载,预先加载不讨论,说明按需加载(委托模型):就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。层次关系:
先去父类中找,找不到再来子类中找
拓展点:
隐式加载是通过new的方式,在类初始化时由JVM根据相应的Class Loader将类载入。
显式加载则是程序员在代码中显式利用某个Class Loader将类载入。
JVM自动装载类的算法是这样的:如果Class A的实例引用了Class B的实例,则在默认情况下,JVM会先找到Class A的Class Loader,然后用该Class Loader来装载Class B。
可以定义自己的类加载器
7.hashcode方法作用:
在比较 equals 时的顺序:
1.先比较hashcode 不相等直接不等
2.hashcode相等然后再比较 equals 方法
Object 中有toString,equals,hashcode 三个方法,可以覆盖,如果覆盖其equals 和 hashcode 在属 性相同的时候都会相同
在hash、set存储时都会比较其是否相同
equals 相同的其hashcode一定相同,hashcode相同的不一定equals相同。
== 比较的是内存首地址和内存地址,equals 比较的是数据的内容。