• 【JAVA设计模式第一课】面向对象特性及原则回顾


    【JAVA设计模式-第一课】面向对象特性及原则回顾


    • 面向对象特性

    Everybody都知道在JAVA面向对象编程中有三个很重要的特性:封装、继承、多态。

    封装:其实就是对类的属性进行私有化(private),外部不能直接访问。当然外部要访问此类的属性也不是不可能,只不过就是通过一些方法。约定俗成的就是设置一些get/set访问器/构造器来访问设置。

    比如在类Ball中,name,price被封装。但其他类可以通过get/set方法来访问.

     1 public class Ball {
     2     private String name;
     3     private double price;
     4     /**
     5      * @return the name
     6      */
     7     public String getName() {
     8         return name;
     9     }
    10     /**
    11      * @param name the name to set
    12      */
    13     public void setName(String name) {
    14         this.name = name;
    15     }
    16     /**
    17      * @return the price
    18      */
    19     public double getPrice() {
    20         return price;
    21     }
    22     /**
    23      * @param price the price to set
    24      */
    25     public void setPrice(double price) {
    26         this.price = price;
    27     }
    28     
    29 }

    继承:就是一个类(子)扩展另一个类(父)。子类只能有一个父类,但父类可以有多个子类。当子类为非abstract类时,若继承的是父类为abstract类,那么子类拥有父类的属性及已实现的方法(可以重写父类方法-多态),并且子类必须实现父类中所有的abstract方法,且子类中在实现父类方法时必须是方法名相同、返回类型、参数个数和类型要保持一致。当然若子类为abstract的话,就拥有了父类的所有属性和方法,可以实现父类中的abstract方法也可以不实现,当然子类还可重写父类已存在(实现)的方法。如下面代码中,类Teacher和Student是子类,父类为Person。

     1 public class Person {
     2     private String sex;
     3     private String name;
     4     private int age;
     5     /**
     6      * @return the sex
     7      */
     8     public String getSex() {
     9         return sex;
    10     }
    11     /**
    12      * @param sex the sex to set
    13      */
    14     public void setSex(String sex) {
    15         this.sex = sex;
    16     }
    17     /**
    18      * @return the name
    19      */
    20     public String getName() {
    21         return name;
    22     }
    23     /**
    24      * @param name the name to set
    25      */
    26     public void setName(String name) {
    27         this.name = name;
    28     }
    29     /**
    30      * @return the age
    31      */
    32     public int getAge() {
    33         return age;
    34     }
    35     /**
    36      * @param age the age to set
    37      */
    38     public void setAge(int age) {
    39         this.age = age;
    40     }
    41     
    42     /**
    43      * @param sex
    44      * @param name
    45      * @param age
    46      */
    47     public Person(String sex, String name, int age) {
    48         super();
    49         this.sex = sex;
    50         this.name = name;
    51         this.age = age;
    52     }
    53     public String getInfo(){
    54         return "name:"+name+",sex:"+sex+",age:"+age;
    55     }
    56 }
     1 public class Teacher extends Person{
     2     /**
     3      * @param sex
     4      * @param name
     5      * @param age
     6      */
     7     public Teacher(String sex, String name, int age) {
     8         super(sex, name, age);
     9         // TODO Auto-generated constructor stub
    10     }
    11     
    12     /*重写父类方法
    13      * (non-Javadoc)
    14      * @see com.wjq.model.obj.back.Person#getInfo()
    15      */
    16     @Override
    17     public String getInfo() {
    18         System.out.print("我是老师--");
    19         return super.getInfo();
    20     }
     1 public class Student extends Person{
     2 
     3     /**
     4      * @param sex
     5      * @param name
     6      * @param age
     7      */
     8     public Student(String sex, String name, int age) {
     9         super(sex, name, age);
    10         // TODO Auto-generated constructor stub
    11     }
    12     
    13     /* (non-Javadoc)
    14      * @see com.wjq.model.obj.back.Person#getInfo()
    15      */
    16     @Override
    17     public String getInfo() {
    18         System.out.print("我是学生--");
    19         return super.getInfo();
    20     }
    21 }

     1 public class PersonTest {
     2     public static void main(String[] args) {
     3         Person person = new Person("男/女", "M.W", 0);
     4         Person teacher = new Teacher("男","Mr.Tam",47);
     5         Person student = new Student("女","Jill",21);
     6         System.out.println(person.getInfo());
     7         System.out.println(teacher.getInfo());
     8         System.out.println(student.getInfo());
     9     }
    10 }

     测试结果:

    1 name:M.W,sex:男/女,age:0
    2 我是老师--name:Mr.Tam,sex:男,age:47
    3 我是学生--name:Jill,sex:女,age:21
    注:这里必须特别注意重写和重载的概念。重写是针对子类与父类之间的关系,也就是重写的是父类的方法。重写产生的结果就是如果有多个子类,那么在使用上转型对象调用同一个方法时,如果重写了父类的方法的子类,将执行重写后的方法。而没有重写父类的方法的子类,调用的将是父类原有的方法。这种结果也就是一种多态的形式。而重载指的是每个类可以自己多个同名字的方法,这些方法名字必须是相同的,但是方法的参数个数、类型及参数类型的顺序是不一样的。比如在一个类中很常见的重载就是该类的构造函数。
    •  面向对象基本原则
    1. 面向抽象原则:抽象类和接口的应用及面向抽象编程。
    2. 开-闭原则:设计对可扩展的部分开放,对修改的部分关闭。
    3. 多组合少继承原则:继承与复用(白盒模式)、组合与复用(黑盒模式Has-A:将对象作为类的属性,当然这样将导致系统对象过多)
    4. 高内聚-低耦合原则:类中的一些方法是一组相关行为,就是高内聚,这便于类自身维护。而反之,若类中的方法没有相关行为,则成为低耦合,不利于类的管理。低耦合中尽量要求不要让一个类含有太多其他类的实例引用,避免在系统修改时,由一部分而影响到其他部分。总之,尽量少用其他类的实例化,方法与其他的类的直接关联越少越好管理类。

     下一课:【JAVA设计模式-第二课】UML建模简介

  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/weijunqiang/p/3105282.html
Copyright © 2020-2023  润新知