java基础知识点杂碎
-
Short a=1;Short b=2;a+=b
代码会产生编译错误。
- java -D java.lang.Integer.IntegerCache.high=129 <字节码文件>,是干嘛的?
- java虚拟机之client虚拟机和server虚拟机。
-
int[][] a = new int[2][];a[0] = new int[4];a[1] = new int[5];
是可以的。
- char类型的数组输出其他类型的数组在输出表现上不同。
- java 数组的复制为浅复制。
- 类上转为接口时只能调用接口中声明的方法,不能调用自己类中声明的方法。
- 接口中默认存在着9个方法,与Object类中声名的9个public方法相对应。
- 所有内部类与内部接口(包括枚举)都是public,static类型。
- 静态成员类可以访问外围类的任何成员,对于非静态的外围类成员需要通过恰当的对象引用来访问。
- 内部类(即非静态嵌套类)依赖于外围类对象,并且不可以声明静态成员。
- 嵌套接口永远是静态的,不管其声明在类中,还是其他接口中。
- 类实现了接口,需要实现该接口和其所有父接口中声明的方法,除非该类是abstract 的。但并不用实现嵌套接口中的方法。
- 匿名内部类创建表达式
new X(){};
实际上创建的是一个继承X(X为类)或实现X(X为接口)的类型对象。
- 枚举类型也是类,隐式继承java.lang.Enum,可以让函数参数是 enum类型,保证参数合法。
- 类的加载、链接、初始化;链接又分为验证、准备、解析。
- Bootstrap ClassLoader、 Extension ClassLoader 、System ClassLoader。loadClass(),findLoadedClass,getParent(),findClass()。
- 如果构造器内没有调用本类中的其他构造器,则所有的实例变量声明处初始化与实例初始化块都会被复制到构造器的最上方。而所有的静态变量声明处初始化,也可看作是复制到静态初始化块中,顺序则按照类中出现的顺序。
- 实例初始化块与静态初始化块都不能使用return 语句。静态初始化块不允许抛出任何受检异常,因为我们无法捕获这些异常。实例初始化块抛出受检异常时,所有构造器都必须跑出相应的异常或其父类。
- 编译器生成
<init>
方法处理实例初始化,<clinit>
方法处理静态初始化。
- 以下情况不会初始化类:
- 只是声明了类的引用,而没有实例化。
- 静态成员类初始化时,不会初始化其外围类
- 调用ClassLoader 的loadClass方法加载类时,不会初始化类。
- 调用类中值为编译时常量的 final静态变量。
- 编译时常量即8种基本类型和String。
- 当调用接口中的静态变量时(值为编译时常量的变量除外),就会初始化该接口。接口中的变量默认为public,static,final类型。
- 通过子类调用父类或其实现接口的成员时,不初始化子类。
- 变量只能隐藏,重写的两个方法要求是实例方法。
- 重载方法的选择标准,参数类型最“明确”的方法被选中。并且有如下顺序:
1. 参类型可赋值
2. 动拆箱与装箱
3. 变参数类型
- 可以在子类中使用非泛型化的方法重写父类中泛型化的方法,反之不可。
- 重写要求mSub()的返回值类型是mSuper()的返回值类型的可替换类型。
- 重写只能在实例方法之间。mSub()的访问权限不能低于mSuper()的访问权限,mSub()不能比mSuper()抛出更多的受检异常,当然,子类要继承了父类的mSuper()方法,子类签名是父类签名的子签名。
- 构造器不是方法,也不是类的成员。故不被子类继承。
- 在子类的构造器中,如果第一条语句没有使用this来调用另外一个构造器,则会使用super()隐式调用父类无参的构造器。如果父类没有无参的构造器就会发生编译错误。
- 并非构造器创建了对象,是new运算符创建了对象。new运算符在堆上开辟一定的空间,然后执行对象的初始化(其中包括调用构造器)。
- 在调用构造器时,首先new运算符创建对象(此时该对象还未初始化),然后会将指向新创建对象的引用作为第一个参数隐式传递到构造器中。当调用实例方法时,也会将调用方法的对象引用(此时对象已初始化)作为第一个参数隐式传递到实例方法。静态方法中没有this。
- 相同类型的实例变量与静态变量默认值是相同的。相对于成员变量,局部变量是没有默认值的(不管是什么类型)。
- 如果数组使用了new在堆上分配了空间,则数组的元素就会获得默认值,(数组的元素类似与数组的成员变量),不过数组变量本身如果没有初始化同样没有默认值。
- 对于继承的实例变量,如果子类没有隐藏父类的变量var,则this.var与super.var就是同一个变量(对同一对象而言)。他们的地址相同。
- 子类继承父类的静态变量,如果子类中没有隐藏该变量,则父类与子类中的静态变量是同一变量,其中一个改变其他随之改变。
- 类的初始化顺序:先静态,后实例;先父类,后子类,递归到Object类为止。
- 引用其他类的初始化顺序,在引用的那个点上执行引用类的相关初始化。
- 前向引用:变量尚未初始化就引用变量的值。
- 不要在构造器中调用可让子类重写的方法,以免发生前向引用。
- 值为编译时常量的final变量会最先得到初始化。其值直接写到字节码文件中,而不会发生变量的符号引用。
- 如果两个对象调用equals方法是相等的,那么这两个对象调用hashCode方法必须返回相同的整数。
- 一个类重写equals方法,一定要同时重写hashCode方法。
- 重写equals方法要求:子反、对称、传递、一致、非空引用x ,
x.equals(null)
应返回false。