• 多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)的基本概念


    Java的三大特性:多态、封装、继承。

    Java程序设计尊崇的思想:高内聚、低耦合。

    多态性:Java官方给出的定义:

      The dictionary definition of polymorphism refers to a principle in biology in which an organism or species can have many different forms or stages. This principle can also be applied to object-oriented programming and languages like the Java language. Subclasses of a class can define their own unique behaviors and yet share some of the same functionality of the parent class.

      它的大义是说:多态性的本义是指生物学中的一个定律,一个生物体或者物种可以有不同的形式或者阶段。这个定律同样适用于面向对象编程和像Java一样的语言,一个类的子类可以定义自己独特的行为并且共享一些父类中共同的功能。

      我们再来理解一下它的定义,“一个类的子类可以定义自己独特的行为并且共享一些父类中共同的功能”,我们就可以联想到它的实现方法:继承和接口实现,单一继承,多重实现,这样我们就把三大特性联系起来了,我们联系生活中的一些实例巩固和实践我们的定义,比如书,书有很多种,但他有一些共同的特性,比如书名、作者、前言、目录等和公共方法,比如读,我们就可以放在父类中,子类通过继承直接使用,但是不同的书有不同的读法和它自己的一些独有的属性,比如数学书,独特的属性:数学公式,自然读数学书跟读哲学书的方法就不一样,我们来看一个例子。

    公共父类:Book.java

     1 /**
     2  * @Description: 书(父类)
     3  * @author: vioking
     4  * @date: 2017-7-12
     5  */
     6 public class Book {
     7 
     8     private String title;//书名
     9     private String author;//作者
    10     private String bookType;//类型
    11 
    12     //默认构造方法
    13     public Book() {
    14     }
    15 
    16     public Book(String title, String author, String bookType) {
    17         this.title = title;
    18         this.author = author;
    19         this.bookType=bookType;
    20     }
    21 
    22     /**
    23      * 公共方法
    24      */
    25     public void read(){
    26 
    27         System.out.println("公共父类的方法");
    28     }
    29 
    30     public String getTitle() {
    31         return title;
    32     }
    33 
    34     public void setTitle(String title) {
    35         this.title = title;
    36     }
    37 
    38     public String getAuthor() {
    39         return author;
    40     }
    41 
    42     public void setAuthor(String author) {
    43         this.author = author;
    44     }
    45 
    46     public String getBookType() {
    47         return bookType;
    48     }
    49 
    50     public void setBookType(String bookType) {
    51         this.bookType = bookType;
    52     }
    53 }
    View Code

    子类:MathBook.java

     1 /**
     2  * @Description: 数学书子类
     3  * @author: vioking
     4  */
     5 public class MathBook extends Book{
     6 
     7 
     8     private String formula;//数学公式
     9 
    10     //重写父类的方法
    11     public void read(){
    12 
    13         System.out.println("数学书子类"+"
    书名:"+getTitle()+"
    作者:"+getAuthor()+"
    类型:"+getBookType()+"
    公式:"+getFormula());
    14     }
    15 
    16     public String getFormula() {
    17         return formula;
    18     }
    19 
    20     public void setFormula(String formula) {
    21         this.formula = formula;
    22     }
    23 }
    View Code

    子类:PhilosophyBook.java

     1 /**
     2  * @Description: 哲学书子类
     3  * @return: ${return_type}
     4  * @author: vioking
     5  */
     6 public class PhilosophyBook extends Book {
     7 
     8     private String idea;//观点
     9 
    10     public void read(){
    11 
    12         System.out.println("哲学书子类"+"
    书名:"+getTitle()+"
    作者:"+getAuthor()+"
    类型:"+getBookType()+"
    公式:"+getIdea());
    13     }
    14 
    15     public String getIdea() {
    16         return idea;
    17     }
    18 
    19     public void setIdea(String idea) {
    20         this.idea = idea;
    21     }
    22 }
    View Code

    测试方法:BookMain.java

     1 /**
     2  * @Description: 主方法
     3  * @author: vioking
     4  */
     5 public class BookMain {
     6 
     7     public static void main(String[] args) {
     8         MathBook mathBook = new MathBook();//封装的父类属性
     9         mathBook.setTitle("离散数学结构(第6版)");//封装的父类属性
    10         mathBook.setAuthor("科曼(Bernard Kolman)");//封装的父类属性
    11         mathBook.setBookType("数学书");//封装的父类属性
    12         mathBook.setFormula("((p→q)∧(q→r))→(p→r)");//独有的子类属性
    13         mathBook.read();//覆写的父类方法
    14 
    15         PhilosophyBook philosophyBook = new PhilosophyBook();
    16         philosophyBook.setTitle("马克思主义哲学");
    17         philosophyBook.setAuthor("马克思");
    18         philosophyBook.setBookType("哲学书");
    19         philosophyBook.setIdea("社会大分工的结果使大多数人重复简单而单一的工作");
    20         philosophyBook.read();
    21     }
    22 }
    View Code

    运行结果:

    这就是通过继承实现多态的一种方法,通过实现接口实现多态的原理基本差不多,就不赘述了。

    封装性:

      Encapsulation is one of the four fundamental OOP concepts. The other three are inheritance, polymorphism, and abstraction.

    Encapsulation in Java is a mechanism of wrapping the data (variables) and code acting on the data (methods) together as a single unit. In encapsulation, the variables of a class will be hidden from other classes, and can be accessed only through the methods of their current class. Therefore, it is also known as data hiding.

      Java中的封装是将数据(变量)和作为数据(方法)的代码作为一个单元进行包装的机制。在封装中,类的变量将从其他类隐藏,只能通过其当前类的方法进行访问。因此,它也被称为数据隐藏

      上例中的book.java就实现了简单的封装,它的类变量是私有的private,但是提供了公共的public方法以便其它类访问。

      高内聚、低耦合

      模块与模块间应该尽可能的避免发生联系,假如某一模块因为某种原因需要改动,但是这一模块的改动需要改动整个项目,这样一来就会延长开发周期,甚至出现不必要的bug,得不偿失。

      同样,一个模块间的功能尽可能的发生多的联系,这样就能减少冗余,过多逻辑的判断,从而提高项目的可维护性和高执行效率。

      以上是我对多态、封装、内聚和耦合的一点理解,如果错误,还请斧正,谢谢。

    参考资料:

    【1】. http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

    【2】.http://www.tutorialspoint.com/java/java_encapsulation.htm

  • 相关阅读:
    Java实现 LeetCode 413 等差数列划分
    Java实现 LeetCode 413 等差数列划分
    Java实现 LeetCode 412 Fizz Buzz
    简单字符设备驱动程序
    fork与vfork的区别
    进程创建函数fork()、vfork() ,以及excel()函数
    区分execl与system——应用程序中执行命令
    CMOS Sensor的调试经验分享
    嵌入式ARM-Linux开发工具下载地址合集
    嵌入式 linux 查看内存
  • 原文地址:https://www.cnblogs.com/ViokingJava/p/7105997.html
Copyright © 2020-2023  润新知