- 首先看子类是否有该属性
- 如果子类有这个属性,并且可以访问,则返回信息
- 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息…)
- 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object…
- 左边为编译类型,右边为运行类型
- 向上转型:父类的引用指向子类的对象,语法:父类类型引用名 = new 子类类型
- 向下转型:子类类型 引用名 = (子类类型)父类类型
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。
- 当调用对象属性的时候,没有动态绑定机制,哪里声明,哪里使用。
- instanceof判断运行类型是否相同
- 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作
- 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize 方法。
- 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制
- 鼠标处 Ctrl+B查看方法源码
- main方法时虚拟机调用
- java虚拟机在执行main()方法时不必创建对象,所以方法必须是static
- java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public
- 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
- 在 main()方法中,我们可以直接调用 main 方法所在类的静态方法或静态属性。
- 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
- 静态方法,只能访问静态的成员;非静态的方法,可以访问静态成员和非静态成员
static代码块也叫静态代码块,作用就是对类进行初始化,**而且它随着类的加载而执行,并且只会执行一次。**如果是普通代码块,每创建一个对象,就会执行。如果只是使用类的静态成员时,普通代码块并不会执行。
9. 类什么时候被加载- 创建对象实例时(new)
- 创建子类对象实例,父类也会被加载
- 使用类的静态成员时(静态属性,静态方法)
- 调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
- 调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)
- 调用构造方法。
- 构造器的最前面其实隐含了super()和调用普通代码块。静态相关代码块、属性初始化,在类加载时,就执行完毕,因此是优先于构造器和普通代码块执行的。
- 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
- 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
- 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
- 父类的构造方法
- 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
- 子类的构造方法//面试题



