jvm加载类的过程:
共分为三个阶段:
加载、链接和初始化
加载阶段:这个阶段,jvm主要完成三件事:
①通过一个类的包名与类名来获取定义此类的二进制字节流(Class文件),获取的方式可通过jar包、war包、网络中获取、jsp文件生成等方式。
②将这个字节流所代表的静态存储结构转化为方法区的运行时的数据结构。(这里指数转化了数据结构,并没有合并数据。方法区是用来存放已知被加载的类信息、常量、静态变量、编译后的代码的运行时内存区域。)
③在内存中生成一个代表这个类的java.lang.Class对象、作为方法区这个类的各种访问数据的访问入口,这个Class对象是在堆内存中。
链接阶段:链接大致分为三个阶段:
①验证:验证被加载后的类是否有正确的结构,类数据是否符合虚拟机的要求,确保不会损害计算机。
②准备:为类的静态变量和常量在方法区中分配内存,给静态变量赋缺省值(0、0.0、null),给静态常量赋值。
③解析:将类的二进制数据中的符号引用换为直接引用。
初始化阶段:类的初始化阶段的主要工作是为静态变量赋程序设定的初始值。
执行静态块、为静态变量赋值。(和代码的顺序有关)
四种修饰符:
面向对象编程的三大特点:继承、封装、多态
封装:把成员变量设为私有的,通过共有的get、set方法来访问和修改。提高了安全性。
继承:子类可以继承父类除构造器外的所有属性和方法。(extends )
子类可以重写父类的方法,遵循 方法名相同、参数相同、返回值数据类型<=父类返回值数据类型、访问修饰符范围>=父类访问修饰符范围 的原则。主要就是重写方法体。
如果子类新定义的属性与继承的变量重名、那么访问的是子类新定义的属性,如果想访问继承的属性,需要加在属性名前加Super.
在子类重写父类的方法中想调用父类的方法。可以在方法名前加Super.来调用。
Super的第二种用法:
如果你不想使用父类无参构造器来构建super区,那么必须需要使用:super(实参)来指定。
如果调用的是父类无参构造器,使用super();,可以省略不写。
注意:super(..)必须是子类构造器中的第一条语句!
多态:
向上转型和向下转型:
子类转为父类为向上转型,父类再转回子类为向下转型。
向上转型系统会自动转,向下转型需要强制转型。
转型都是对子类对象的操作,向上转型的时候地址保存的是子类对象的super区,向下转型时又将地址修改为子类对象的this区。
多态,顾名思义多种形态,主要是指一个方法在执行时,根据传入对象的不同,执行的方法体不同。
多态产生的条件:继承关系、方法的重写、向上转型
多态的优点:
(1)提高代码的重用性
(2)降低程序的耦合度
代码的书写:
P为父类,C为子类
向上转型: P p1=new C();
向下转型: C c1=(C) p1;
instanceof
判断一个对象是否属于某种类的关键字
子类对象属于父类也属于子类。
用法:对象名 instanceof 类名或接口名 ; 返回值为Boolean类型。
final:
把变量变为常量的关键字。
可以修饰类,当修饰类时,这个类不能被继承。
修饰变量时,保存的数据不可被修改。
修饰方法时,该方法可以被继承不能被重写。
接口interface:
接口可以看作是更加抽象的抽象类,接口中主要定义 常量 属性和抽象方法。
属性的修饰符为 public final static
属性的修饰符为缺省时,默认为public final static
方法的修饰符为:
抽象方法:public abstract
类方法: public static
实例方法:public default
方法的修饰符为缺省时,默认为public abstract
一个类可同时实现多个接口,但只能继承一个类