java三大特性之一(多态)

多态:接口的多种不同实现方式。

多态必须满足的三大条件:

1、继承

2、必须有方法的重写

3、向上转型,使用父类的方法,通过动态绑定机制实现子类的方法实现,可以减少子类对父类某个方法的重复重写。

 

动态绑定机制:java提供一种动态绑定机制。在运行期判断对象类型,并分别调用适当的方法。

 

public class Shape {
	public void draw(){
		System.out.println("Shape draw");
	}
}

 

public class Circle extends Shape {
	public void draw(){
		System.out.println("Circle draw");
	}
}

 

public class Square extends Shape{
	public void draw(){
		System.out.println("Sqaure draw");
	}
}

 

public class ShapeMain {
	public static void main(String[] args) {
		Shape shape_c = new Circle();	//向上转型
		Shape shape_s = new Square();	//向上转型
		
		//动态绑定
		shape_c.draw();
		shape_s.draw();
	}
}

 

输出结果:

 

Circle draw
Sqaure draw

 


ShapeMain类,看似是Shape的句柄调用了draw()方法,但因为java的动态绑定机制,所以能正确识别对象的类型,正确调用了对象的draw方法。

 

抽象类和抽象方法:

1、一个类包含了抽象方法的类叫抽象类。只要一个类里有一个抽象方法,则这个类就必须定义为抽象类,否则编译器报错。

 

public  class Shape {	//编译器报错,The abstract method draw in type Shape can only be defined by an abstract class
	public abstract void draw();
	public void clear(){};
}

 

 

 

 

 

 

 

 

 

 

2、即使一个类不包含抽象方法,也可以将它定义为抽象类,可以禁止那个类的所有实例。

 

public abstract class Shape {
}

 

 

 

 

 

3、一个抽象类里可以包含抽象方法和非抽象方法,可以抽象方法是0个。

 

public abstract class Shape {
	public void draw(){};
	public void clear(){};
}


4、因为抽象方法是不完整的,所以不能将一个抽象类实例化。

 

5、如果子类继承父类,则子类需实现父类的所有抽象方法,也可以不实现,如果有部分不实现,则子类也需定义成抽象类。

 

接口:更深一层的抽象

关键字:interface

定义一个接口:

 

public interface IShape {
	public void draw();
	public void clear();
}

定义的接口的方法默认都是public且是抽象的abstract

 

 

 

public class zhengfangxing implements IShape{
//编译报错:The type zhengfangxing must implement the inherited abstract method IShape.clear()
	public void draw() {
		System.out.println("正方形 draw");
	}
}

如果一个普通的class实现了一个接口,则必须实现接口的所有方法,否则会编译报错。

 

 

public class zhengfangxing implements IShape{
	public void draw() {
		System.out.println("正方形 draw");
	}

	public void clear() {
		// TODO Auto-generated method stub
		
	}
}

 

 

 

或者可以将该类改成抽象类,对部分方法暂不予实现。

 

public abstract class zhengfangxing implements IShape{
	public void draw() {
		System.out.println("正方形 draw");
	}
}


接口和抽象之间的关系:
1、抽象类可以有部分非抽象方法,部分抽象方法。在子类继承抽象类的时候,若抽象类可以加入新的方法则子类同时也可以继承新的方法。

 

接口是只能定义抽象方法,如果要拓展接口则实现接口的具体类都会编译出错(没有实现抽象类),不便于接口拓展。

2、抽象类是个类,只能单继承;接口可以多实现。

 

public class zhengfangxing extends Shape implements IShape{
	public void draw() {
		System.out.println("正方形 draw");
	}
}


3、接口是定义混合型类的理想工具,可以实现多实现。

 

4、缺省适配器模式(设计模式):

为了同时利用接口的多实现和抽象类的便于拓展的特性,可以先定义一个接口,然后用一个抽象类实现这个接口。

真正的具体类既继承了抽象类也实现了接口,这样既可以多实现也可以便于拓展。

在结构层次上说,是接口=>抽象类

 

//定义一个接口

 

public interface IShape {
	public void draw();
	public void clear();
}

 

 

//抽象类实现接口

public abstract class Shape implements IShape{
	public abstract void draw();
	public void clear(){
		System.out.println("Shape Clear");
	};
	
	public void chage(){
		System.out.println("chage");
	}
}

 

//具体类继承抽象类和实现接口

public class Square extends Shape implements IShape{
	public void draw(){
		System.out.println("Sqaure draw");
	}
	
	public void clear(){
		System.out.println("Sqaure Clear");
	};
}


有单继承,多实现的概念

 

接口可以通过继承生成新的接口,接口继承的话可以多继承:

 

public interface Interface1 {
	public void f1();
}

 

public interface Interface2 extends Interface1 {
	public void f2();
}

 

public interface Interface3 extends Interface1, Interface2{
	public void f3();
}


接口中定义的字段:

 

接口中定义的字段具有final static的属性。因为是静态的,所以类一加载就为字段分配内存,并且初始化。

 

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值