JAVA复用类
文章目录
组合语法(has a)
使用一些类的引用扩展本类的功能
初始化方法
- 在定义对象的地方,确保对象在使用之前就被初始化
- 在类的构造器中
- 在正要使用这些对象之前,称为惰性初始化
- 使用实例初始化
class Light {
public void open(){
System.out.println("light is opening");
}
public void close(){
System.out.println("light is closed");
}
}
public class showLight {
boolean lightState=false;
Light light;
public showLight(Light light){
this.light=light;
}
public void lightControll(){
if(lightState){
light.open();
}else{
light.close();
}
}
}
继承语法:(is a)
重载和重写(覆写)
重载:方法名相同,参数列表不同,返回值类型可以不同,一个类中方法存在多个重载方法
覆写(重写):方法名,参数列表和返回值类型都相同父类与子类相同的方法,子类重写父类方法
使用继承方式复用
关于继承
当使用基类(被继承的类)创建出来一个导出类,该对象包含了一个基类的子对象,这个子对象和直接使用基类直接创建出来是一样的。唯一的区别是,前者包含在导出类内部,后者来自外部。
Java会自动在导出类的构造器中插入基类的构造器的调用,当你初始化一个导出类,其内部会自动初始化基类
public class A {
static String i="hello";
public A(){
System.out.println("loading ...");
}
}
class B extends A{
public B(){
System.out.println("loading B ...");
}
@Test
public static void main(String[] args) {
System.out.println(new B());
}
}
代理语法
代理是组合(再类中添加对象的引用)和继承(在类中包含了该成员对象的所有方法)之间的结合,比较知名的包装器模式就是基于此实现的
class Light {
public void open(){
System.out.println("light is opening");
}
public void close(){
System.out.println("light is closed");
}
}
public class showLight {
Light light=new Light();
public void open( ){
light.open();
}
public void close(){
light.close();
}
public static void main(String[] args) {
showLight sl= new showLight();
sl.open();
sl.close();
}
}
多态
继承允许对象视他自己本身的类型或其基类型来加以处理,进同一基类导出的多种类型视为同一类型进行处理,相当于一个类型的多种状态(行为),称为多态
多态通过自身方法调用,表现出与其他导出类不同的行为
前期绑定与后期绑定
绑定:将一个方法调用同一个方法主题关联起来
前期绑定 :在程序执行前绑定,面向过程语言默认的绑定方式
后期绑定:也称为动态绑定或运行时绑定,运行时判断对象的类型,从而调用恰当的方法,编译器不知道对象的类型,但通过语言特有的机制,找到正确的方法体,就Java而言,private 和 final不能使用后期绑定,因为这两种类型不能被其他人覆盖,也就默认了拒绝动态绑定
多态与构造器
编写构造器准则:
用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法
在一般方法体内部,动态绑定的调用是在运行时才决定的,因为对象无法知道他是属于方法所在的哪个类,还是属于那个类的导出类,如果要调用构造器内部的一个动态绑定的方法,那这是调用的就是该方法被覆盖后的定义。因为被覆盖方法在对象完全被构建出来之前被调用,会产生难以发现的错误。
构造器是构建对象过程中的一个步骤,那么,在基类当前的构造器正在被调用的过程中,导出类还没有被初始化。但是,动态绑定的方法调用却会向外深入到继承层次结构内部,它可以调用导出类里的方法
初始化步骤
1. 在其它任何事物发生之前,将分配给对象的存储空间初始化为二进制的零
2. 一次递归调用基类构造器
3. 按照声明的顺序调用成员的初始化方法
4. 调用导出类的构造器主体
这种一个基类有多个导出类,运行时动态绑定的思想和经验就是设计模式中状态模式的基础,一般来说,用继承表达行为间的差异,并用字段表达状态上的变化
运行时类型识别
向上转型
基类向导出类转换,是一种安全的类型转换
向下转型
导出类向基类转换,不是一种安全的转换,若基类调用导出类额外新加的方法,就会产生类转型异常
关于继承和组合的选择
一般来说,推荐优先使用组合,一方面,在一个复杂的软件中,继承会增加程序的复杂性
而组合相对来说比较灵活,可以根据不同情况初始化,可以在运行时改变成员对象的行为等,组合被运用在很多设计模式之中,典型的设计模式就是策略模式
接口
接口:建立起一种基本形式,以此表示说有导出类共同的部分
抽象类(abstract)
包含抽象一个或多个抽象方法的类
接口(interface)
允许人们创建一个可以允许向上转型成多个基类的类型,实现某张类似多重继承的特性,建立起类与类之间的协议。接口中域隐式为static和final.方法必须为public,使用其他编译不会通过
使用接口的原因
- 可以向上转型成多个基类类型(带来灵活性)
- 防止客户端程序员创建该类的对象,并确保则仅仅是建立一个接口
关于接口的一些设计模式
策略模式:创建一个能够根据说传递的参数对象的不同而具有不同行为的方法
适配器模式:接受你拥有的 接口,产生你需要的接口
多重继承
C++中的多重继承:组合多个类的接口的行为
*JAVA中的多继承:Java不提供多继承机制,实行单继承。因为多继承所继承的每一个类都有具体实现(就java继承机制而言,每子类(导出类)都包含只一个父类(基类)。子类若不重写就默认包含父类方法),会使程序背负很多不需要的东西。而是提供使用接口(interface)实现多继承。因为接口没有任何具体实现,所以没有任何与接口相关的存储,也就无法阻止多个接口的组合
适配接口
接口作为作为一种类的基本形式,且接口中没有具体实现,所以接口的一个很重要的作用就是适配接口——通过在现有任何类上实现一个接口,意味着让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式。相关的设计模式比如策略模式,适配器模式
final关键字
对于基本类型,final使基本类型数值恒不变,对于对象final使对象的应用恒定不变
一个既是static又是final的域只占一段不能改变的存储空间
final表示一个常量
static表示只有一份