多态:参数不同,相同的类执行的功能不同。多态是一项让程序员将改变的事物与未改变的事物分离开来的重要特征。只有普通的方法调用可以是多态的,构造器并不具有多态性(它实际上是static方法,只不过该static声明是隐式的)。只有非private方法才可以被覆盖(在导出类中,对于基类中的private方法最好采用不同名字)。
将一个方法调用同一个方法主体关联起来被称为绑定,java中除了static方法和final方法(private属于final方法)之外,其他所有的方法都是后期绑定(后期绑定;在运行时根据对象的类型进行绑定)
复杂对象调用构造器的顺序:
- 调用基类构造器
- 按声明顺序调用成员的初始化方法
- 调用导出类构造器的主题
必须令所有构造器都得到调用,否则就不可能正确构造完整对象。销毁的顺序应该和初始化顺序相反,对于字段则意味着与声明顺序相反。
- 向上转型会丢失具体的类型信息
- 接口和内部类为我们提供了一种将接口与现实分离的更加结构化的方法
- 抽象类介于普通类与接口之间(包含抽象方法的类叫做抽象类)
抽象类(abstract)和接口(interface)的区别
- 接口:只提供形式,而未提供任何实现。接口包含的域必须是隐式的static和final的,当要实现一个接口时,在接口中被定义的方法必须被定义为public。接口可以实现解耦合。使用接口可以达到向上转型为多个基类型的目的,与使用抽象基类相同,防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。接口可以继承一个或多个接口。
- 抽象类:它可以有默认的方法实现。其实现需要子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所声明的抽象方法的实现。抽象类可以有构造器。抽象类的速度比接口要快。
使用场景
- 如果拥有一些方法并且想让它们中的一些有默认实现,就使用抽象类
- 要实现多重继承,就必须使用接口
- 要是基本功能在不断改变,那么就需要使用抽象类
内部类(InnerClass)相关
- 想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像在main()方法中那样具体地指明这个对象的类型,即:OutClassName.InnerClassName[典型情况:外部类有一个方法,该方法返回一个指向内部类的引用]。内部类的对象能访问其外围对象的所有成员,而不需要任何特殊条件。