【Java进阶】到底什么是抽象?

昨天和同事聊到Java抽象的这个概念,今天想深入理解以下什么是Java中的抽象。

初识抽象

        理解抽象,首先我们得理解抽象这个词本身的概念,那么什么是抽象?抽象这个词本身就很抽象。

在百度的解析是这么说的:

        抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。

        其实说白了,抽象就是把事物的共同特征总结为一点。 他和具体又是相对的。就比如说“男人”对于“人类”是具体的,而“动物”对于“人类”又是抽象的。抽象---》抽出相同特征的对象,他也有个同义词叫归类。

编程中的抽象

        其实所有编程语言的最终目的,都在于提供一个提供一个“抽象”的方法。在汇编语言中是对基础机器少量的抽象。后来许多的命令式语言(如FORTRAN,BASIC和C)又是对汇编语言的一种抽象。虽然比起汇编语言,这些命令式的语言已经有了进步,但是他的原理依然要求我们着重考虑计算机的结构而非问题本身的结构。在机器模型与解决的问题模型之间,程序员必须建立出一种联系。

面向对象的设计

        其实面向对象的程序设计则跨出了一大步。其实每个对象都是一台都类似于一个小型的计算机。他们有着自己的状态,而且可以要求他们执行特定操作。相比于现实中的“物体”,“对象”也存在共通的地方,也有这自己的特征和行为。可以将面向对象总结为五个特征:

  1. 万物皆是对象。把对象想象为新型变量,它保存着数据,同时也可以自己操作自己。
  2. 程序由一堆对象组合。通过消息传递,各个对象之间知道自己该做什么。
  3. 每个对象有自己的存储空间,对象中可以容纳着其他对象。
  4. 每个对象都有一个类型。每个对象都是某个“类”的“实例”。“类”也就是“类型”,一个类最重要的特征就是“能将什么消息发给他”。
  5. 同一类的所有对象都能接收相同的消息。

Java中的抽象

理解Java中的抽象,我们不妨先看一段代码,这段代码分别计算了圆和矩形的面积,我们来看看传统的做法。

class Test
{
	public static void main(String[] args) 
	{
		rectangle s1 = new rectangle(5,10);
		s1.GetArea();
		circle s2 = new circle(10);
		s2.GetArea();
	}
}
class rectangle
{	
	rectangle(double chang,double kuan){
		this.chang = chang;
		this.kuan = kuan;
	}
	double chang;
	double kuan;
	public void GetArea(){
		System.out.println(this.chang * this.kuan);
	}
}
class circle
{
	circle(double radius){
		this.radius = radius;
	}
	double radius;
	public void GetArea(){
		System.out.println(Math.PI * radius *radius);
	}
}

运用了抽象的方法之后。

class  Test{
	public static void main(String[] args) 
	{
		rectangle s1 = new rectangle(5,10);
		s1.GetArea();
		circle s2 = new circle(10);
		s2.GetArea();
	}
}
abstract class Graph                       //定义抽象类
{
	abstract public void GetArea();            //定义抽象的方法
}
class rectangle extends Graph
{	
	rectangle(double chang,double kuan){
		this.chang = chang;
		this.kuan = kuan;
	}
	double chang;
	double kuan;
	public void GetArea(){
		System.out.println(this.chang * this.kuan);
	}
}
class circle extends Graph
{
	circle(double radius){
		this.radius = radius;
	}
	double radius;
	public void GetArea(){
		System.out.println(Math.PI * radius *radius);
	}
}

我们创建了一个抽象的(abstract)类Graph,因为它们有着相同的特征或目的,它们共同的目的都是计算面积,所以我们可以通过GetArea的方法来抽象出来。之后我们让矩形和圆形两个类继承Graph类,并实现对应的GetArea方法。这就是抽象啦。

我们可以看出我们可以通过继承我们的父类(这里父类也可以叫做抽象类,里面的方法也可以叫做抽象的方法),重写其中的方法或者引用父类的属性来实现我们代码的复用,这就是抽象思想给我解决的最大的问题-----实现代码的复用。

你可能感兴趣的:(Java,java)