面向对象的三大特征



        引言:关于“面向对象”的三大特征,我想这是再基础不过的东西,而正是这些基础的东西,总是让我模棱两可。今天有时间就在网上找了些资料学习了下,顺便整理了下来。感觉自己的基础知识还是太薄弱了,还需要加强学习

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

继承:
     由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但我们知道,这并不是万能的,有些事物有共性,但还存在区别,比如教师,简单封装起来如下:
教师{
    姓名(属性一)
    性别(属性二)

   吃饭(行为之一)

    教书(行为之二)
}
     上面对"教师"的封装,与对"人"的封装基本上差不多,只是多了一个特征行为:教书,教师有与人一样的共性, 但我们不能说"人教书",也就是不能把教书封装到"人"之中去,教书是教师的特征行为之一.  为了省事地封装教师(代码的复用,这只是继承存在的原因之一), 可以让教师去继承人,如:
 教师 extends 人{
    教书(行为之一)
}
这样,我们就不用重新定义那些已经被"人"这一个类所封装的那些属性与行为了,而只需要使用继承的方式,在人的基础上拓展教师专有的行为,即"教书"即可把教师描述出来;这样的结果, 即是教师也同时拥有"人"之中所封装的一切属性与行为, 还拥有自己的特征行为"教书".

多态:
     多态的概念发展出来,是以封装和继承为基础的(其实我觉得抽象也应该算是面向对象的大特征之一,要封装,抽象是必须的)

   实现多态,有二种方式:覆盖,重载。
覆盖:是指子类重新定义父类的函数的做法。
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

简单的理解一下多态,比如:
     人这个类,封装了很多人类共有的特性,
     教师是人的子类,继承了人的属性与行为,当然教师有自己的特征行为,比如老师教书;
     学生是人的子类,继承了人的属性与行为,当然学生有自己的特征行为,比如学生上课;
   
     现在,当我们需要去描述教师与学生各自的行为的时候, 我们可以分开来说"教师在教书",  "学生上课",  但如果我们要站在抽象的角度,  也就是从教师与学生的父类"人"的角度, 来同时描述他们各自的行为时,我们怎么描述?"人在教书"?"人在上课"?这是不是怪怪的很不合适?不合适的问题就在于, 对于行为主体,我们使用了抽象层次的"人",而对于行为本身, 我们却使用了具体的"教书"与"上课". 怎么解决呢? 那就需要解决抽象与具体的矛盾问题.
既然是站在抽象在角度来描述,那我们把行为抽象一下,不就能同时描述了吗?比如"人在做事"(教师授课与学生做作业都可以说成人在做事),这样就解决了抽象层次与具体层次之间的矛盾.

     到了这一步, 我们可以把两个描述: "教师在做事", "学生在做事" 两者统一为"人在做事",然后, 我们可以在"教师"的"做事"行为中去调用教师自己的特征行为"教书",在"学生"的"做事"行为中去调用学生自己的特征行为"做作业", 所以,当调用"人"去"做事"的时候,如果这个人是教师,那他所做的事实际上就是"教书",如果这个人是学生,那他所做的事实际上是"做作业".也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是"教书"与"上课".完成上述的描述过程, 其实就是多态机制的体现.

   多态, 就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时, 这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为.

   其实只要明白:
能站在抽象的角度去描述一件事, 而针对这件抽象的事, 对于每个个体(具体)又能找到其自身的行为去执行, 这就是多态.

        我个人对多态的理解是这样的:人有很多种,有老师(可以教书),有学生(可以上课),有IT男(苦逼的写代码)等等,所以所人是多态的,有各种各样的苦逼形态;或者例如美女是多态的,有高圆圆似的的美、有林青霞似的美,还有王祖贤似的美,所以美女也是多态的,有不同类型的美。

下面来看看具体的代码:

public class Person {
 public String sex;
 public String name;
 
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public void eatSomeThing(){
  System.out.println("eating someThing ...");
 }
 
 public void doSomeThing(){
  System.out.println("doing someThing ...");
 }
   
}


public class Teacher  extends Person{
	public void doSomeThing(){//覆盖父类doSomeThing方法
		System.out.println("老师:教书...");
	}
}


public class Student extends Person {
 public void doSomeThing(){//覆盖父类doSomeThing方法
	 System.out.println("学生:上课...");
 }
}


public class Client {
 public static void main(String[] args) {
  Teacher t = new Teacher();
  t.setName("张三");
  System.out.println(t.getName());
  t.eatSomeThing();//人的特征
  t.doSomeThing();
  Student s = new Student();
  s.setName("李四");
  System.out.println(s.getName());
  s.eatSomeThing();//人的特征
  s.doSomeThing();
 }
}

输出结果:


张三
eating someThing ...
老师:教书...
李四
eating someThing ...
学生:上课...





发布了64 篇原创文章 · 获赞 341 · 访问量 20万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章