java中的代码块是用{}括起来的代码,进行一些功能的限定java
和类初始化相关的构造方法执行顺序:静态代码块 > 构造代码块 > 构造方法spa
public class FanXing { //静态代码块 static { System.out.println("静态代码块一执行了!"); } static { System.out.println("静态代码块二执行了!"); } //构造方法 public FanXing() { System.out.println("构造方法执行了!"); } //构造代码块 { System.out.println("构造代码块一执行了!"); } { System.out.println("构造代码块二执行了!"); } public static void main(String[] args) { FanXing f = new FanXing(); //局部代码块 { System.out.println("局部代码块执行了"); } } }
执行结果为:code
静态代码块一执行了!
静态代码块二执行了!
构造代码块一执行了!
构造代码块二执行了!
构造方法执行了!
局部代码块执行了对象
咱们必定要知道通常状况下继承是为了方法的重写,而不是为了功能的扩展,功能的扩展用接口实现,java中只有单继承和多重继承,没有多继承(接口有多继承,这也在必定程度上弥补了接口单一原则的弊端,继承提升了代码的复用性和维护性,让类与类产生了一个关系,是多态的前提。blog
可是任何事物都有两面性,继承也有很差的一面的,咱们写程序都追求低耦合好内聚,意思就是尽可能让一个类独立完成本身的功能,不和其余类产生联系,这样不利用代码的扩展。甚至继承在必定程度上打破了封装性。继承
继承的注意事项:接口
同一个对象在不一样时刻体现出来的不一样状态。多态是在写代码时期因为没法肯定该引用类型,用一种对象引用来表现多种对象,咱们常见的传参是抽象类或者接口类型的其实都是多态,多态的前提:有继承或者实现关系,有方法重写,有向上转型。在多态中主要的是方法的重写,由于只有不一样的“态”具备不一样的方法内容,多态才有实际的意义。生命周期
一样的多态也有弊端,对于向上转型,该对象不能调用子类特有的方法,调用前须要将此对象强转子类对象,也就是向下转型。get
多态中,例如:Person s = new Stiudent()不管什么属性在编译时都是先检验Person类中是否存在,而在运行时只有成员方法会调用Student类中的方法,其余的都是调用Person中的,因此说多态是基于方法重写的!同步
咱们在继承的时候就知道了,有些方法在父类和子类中会有不一样的实现,那么若是这个方法在父类中并不会有具体的实现,就仿佛多态在真正初始化以前是不知道什么类型的,因此这个方法在不被真正重写以前是不知道具体内容的,那么这个方法咱们就能够用abstract修饰,来声明该方法此时没有具体的实现内容,须要子类不得不重写,这就是抽象方法,而一个类有了抽象方法,这个类就必须用abstract修饰来标注它是一个抽象类,
abstract:做为一个修饰符,是抽象的标识,那么抽象每每 意味着和不少关键字冲突,好比说private static final,仔细想一想那几个关键字的含义你便明白为何了,其实abstract只能和俩个修饰符共存:protected和public,由于java中是这样说的:The abstract method fun in type FanXing can only set a visibility modifier, one of public or protected.
若是咱们说抽象类是共性的提取,那么接口就是特性的扩展,接口是用来给类扩展功能的,实现一个接口就 意味着扩展该接口中的方法