面向对象
面向对象程序设计(object-oriented programing)是一种程序设计思想,在其程序设计过程中,程序是由对象组成的,每个对象包含了对用户公开的特定功能部分与隐藏的实现部分。体现在数据与数据的接口上,即对象与对象的接口上,也体现在封装、继承、多态三大特性中。
面向对象的程序设计思想掉取代了传统的过程式编程技术,传统的结构化程序设计是用一系列的过程(即算法)来解决问题,一旦确定了这个过程,就要开始考虑存储数据的适当方式(组织数据的结构与方式,即数据结构)。
面向对象设计相较于面向过程设计更适合解决较大的问题,也更适合开发较大型的项目。这么说的依据是什么呢?
如果要实现一个简单的web浏览器可能需要大约2000个过程,这些过程可能需要对一组全局数据进行操作。如果采用的是面向对象的设计风格,可能只需要大约100个类,每个类平均包含20个方法。后者更易于程序员掌握,也更容易找到bug,假设给定对象的数据出错,在访问这个数据项的20个方法中查找错误要比2000个过程中查找更容易。
面向对象程序设计思想的三大特性(封装、继承、多态)
封装:封装是处理对象的一个重要概念。为保证程序的安全性、可维护性、低耦合性,我们将由代码组成的程序封装成一个对象,该对象包含对内的实现与对外的入口,调用者只需要知道怎么使用入口而不需要知道封装体究竟是怎么实现的,这就保证了其安全性与可维护性。简而言之,封装就是将数据和行为组合在一个封装体中,对使用者隐藏了具体的实现方式。
继承:继承是java面向对象编程技术的一块基石,为类划分了等级层次。它表示一个更具体的类(子类)与一个更通用的类(父类)之间的关系,子类会继承父类的方法和属性,同时又可以扩展父类的方法。继承提高了代码的复用性与程序的开发效率。
多态: 面向对象的多态性就是将父类对象应用到子类对象的特征。指同一个对象,在不同时刻,所代表的对象不一样,指的是对象的多种形态。不同的子类对象都可以当作父类来看,可以屏蔽不同子类对象之间的差异,统一了编写程序风格,统一了调用标准,提高了代码的通用性。
关于多态
产生多态的三个前提:
1、发生继承
2、要有方法的重写(override)
3、父类引用指向子类对象。
关于多态的使用
当父类类型的变量保存了子类类型的对象的引用,而这个对象调用方法时,调用的是父类还是之类的呢?
能够调用什么方法取决于变量的类型,具体调用什么方法取决于对象的类型。
public class Animal {
static String name = "animal"; //静态变量
int num = 1; //成员变量
public static void sleep() { //静态方法
System.out.println("animal sleep");
}
public void run() { //普通方法
System.out.println("animal run");
}
}
class Cat extends Animal{
static String name = "cat"; //静态变量
int num = 2; //成员变量
public static void sleep() { //静态方法
System.out.println("cat sleep");
}
public void run() { //普通方法
System.out.println("cat run");
}
public static void main(String args[]) {
Cat cat = new Cat(); //自身的对象
Animal animal = new Cat(); //向上转型,父类对象变量保存子类对象引用
System.out.println(cat.name);//cat
System.out.println(animal.name);//animal
System.out.println(cat.num);//2
System.out.println(animal.num);//1
cat.run();//cat run
animal.run();//cat run
cat.sleep();//cat sleep
animal.sleep();//animal sleep
}
}
总结:
在调用成员变量以及静态方法时,“编译看左边,运行看左边”,即程序编译时创建了一个Animal类型的对象,并且使用new Cat()对于这个Animal对象赋值,但最终得到的还是一个Animal类的对象,只需要看“=”左边的Animal animal即可。
但是要调用非静态方法时,由于Animal类的对象是用Cat()来实例化的,这个非静态方法在运行时会被重写,从而输出子类中方法重写后的结果。这就是“编译看左边,运行看右边”。