一、类的初始化顺序
1 (静态变量,静态代码块)-->(变量,初始化块)--> 构造器
同一括号里的,根据它们在程序中的顺序来决定。上面所述是同一类中。如果是继承的情况,那就在父类到子类交替初始化。
二、String
1 String a = "abc";
JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的对象,根据String类的equals(Object obj)方法的返回值来判断。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
2 String a = "ab" + "cd";
常量值在编译期就被确定。上面代码等同于:String a = "abcd";只创建了一个对象。
3 String a = new String("abc")
JAVA虚拟机在堆中创建一个String对象,它的值(value)是在栈(字符串池)中创建的对象("abc"),所以,创建了两个对象。
三、属性覆盖
1、private修饰的变量不能被覆盖。
2、属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义变量的类型。(这点后面代码说明)
3、default,protected和public修饰符并不影响属性的覆盖。
4、静态变量和静态常量属于类,不属于对象,因此它们不能被覆盖。
5、常量可以被覆盖。
6、对于基本类型和对象,它们使用同样的覆盖规律。
四、final,finally和finalize的区别
1、final
(1)修饰变量:变量只能被赋值一次,变量可以在初始化块和构造器中初始化,不可以在静态代码块中初始化。static final修饰的变量可以在静态代码块中初始化,不可以在初始化快和构造器中初始化。
(2)修饰方法:方法不能被子类覆盖,但不影响被子类继承。
(3)修饰类:不允许被继承,类中所有方法不能被重写,但并不代表类中的属性值不能被改变。
2、finally用在try/catch语句中,并且附带着一个语句块,表示这段代码最终总是被执行。如果try语句块中有return、continue和break,则finally语句块是在这三个语句之前被执行。
3、finalize是一个方法,属于java.lang.Object类。是GC(garbage collector)运行机制的一部分,所有类都有这个方法。Object的任意子类都可以重写该方法,在其中释放系统资源或者做其他的清理工作,入关闭输入输出流。该方法在GC清理它所从属的对象是被调用,若果执行过程中抛出了无法捕获的异常(uncaught exception),GC将终止对该对象的清理,并且该异常会被忽略,直到下一次GC清理这个对象时,finalize方法被再次调用。
System.gc()如同Runtime.getRuntime().gc(),只是建议GC启动,但是GC启动并不一定,这取决于JAVA虚拟机。直到虚拟机停止运行,可能有些对象的finalize方法没被运行过。只有通过调用System类的另一个方法:
runFinalizersOnExit(boolean value)才能保证对象的finalize方法在虚拟机停止运行前一定运行过。但该方法是不安全的,可能会造成finalize方法被误调用。
五、日期时间
1 DateFormat.parse(String source) String --> Date
2 DateFormat.format(Date date) Date --> String
六、switch
1 long,float,double,boolean,所有类型的对象(包括String类,排除byte,char,short,int四种基本类型对应的包装类)不能用于switch括号里表达式
七、位运算
1 移位运算符可用于byte,short,int,long,char,但不能用于float,double;
2 byte,short,char在移位前被自动转换为int,结果也为int。
1 << 35 = 1 << (35%32) = 1 << 3 = 8
100 >> 35 = 100 >> (35%32) = 100 >> 3 = 12
3 左移(<<)一位相当于 *2 ,有符号右移(>>) 相当于 /2 。
八、创建的方式
1 new
2 调用Class类的newInstance()方法,利用反射机制创建对象。
代码说明:
三、属性覆盖
2、
package test;
class ParentClass {
private String privateField = "Parent_private";
String frieddlyField = "Parent_friendly";
protected String protectedField = "Parent_protected";
public String publicField = "Parent_public";
public String getPrivateField() {
return this.privateField;
}
}
class SubClass extends ParentClass {
private String privateField = "Sub_private";
String frieddlyField = "Sub_friendly";
protected String protectedField = "Sub_protected";
public String publicField = "Sub_public";
public String getPrivateField() {
return this.privateField;
}
}
public class OverrideTest {
public static void main(String[] args) {
ParentClass subClass = new SubClass();
System.out.println(subClass.getPrivateField());
System.out.println(subClass.frieddlyField);
System.out.println(subClass.protectedField);
System.out.println(subClass.publicField);
}
}
运行结果:
Sub_private
Parent_friendly
Parent_protected
Parent_public
1 (静态变量,静态代码块)-->(变量,初始化块)--> 构造器
同一括号里的,根据它们在程序中的顺序来决定。上面所述是同一类中。如果是继承的情况,那就在父类到子类交替初始化。
二、String
1 String a = "abc";
JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的对象,根据String类的equals(Object obj)方法的返回值来判断。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
2 String a = "ab" + "cd";
常量值在编译期就被确定。上面代码等同于:String a = "abcd";只创建了一个对象。
3 String a = new String("abc")
JAVA虚拟机在堆中创建一个String对象,它的值(value)是在栈(字符串池)中创建的对象("abc"),所以,创建了两个对象。
三、属性覆盖
1、private修饰的变量不能被覆盖。
2、属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义变量的类型。(这点后面代码说明)
3、default,protected和public修饰符并不影响属性的覆盖。
4、静态变量和静态常量属于类,不属于对象,因此它们不能被覆盖。
5、常量可以被覆盖。
6、对于基本类型和对象,它们使用同样的覆盖规律。
四、final,finally和finalize的区别
1、final
(1)修饰变量:变量只能被赋值一次,变量可以在初始化块和构造器中初始化,不可以在静态代码块中初始化。static final修饰的变量可以在静态代码块中初始化,不可以在初始化快和构造器中初始化。
(2)修饰方法:方法不能被子类覆盖,但不影响被子类继承。
(3)修饰类:不允许被继承,类中所有方法不能被重写,但并不代表类中的属性值不能被改变。
2、finally用在try/catch语句中,并且附带着一个语句块,表示这段代码最终总是被执行。如果try语句块中有return、continue和break,则finally语句块是在这三个语句之前被执行。
3、finalize是一个方法,属于java.lang.Object类。是GC(garbage collector)运行机制的一部分,所有类都有这个方法。Object的任意子类都可以重写该方法,在其中释放系统资源或者做其他的清理工作,入关闭输入输出流。该方法在GC清理它所从属的对象是被调用,若果执行过程中抛出了无法捕获的异常(uncaught exception),GC将终止对该对象的清理,并且该异常会被忽略,直到下一次GC清理这个对象时,finalize方法被再次调用。
System.gc()如同Runtime.getRuntime().gc(),只是建议GC启动,但是GC启动并不一定,这取决于JAVA虚拟机。直到虚拟机停止运行,可能有些对象的finalize方法没被运行过。只有通过调用System类的另一个方法:
runFinalizersOnExit(boolean value)才能保证对象的finalize方法在虚拟机停止运行前一定运行过。但该方法是不安全的,可能会造成finalize方法被误调用。
五、日期时间
1 DateFormat.parse(String source) String --> Date
2 DateFormat.format(Date date) Date --> String
六、switch
1 long,float,double,boolean,所有类型的对象(包括String类,排除byte,char,short,int四种基本类型对应的包装类)不能用于switch括号里表达式
七、位运算
1 移位运算符可用于byte,short,int,long,char,但不能用于float,double;
2 byte,short,char在移位前被自动转换为int,结果也为int。
1 << 35 = 1 << (35%32) = 1 << 3 = 8
100 >> 35 = 100 >> (35%32) = 100 >> 3 = 12
3 左移(<<)一位相当于 *2 ,有符号右移(>>) 相当于 /2 。
八、创建的方式
1 new
2 调用Class类的newInstance()方法,利用反射机制创建对象。
代码说明:
三、属性覆盖
2、
package test;
class ParentClass {
private String privateField = "Parent_private";
String frieddlyField = "Parent_friendly";
protected String protectedField = "Parent_protected";
public String publicField = "Parent_public";
public String getPrivateField() {
return this.privateField;
}
}
class SubClass extends ParentClass {
private String privateField = "Sub_private";
String frieddlyField = "Sub_friendly";
protected String protectedField = "Sub_protected";
public String publicField = "Sub_public";
public String getPrivateField() {
return this.privateField;
}
}
public class OverrideTest {
public static void main(String[] args) {
ParentClass subClass = new SubClass();
System.out.println(subClass.getPrivateField());
System.out.println(subClass.frieddlyField);
System.out.println(subClass.protectedField);
System.out.println(subClass.publicField);
}
}
运行结果:
Sub_private
Parent_friendly
Parent_protected
Parent_public