一、(p48)为什么需要public static void main(String[] args)这个方法?
1、JVM加载类之后,可以直接运行
2、public 和 static修饰符是必须的,但是顺序可以不确定,另外还可以用synchronized、 final来修饰main方法,但是注意不能用abstract修饰。
3、同一个.java文件中可以包含多个main函数,但是只有名称与文件名相同的类中所包含的main函数才是入口。
二、如何实现在main()执行之前,打印“hello world”
由于静态代码块会在类加载的时候被调用,所以可以这样实现:
public class Test{
static{
System.out.println("Hello world!");
}
public static void main(String[] args){
System.out.println("main 函数执行");
}
}
三、(p50)Java程序初始化的顺序是怎么样的
Java实例化对象的时候,成员变量初始化完成之后,才会调用构造函数;
三个原则:静态变量优先于非静态变量;父类优先于子类;其他成员变量按照定义的顺序进行初始化。
执行顺序:父静态变量->父静态代码块->子静态变量->子静态代码块->父非静态变量->父非静态代码块->父构造函数->子非静态变量->子非静态代码块->子构造函数。
四、有关修饰符的总结
default和protected:前者表示同包可见,后者表示同包或者子类可见。protected修饰的变量可访问性更高。
用以修饰类的修饰符只有:public、abstract、final。protected以及private不能修饰类。
五、(p53)一个.java文件中如何定义多个类
一个.java文件中可以写多个类,但是只有一个类可以用public修饰(或者没有public)并且该类的名称需要与文件名相同。其他类可以就此视作包类作用的类。
六、构造函数的注意事项
1、构造函数总是伴随着new操作被调用;
2、构造函数不可以被继承,因此亦不能被覆盖,但是可以被重载;
3、当父类没有提供无参构造函数的时候,子类的构造函数中需要显示的调用父类的构造函数,并且需要首先调用;
4、普通方法可以和构造函数同名。
七、java中的标志接口
1、接口中的成员作用域修饰符都是public;
2、接口中可以定义一些常量值,其修饰符默认为public static final,接口中的方法只能用public、abstract修饰(final、static、protected不能用);
3、那些不包含任何方法的接口被称作标志接口,如Cloneable、Serializable;
4、通常用instanceof来判断一个对象是否实现了一个标志接口。
5、接口中的方法与抽象类中的抽象方法类似(实际就是抽象方法),都只能用public、abstract修饰。
八、(p60)Java中的clone方法
1、clone的一般步骤(类中不包含对象):
class Obj implement Cloneable{//继承接口
...
public Object clone(){//重写方法
Object o = null;
try{
o = (Obj)super.clone();
}catch(CloneNotSupportedException){
e.printStackTrace();
}
return o;
}
}
2、类中包含对象,就需要进行深复制
class Obj implement Cloneable{//继承接口
private Date birth = new Date();//包含对象
...
public Object clone(){//重写方法
Object o = null;
try{
o = (Obj)super.clone();
}catch(CloneNotSupportedException){
e.printStackTrace();
}
o.birth = (Date)this.getBirth().clone();//对每一个对象attr执行o.attr = (T)this.getAttr().clone();
return o;
}
}
3、浅复制与深复制:前者仅仅考虑所复制对象的本身,而不复制它所引用的对象。
九、(p61)反射机制相关要点
1、反射的主要功能:得到对象所属的类(Class)、获取类的成员变量和方法、运行时创建对象、运行时调用对象的方法。
2、3种方法获取到Class类:
1) Class.forName("...");
2) 类名称.Class;
3) 对象.getClass();
3、Java中创建对象的4种方法:用过new语句实例化对象、通过反射创建对象、通过clone、通过反序列化。
Class c = Class.forName("Sub");
Base b = (Base) c.newInstance();
b.method();