我们知道面向对象的三大特性是封装、继承和多态。然而我们有时候总是搞不清楚这些概念。下面对这些概念进行整理,
为以后面向抽象的编程打下坚实的基础。
封装的概念还是很容易理解的。如果你会定义类,那么相信你对封装的概念已经完全掌握了。下面定义的几个类,就是对数据的封装。
继承的好处是代码复用。继承的子类自动拥有父类中的所有属性和方法。所以继承已存在的类就是复用这些类的方法和域。
在此基础上,子类还可以添加一些新的方法和域,以满足新的需求。这是java程序设计中的一项核心技术。
那么如何判断是否需要继承呢?is-a关系是继承的一个明显特征。这句话的意思可以解释为:student之所以继承person,
是因为student 是person。如果没有这个关系也就不需要这个继承了。这也是里氏替换原则的定义,子类型必须能够替换掉它们的父类型。
在通过扩展超类定义子类的时候,仅需指出子类与超类的不同之处。因此在设计类时,应该将通用的方法放到超类中,
而将具有特殊用途的方法放到子类中,这种将通用的功能放到超类的做法,在面向对象程序设计中十分普遍。
动态绑定有一个非常重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展。所以多态是开放封闭原则的基础。
下面是一个继承和多态实现的具体例子:
abstract 是抽象的关键字。(最好从抽象类继承而不是从具体类继承)。
public abstract class person { // 抽象类 private string name; // 私有变量 public string getname() { // getter方法 return name; } public void setname(string name) { //setter方法 this.name = name; } public person(string name) { // 构造函数,用于初始化name super(); this.name = name; } public abstract string getdesc(); // 抽象类中的抽象方法。 只有声明,没有具体实现。 public string tostring(){ // tostring方法覆盖了object类的tostring方法 return name + getdesc(); }}
extends 是继承的关键字。student继承person,所以student拥有name属性。
public class student extends person { // 继承类 private string major; // 新增加的数据 public string getmajor() { return major; } public void setmajor(string major) { this.major = major; } public student(string name,string major) { // 构造函数用于初始化 super(name); // 调用超类构造函数 this.major = major; } @override public string getdesc() { // 必须实现超类中的抽象方法 // todo auto-generated method stub return " : a student, major is " + major; }
凡是继承超类的子类,必须实现(无论是哪种实现方式)超类中定义的抽象方法。
public class employee extends person{ private double salary; public double getsalary() { return salary; }public void setsalary(double salary) { this.salary = salary; } public employee(string name, double salary) { super(name); this.salary = salary; } @override public string getdesc() { // todo auto-generated method stub return " :a employee, salary is " + salary; }}
public class test { public static void main(string[] args) { // todo auto-generated method stub person[] p=new person[2]; p[0]=new student("mark", "it"); p[1]=new employee("jerry", 2000); for (person person : p) { system.out.println(person.getname()+person.getdesc()); } }}
运行结果
从这个例子也可以看出,没有封装就谈不上继承,而没有继承,就不可能有所谓的多态。
而理解封装、继承和多态(特别是多态)是理解设计模式的基础。
了解更多关于java的教程可以访问:java教程
以上就是java的三大特性封装、继承、多态的详细内容。