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