很多人在聊面向对象这件事时,往往对概念都含糊不清。用一句简单的话来说,面向对象可以看做是世界上某个事物的集合。那么,我们为什么要用面向对象编程?
1)面向对象可以有助于开发人员提高编程的效率;
2)使用面向对象编写的程序的执行速度会更快,内存使用也更加高效。
1、面向对象编程5个的规则:
在编程开发的过程中,必须要遵循下述的所有规则:
整个世界都是对象的集合;没有无用对象,每个对象都是有用的;每个对象都在不断的相互交互,对象不是孤立的;每个对象都属于一个类型,在技术上称之为类;每个对象都有一些属性和相应的操作。
2、面向对象编程的四个主要块
1)继承:
继承是子类继承父类的特征和行为,让子类具有与父类相同的属性和方法,继承的出现促进代码的可重用性,大大缩短了开发周期。以下举一个例子,让小白更快理解继承的作用。
首先,举个不使用继承的例子。
假设有一个公司接了个外包项目,甲方要求设计一个软件,需要实现以下功能,保存棒球运动员的信息,包括:姓名,出生日期,身高,体重,球员的跑步能力,接球能力等等。然后该公司在6个月完成了这个项目。
这时候,另一个客户也找到了这家公司,要求和上家公司一样,同样要求设计一个软件,但这次是要保存足球运动员的姓名,出身日期,身高,体重,球员的防守能力,运球速度等等。然后该公司又在6个月完成了这个项目
从上个例子中,我们按照需求不难分析出以下图片。
从上述分析中,可以看出,这两者有很多共同的信息(姓名,出生日期,身高,体重),但是同样的事情必须重新进行一次编程。
使用继承,就是来解决这个问题的。
使用继承,我们可以使用"ext"关键字来直接调用其他类的资源。比如该公司可以设计一个类,这个类只保存个人信息的内容,无论是棒球,足球还是以后出现羽毛球,乒乓球都可以通过继承直接调用个人信息类。这样是不是大大减少了重复造轮子的过程了?
2)封装
封装是指隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中的属性的读取。
可以通过使用私人成员、设置器和获取器来实现封装。用一段代码来举例说明封装:
Class Dog{privateString name;privateString colour;privateString cost;voidsetData(String x,String y,int z){name=x;color=y;cost=z;}String getName(){returnname;}String getColour(){returncolour;}int getCost{returncost;}}Class launch{publicstatic void main(String args[]){Dogd=new Dog();d.setData("Rocky","Pink",100000)System.out.println(d.getName());System.out.println(d.getColour());System.out.println(d.getCost());}}上述代码中,封装了一个Dog类,运行类调用了Dog类的方法,但是无权对Dog类的属性做任何修改。
3)抽象
在面向对象的概念中,所有的对象都是通过类来描绘的,然而,并非所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能都存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类。
下面,来说一下抽象的一些规则:
抽象类中的方法都可以抽象化抽象方法不是具体的方法具体的类不能有任何抽象的方法抽象类不可以创建对象抽象类可以被继承
抽象类代码示例:
public abstract class People {
privateString name;
privatestatic int count;
//定义实例代码块
{
}
//定义静态代码块
static {
}
//定义构造器
publicPeople() {
}
publicPeople(String name) {
System.out.println("=====执行父类中的有参构造器=====");
this.name= name;
System.out.println("this:"+this);
}
//定义实例方法
publicvoid play() {
}
//定义静态方法
publicstatic void test() {
}
/*声明抽象方法
* 格式:[修饰符]abstract 返回值 方法名(形参列表);
*
* 抽象方法不能定义方法体!!!
* 抽象方法存在的目的就是让子类去重写!!!
* 为什么抽象方法不能用static修饰?答:抽象方法存在的目的就是让子类去重写,而静态方法不能被重写!!!
*
* */
publicabstract void work();
publicabstract void ball();
publicString getName() {
returnname;
}
publicvoid setName(String name) {
this.name= name;
}
}
4)多态
多态是同一个行为具有多个不同表现形式或形态的能力,比如中国人都会说“你好”,但是四川人和上海人说“你好”的口音是不相同的。因此多态性是对象多种表现形式的体现。
多态存在的三个必要条件:
l 继承
l 重写
l 父类引用指向子类对象:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处是,可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
代码举例:
abstract classPerson{
abstract void eat();
}
class Teacherexts Person{
public void eat() {
System.out.println("教师可外出就餐");
}
public void work() {
System.out.println("上课备课批改作业");
}
}
class Studentexts Person{
public void eat() {
System.out.println("学生食堂就餐");
}
public void work() {
System.out.println("积极学习备考中");
}
}
public class Test {
public static void main(String[] args) {
show(new Teacher()); // 以Teacher对象调用 show 方法
show(new Student()); // 以Student对象调用 show 方法
Person a = new Teacher(); // 向上转型
a.eat(); // 调用的是 Teacher的eat
Teacher c = (Teacher)a; // 向下转型
c.work(); // 调用的是 Teacher 的 work
}
public static void show(Person a) {
a.eat();
// 类型判断
if (a instanceof Teacher ) { // 教师做的事情
Teacher c = (Teacher )a;
c.work();
} else if (a instanceof Student) { // 学生做的事情
Student c = (Student)a;
c.work();
}
}
}
执行以上程序,输出结果依次为:
l 教师可外出就餐
l 上课备课批改作业
l 学生食堂就餐
l 积极学习备考中
l 教师可外出就餐
l 上课备课批改作业
写在最后
面向对象的编程模式是Java学习和工作中的重中之重,它可以帮开发者大大提升开发效率,但是需要有很大的编码量才能熟练应用。要想吃透这部分内容一定要有足够的耐心,祝每位学者能很好的掌握这一知识。