第九章 多态和抽象

一、多态

1.多态概念

多态:就是相同的行为,不同的实现。允许父类的引用变量指向一个子类的对象

对同一个对象来说,做同一件事情,有不同的实现和结果。方法重写和重载。

对同一件事情来说,不同的对象来做,也有不同的结果。动态参数和异构集合里面。

2.基本多态

同一个类中:表现为方法的重载;根据不同的条件,来做同一件事情。产生不同的结果。

子类和父类:表现为方法的重写;根据每个子类不同的特征和行为,改变同一件事情做法(联系和差异的集中体现)。

3.进阶多态

多态参数(父类类型  ||   接口类型);异构集合(为了统一管理有继承关系的不同类型的数据,存放为(父类的引用变量))。这2个是多态里面最常用的。

一件大家都可以做的事情:(传递一个对象进来做)(父类/接口 形参)(子类对象||父类对象||实现接口类)

父类可以做,子类可以做。但是又不想用重载或者重写来调用,而是只要会做这个事情,就随便你去做,不关心怎么做。

4.向上转型

多态中:父类引用可以指向一个子类对象,子类对象也是一个类型类型的数据。(is    a)关系。

5.动态绑定

java中普通方法都使用动态绑定技术。除了private,static,final,构造这些方法(他们要么一开始就能确定,要么就是不能再外部使用)。

方法编译时,并不知道具体的执行。当参数确定时,才能确定(父类对象直接调用父类的方法,子类对象则会调用继承的方法(要么重写了的,要么没有))

如果一个方法使用了final。表示这个方法是一个最终方法,不允许子类重写的。那么调用时到此为止,不用继续往下查了。

6.类型匹配instanceof

为了确定一个对象是否匹配某个特定的类型。或者说判断对象是否是某个特定类的实例化对象。

子类对象  instanceof    父类     true

子类对象  instanceof    子类     true

父类对象  instanceof    父类     true

父类对象  instanceof    子类     false

判断成功之后,可以把   父类引用变量    强制转换成为一个     子类引用变量。

二、抽象

1.抽象概念

把一些有相似属性和行为的(一类东西)的       属性和行为        提取出来的的过程。它是一个概念,不是客观存在的。

就是把对象   抽象    为一个类,具有通用的属性和行为,并且是每个对象都具备的。

再把不同的类,抽象为一个父类。继续抽象,到了最终有个父类。它有某些行为,但是不能具体的实现(方法没有通用性)。

2.抽象方法

用abstract 来修饰的方法,这方法只有声明,没有实现部分。

有抽象方法的类一定是一个抽象类;不能实例化对象的类;因为每一个具体的对象它们的方法一定是客观存在的,抽象的不是客观存在的,只有一个概念。

抽象方法在非抽象的子类中必须被实现,要不就是一个抽象子类。最终一定会被类实现。

public   abstract   void    function();

3.抽象类

用abstract  修饰的类。该类无法实例化,即不能产生对象。

非抽象子类必须实现它的抽象方法。

抽象类中可以没有抽象方法。但是这样没有实际意义。

列子:

public class Polygon {
	private int sides;
	private double area;
	
	public Polygon(){
		System.out.println("在Polygon类的     无参     构造器中");
	}
	
	public Polygon(int sides){
		this.sides = sides;
		System.out.println("在Polygon类的构造器中");
	}
	
	public int getNumberOfSides() {
		System.out.println("这个是:"+this.sides+"边行!");
		return sides;
	}
	
	public double getArea() {
		return area;
	}
	
	

	public void setArea(double area) {
		this.area = area;
	}

	@Override
	public String toString() {
		return "多边形 [边数=" + sides + ", 面积=" + area + "]";
	}
	
	
	
}
public class Triangle extends Polygon{
	private int base;//三角形的底
	private int height;//三角形的高
	
	public Triangle(){

	}
	
	public Triangle(int base,int height){
		super(3);
		this.base = base;
		this.height = height;
		System.out.println("在Triangle类的构造器中");
	}

	@Override
	public String toString() {
		return "三角形 [底=" + base + ", 高=" + height +", 面积=" + this.getArea() + "]";
	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		double area = 0;
		area = 1.0/2*this.base*this.height;
		super.setArea(area);
		return super.getArea();
	}

	public int getBase() {
		return base;
	}

	public int getHeight() {
		return height;
	}
	
	
	
}


 
public class RightTriangle extends Triangle{
	private double hypotenuse;
	
	public RightTriangle(int base,int height){
		super(base,height);
		this.hypotenuse = Math.sqrt(base*base + height*height);
		System.out.println("在RightTriangle类的构造器中");
	}

	@Override
	public String toString() {
		return "右三角形 [底=" + this.getBase() + ", 高=" + this.getHeight() +", 斜边=" + this.getHypotenuse()+", 面积=" + this.getArea() + "]";
	}

	public double getHypotenuse() {
		return hypotenuse;
	}
	
	
}
public class Test {
	public static void main(String[] args){
		Polygon k = new Polygon();
		Triangle t = new Triangle(4,5);
		RightTriangle y = new RightTriangle(4,5);
		System.out.println(k);
		System.out.println(t);
		System.out.println(y.getArea());
		System.out.println(y.getBase());
		System.out.println(y.getHeight());
		System.out.println(y.getHypotenuse());
		System.out.println(y.getNumberOfSides());
	}
}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值