关于面向对象的理解

.抽象
.继承
.封装
 多态

 
封装:
        首先,属性可用来描述同一类事物的特征, 行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用.比如人这个东东,可用下面的方式封装:
人{
    年龄(属性一)
    身高(属性二)
    性别(属性三)

    做事(行为之一)
    走路(行为之二)
    说话(行为之三)
}
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
继承: 由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但我们知道,这并不是万能的,有些事物有共性,但还存在区别,比如教师,简单封装起来如下:教师{ 年龄(属性一) 身高(属性二) 性别(属性三) 做事(行为之一) 走路(行为之二) 说话(行为之三) 教书(行为之四)}上面对"教师"的封装,与对"人"的封装基本上差不多,只是多了一个特征行为:教书,教师有与人一样的共性, 但我们不能说"人教书",也就是不能把教书封装到"人"之中去,教书是教师的特征行为之一. 为了省事地封装教师(代码的复用,这只是继承存在的原因之一), 可以让教师去继承人,如: 教师 extends 人{ 教书(行为之三)}这样,我们就不用重新定义那些已经被"人"这一个类所封装的那些属性与行为了,而只需要使用继承的方式,在人的基础上拓展教师专有的行为,即"教书"即可把教师描述出来;这样的结果, 即是教师也同时拥有"人"之中所封装的一切属性与行为, 还拥有自己的特征行为"教书".
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
多态:
     多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态的概念发展出来,是以封装和继承为基础的(其实我觉得抽象也应该算是面向对象的大特征之一,要封装,抽象是必须的)简单的理解一下多态,比如: 人这个类,封装了很多人类共有的特性, 教师是人的子类,继承了人的属性与行为,当然教师有自己的特征行为,比如教书授课; 学生是人的子类,继承了人的属性与行为,当然学生有自己的特征行为,比如学习做作业; 现在,当我们需要去描述教师与学生各自的行为的时候, 我们可以分开来说"教师在授课", "学生做作业", 但如果我们要站在抽象的角度, 也就是从教师与学生的父类"人"的角度, 来同时描述他们各自的行为时,我们怎么描述?"人在授课"?"人在做作业"?这是不是怪怪的很不合适?不合适的问题就在于, 对于行为主体,我们使用了抽象层次的东东"人",而对于行为本身, 我们却使用了具体的东东"授课"与"教书". 怎么解决呢? 那就需要解决抽象与具体的矛盾问题. 既然是站在抽象在角度来描述,那我们把行为抽象一下,不就能同时描述了吗?比如"人在做事"(教师授课与学生做作业都可以说成人在做事),这样就解决了抽象层次与具体层次之间的矛盾.到了这一步, 我们可以把两个描述: "教师在做事", "学生在做事" 两者统一为"人在做事",然后, 我们可以在"教师"的"做事"行为中去调用教师自己的特征行为"授课",在"学生"的"做事"行为中去调用学生自己的特征行为"做作业", 所以,当调用"人"去"做事"的时候,如果这个人是教师,那他所做的事实际上就是"教书",如果这个人是学生,那他所做的事实际上就是"做作业".也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是"授课"与"做作业".完成上述的描述过程, 其实就是多态机制的体现.多态, 就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时, 这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为.多态比起封装与继承来说要复杂很多, 上面的描述很简单, 不用去死抠多态两个字,其实只要明白: 能站在抽象的角度去描述一件事, 而针对这件抽象的事, 对于每个个体(具体)又能找到其自身的行为去执行, 这就是多态.
 
抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
package Student;


/*
 * 功能:演示多态
 * 
 * */




/**
 * @author Administrator
 *
 */
public class Duotai {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*Cat cat=new Cat();
		cat.cry();
		Dog dog=new Dog();
		dog.cry();*/
		/*Animal an=new Cat();
		an.cry();
		an=new Dog();
		an.cry();*/
		Master master=new Master();
		master.feed(new Dog(),new Bone());
		master.feed(new Cat(), new Fish());
	}


}
//主人类
class Master
{
	//给动物喂食物,使用多态,方法就可以用一个
	public void feed(Animal an,Food f)
	{
		an.eat();
		f.showName();
	}
	}
//食物类
class Food
{
	String name;
	public void showName()
	{
		
	}
	}
//鱼类
class Fish extends Food
{
	public void showName()
	{
		System.out.println("鱼");
	}
	}
//骨头类
class Bone extends Food
{
	public void showName()
	{
		System.out.println("骨头");
	}
	}
//动物类
class Animal
{
	String name;
	int age;
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	public int getAge(){
		return age;
	}
	public void setAge(int age){
		this.age=age;
	}
	//动物会叫
	public void cry()
	{
		System.out.println("不知道怎么叫?");
	}
	//动物可以吃东西
	public void eat()
	{
		System.out.println("不知道吃什么");
	}
}
class Dog extends Animal
{
	//狗叫
	public void cry()
	{
		System.out.println("汪汪叫");
	}
	//狗会吃东西
	public void eat()
	{
		System.out.println("狗爱吃骨头");
	}
	}
class Cat extends Animal
{
	//猫自己叫
	public void cry()
	{
		System.out.println("猫猫叫");
	}
	//猫爱吃鱼
	public void eat()
	{
		System.out.println("猫爱吃鱼");
	}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值