本文主要内容:
(1)代码的加载顺序
(2)native关键字
(3)abstract关键字
(4)抽象类
(5)接口
1.加载顺序(执行顺序)
(1)加载父类
(2)父类会产生自己的静态空间,属性、方法、块、执行静态块
(3)加载子类
(4)子类会产生自己的静态空间,属性、方法、块、执行静态块
(5)开辟对象空间
(6)加载父类的非静态成员,属性、方法、块、构造方法
(7)执行块、执行父类的构造方法,普通方法
(8)加载子类的非静态成员,属性、方法、块、构造方法
(9)执行块、执行子类的构造方法,普通方法
(10)将对象空间的地址引用交给变量来存储
2.native:本地的
java源代码中看到的native就已经再也看不见后序代码了
后续会调用其他的编程语言C++、C执行内存的操作,帮我们操作内存,比如Object类中的方法:hashCode()
3.abstract:抽象的——没有具体的执行
修饰什么?
(1)修饰方法:用abstract修饰符修饰方法,只有方法的结构,没有方法执行体,即为抽象方法,注意用native修饰的方法虽然也没有方法体,但是不是抽象方法,只是执行过程是其他语言写的,看不见底层源码
(2)修饰类:用abstract修饰的类叫做抽象类。
特点:
抽象类中并不是必须含有抽象方法;抽象方法可以抽象类中,也可以放在接口中,普通类不允许含有抽象方法。
4.什么是抽象类,抽象类有什么特点?
(1)类中的成员:
属性:可以含有一般的属性,也可以含有被特征修饰符static、final修饰的属性等等
方法:可以含有一般的方法,也可以含有被static、final修饰的方法等等
块:可以含有一般的程序块,也可以含有static程序块
构造方法:可以含有构造方法,包括重载
(2)类如何使用、如何创建对象
抽象类含有构造方法,但是不能通过调用构造方法来直接创建对象,抽象类只能通过子类继承来创建对象(不能自己实例化,必须通过子类进行实例化)
(3)类和类的关系
抽象类可以直接单继承抽象类;抽象类可以直接单继承具体类;具体类也可以直接单继承抽象类,但是必须将父类的抽象方法实例化,或者子类也变成抽象类。
(4)小问题
抽象类中可以没有抽象方法,全部都是具体成员;抽象类中也可以没有具体的方法,全部为抽象方法,即抽象类抽象到极致就发生质的变化,称为接口;接口可以理解为是抽象类抽象到极致,不能用class修饰,改用interface修饰。
5.接口
(1)有什么成员?
属性:不能含有一般属性,只能含有公有的静态的常量(public static final修饰)
方法:不能含有一般的方法,只能含有公有的抽象方法(1.8 defualt修饰具体的方法)
块:不能含有一般的程序块,也不能含有static块(块本身为具体的,接口中不能有具体的)
构造方法:不能含有构造方法
(2)如何使用、创建对象?
不能创建对象,只能通过子类多实现(implements)
(3)类与类之间的关系
接口可以继承多个接口;抽象类可以实现多个接口;类可以实现多个接口,但是必须将接口中的抽象方法具体化(即覆写接口中的抽象方法);接口不能继承抽象类或类。
6.小例子说明
设计一款游戏,王者荣耀,游戏中:
英雄——抽象类(坦克、法师、刺客、射手)
小兵——抽象类(法师兵、坦克兵)