《java编程思想》_第八章_多态

    在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序——即无论在项目最初创建时还是在需要添加新功能时都可以“生长”的程序。

一、再论向上转型

    1.方法调用绑定

    将一个方法调用同一个方法主体关联起来被称为绑定。若在程序执行前进行绑定,叫做前期绑定。在运行时根据对象的类型进行绑定,叫做后期绑定,后期绑定也叫做动态绑定或运行时绑定。java语言中,除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定

    2.产生正确的行为

    在几何形状中,有一个基类shape,以及多个导出类——如circle,square.triangle等,向上转型可以描述为:

    Shape s = new Circle();

    创建了一个circle对象,并把得到的引用立即赋值给shape,这样做看似错误,但实际上没有问题。但假设你调用了一个基类的方法,如:s.draw(),你可能认为调用的是shape的draw()方法,毕竟这是一个shape引用,其实由于后期绑定(多态),还是正确调用了circle的draw()方法。

class Shape{
	public void draw(){
		System.out.println("shape draw");
	}
}
class Circle extends Shape{
	public void draw(){
		System.out.println("circle draw");
	}
}
public class Shapes {
	
	public static void main(String[] args){
		Shape s1 = new Circle();
		Shape s2 = new Shape();
		s1.draw();
		s2.draw();
	}

}

运行结果:

circle draw

shape draw

在编译时,编译器不需要任何特殊信息就能进行正确的调用,对draw方法的所有调用都是通过动态绑定进行的。多态是一项”将改变的事物与未改变的事物分离开来“的重要技术。

3.缺陷:域与静态方法

class Shape{
	public int field = 0;
	
	public int getField(){
		return field;
	}
}
class Circle extends Shape{
	public int field = 1;
	
	public int getField(){
		return field;
	}
}
public class Shapes {
	
	public static void main(String[] args){
		Shape s1 = new Circle();
		System.out.println("s1.field===="+s1.field);
		System.out.println("s1.getField==="+s1.getField());
	}

}

运行结果:

s1.field====0
s1.getField===1

任何域访问操作都将由编译器解析,因此是不存在多态的,同样,静态方法也不具有多态性。在实践中,通常域的权限会设置成private,因此不能直接访问它们,另外,一般不会对基类中的域和导出类中的域赋予相同的名字。


二、构造器和多态

class Meal{
	Meal() {
		System.out.println("meal");
	}
}

class Bread{
	Bread(){
		System.out.println("bread");
	}
}

class Lunch extends Meal{
	Lunch(){
		System.out.println("lunch");
	}
}

public class Sandwich extends Lunch{
	private Bread b = new Bread();
	public Sandwich(){
		System.out.println("sandwich");
	}
	public static void main(String[] args){
		new Sandwich();
	}
}

运行结果:

meal
lunch
bread

sandwich

复杂对象调用构造器要遵循下面的顺序:

1)调用基类构造器

2)按声明顺序调用成员的初始方法

3)调用导出类构造器的主体

你可能感兴趣的:(学习笔记)