A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

黄延贵

初级黑马

  • 黑马币:20

  • 帖子:8

  • 精华:0

本帖最后由 黄延贵 于 2017-11-13 15:47 编辑

简单的了解  :面向对象的三大特征:    封装  继承  多态
一.封装:
​        首先, 属性可用来描述同一类事物的特征, 行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用.比如人这个东东,可用下面的方式封装:
class 人{​   
姓名(属性一)  ​
   年龄(属性二)​   
   吃饭(行为之一)  
工作(行为之二)
}

public class Person {
    //属性
  String name;        //姓名
  int age;        //年龄

  //行为:
  //吃饭
  public void eat() {
          System.out.println("人会吃饭");
  }
  //工作
  public void work() {
          System.out.println("人要工作");
  }


  //使用
public class Demo{

   @Test
   public void test01(){
     //1.创建对象
     Person p=new person();  
     //2.通过对象给属性赋值
     p.name = "张三";                                
           p.age = 23;               
     //3.通过对象对用方法     
     p.eat();                  
     p.work();
   }
}


二.继承:
​     由于封装,使得有共同特征的一类事物的所有描述信息都被归于一类之中,但这并不是万能的,有些事物有共性,但还存在区别,比如教师,简单封装起来如下:
class  教师  {​  
  姓名(属性一)​  
  年龄(属性二)
​  
  吃饭(行为之一)
   工作(行为之二)
   教书(行为之三)
}
public class Teacher  {
    //属性
  String name;        //姓名
  int age;        //年龄

  //行为:
  //吃饭
  public void eat() {
          System.out.println("老师会吃饭");
  }
  //做事
  public void work() {
          System.out.println("老师要做事");
  }
  //教书
  public void teach() {
          System.out.println("老师会教书");
  }





上面对"教师"的封装,与对"人"的封装基本上差不多,只是多了一个特征行为:教书,教师有与人一样的共性, 但我们不能说"人教书",也就是不能把教书封装到"人"之中去,教书是教师的特征行为之一.  为了省事地封装教师(代码的复用,这只是继承存在的原因之一), 可以让教师去继承人这个类,如:
   class 教师 extends 人{​  
  教书(行为之三)
}
  //使用继承
  public class Teacher extends Person {
//教书  ----老师的特性
     public void teach() {
             System.out.println("老师会教书");
     }
  }  
    //测试
    @Test
    public void  demo(){
      Teacher t= new Teacher();
      t.eat();
      t.work();
      t.teach();
    }



这样,我们就不用重新定义那些已经被"人"这一个类所封装的那些属性与行为了,而只需要使用继承的方式,在人的基础上拓展教师专有的行为,即"教书"即可把教师描述出来;这样的结果, 即是教师也同时拥有"人"之中所封装的一切属性与行为, 还拥有自己的特征行为"教书".
三.多态:
多态存在的三个必要条件:
一、要有继承;二、要有重写;三、父类引用指向子类对象。
​     多态的概念发展出来,是以封装和继承为基础的.  可以理解为事物存在的多种体现形态
​     如 人这个类,封装了很多人类共有的特性,
  • 1教师是人的子类,继承了人的属性与行为,当然教师有自己的特征行为,比如教书授课;

​    3.2   学生是人的子类,继承了人的属性与行为,当然学生有自己的特征行为,比如学习做作业;


public class  Demo{

        abstract class Person {
                // 属性
          String name;
         int age;               
                // 行为:
                // 吃饭
                void eat() {
                        System.out.println("人在吃饭");
                };
                // 干活
                void work(){
               System.out.println("人在做事");
                }
        }

        // 继承
        // 1教师是人的子类,继承了人的属性与行为,当然教师有自己的特征行为,比如教书教书;
        class Teacher extends Person {               
               //name="李帅"; ----错误的
      void teach() {
                   name="李帅老师";  //在子类需要给父类的成员属性赋值,必须写在子类的方法中
                        System.out.println(name+"在教书");
                }
                @Override
                public void eat() {
                        name="李帅老师";
              System.out.println(name+"要吃饭");
                }
                @Override
                public void work() {        
              teach()    //调用老师特有的方法
               
                /*name="李帅老师";
              System.out.println(name+"教书");*/
                }
        }
        class Student extends Person {               
                void study() {
                   name="小星星同学";
                        System.out.println(name+"在学习");
                }
                @Override
                public void eat() {
                        name="小星星同学";
              System.out.println(name+"要吃饭");
                }
                @Override
                public void work() {
             study()    //调用学生的特有方法

               /*  name="小星星同学";
                        System.out.println(name+"在学习");*/
                }
        }

      //多态
        @Test
        public void text01() {
                Person p = new Teacher();                //教师      
                p.eat();  //父类的共有方法
                p.work();
        // p.teach();   //这种是错误的    父类里没有这个方法

      Teacher t=(Teacher) p;   
          t.teach();//子类的特有方法。
System.out.println("--------------------------------------------");               
                Person p1 = new Student();                //学生
                p1.eat();
                p1.work();

      Student  stu= (Student)p1;
          stu.study(); //----小星星同学在打游戏

如何使用子类特有方法:多态转型。
Person p = new Teacher();;//类型提升,向上转型。p.eat(); ;//父类的共有方法。p.work();
​如果要调用Teacher的特有方法的时候 ,就必须将父类的引用转成子类的类型,但是不能将父类对象转成子类类型,转换的是父类的引用,(就是父类的变量)
Teacher t=(Teacher) p;   
t.teach()//子类的特有方法。

分析:
​     现在,当我们需要去描述教师与学生各自的行为的时候, 我们可以分开来说"教师在教书",  "学生做学习",  但如果我们要站在抽象的角度,  也就是从教师与学生的父类"人"的角度, 来同时描述他们各自的行为时,我们怎么描述?"人在授课"?"人在做学习"?这是不是怪怪的很不合适?不合适的问题就在于, 对于行为主体,我们使用了抽象层次的东东"人",而对于行为本身, 我们却使用了具体的东东"授课"与"教书". 怎么解决呢? 那就需要解决抽象与具体的矛盾问题. 既然是站在抽象在角度来描述,那我们把行为抽象一下,不就能同时描述了吗?比如"人在做事"(教师授课与学生做作业都可以说成人在做事),这样就解决了抽象层次与具体层次之间的矛盾.
​       到了这一步, 我们可以把两个描述: "教师在做事", "学生在做事" 两者统一为"人在做事",然后, 我们可以在"教师"的"做事"行为中去调用教师自己的特征行为"授课",在"学生"的"做事"行为中去调用学生自己的特征行为"在学习",   所以,当调用"人"去"做事"的时候,如果这个人是教师,那他所做的事实际上就是"教书",  如果这个人是学生,那他所做的事实际上就是"做作业".也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是"教书"与"做作业".
完成上述的描述过程, 其实就是多态机制的体现.
多态, 就是站在抽象的层面上去实施一个统一的行为,到个体(具体)的层面上时, 这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为.   多态比起封装与继承来说要复杂很多, 上面的描述很简单, 不用去死抠多态两个字,
其实只要明白:
能站在抽象的角度去描述一件事或者物, 而针对这件抽象的事或, 每个个体(具体)又能找到其自身的行为去执行, 这就是多态.






3 个回复

倒序浏览
封装.继承多态.接口那么好用.为什么不用接口呢. 为什么要一直New 对象呢. 是不是没对象.
回复 使用道具 举报
詹晓星 发表于 2017-11-13 15:27
封装.继承多态.接口那么好用.为什么不用接口呢. 为什么要一直New 对象呢. 是不是没对象. ...

直接反射调用你的对象就可以啦.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马