背景
面向对象程序设计(简称oop)是当今主流的程序设计范型,它已经取代了20世纪70年代的“结构化”过程化程序设计开发技术,java是完全面向对象的,必须熟悉oop才能编写java程序。
面向对象程序设计概述:
面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自标准库,还有一些是自定义的。究竟是自己构造对象,还是从外界购买对象完全取决于开发项目的预算和时间。但是,从根本上说,只要对象能够满足要求。就不必关心其功能的具体实现过程。在oop中,不必关心对象的具体实现,只要满足用户的需求即可。
面向对象和面向过程设计的区别:
我觉得如果要解决问题就需要将问题分解,然后分成很多步骤。如果把每个步骤比作一个点,顺序连接每个点则是一条线,过程就是这条线。所以面向过程侧重的是这条线。这也是大多数人的第一反应。还是同样的问题,如果我要用面向对象的方法来解决。那我首先会考虑解决一个问题都需要哪些人,哪些工具,物品等。然后再创建人,工具,物品,让他们提供合适的方法。最后再根据我要解决问题的思路来让每个类调用它的接口。这个过程中每个类都是独立的,所以它是一个一个的点。面向过程侧重线,面向对象侧重点。
最好的例子就是活字印刷术的发明。在没有发明之前,一首诗是直接刻在模板上的,如果想要更改某个字,则需要重新刻一块模板。活字印刷术发明之后,每个字都是独立的,如果要换字,那直接换就可以,不需要更换整个模板。
关于类,要记住两个关键词,状态和行为,状态对应属性,行为对应接口。
其实面向对象更像现实世界呢。每个人,每个物都相当于一个类,当一个人要解决某个问题时,往往都是去调用这个类的接口,而不必关心接口是如何实现的。就拿最简单的看电视来说,我只需按电视的播放开关就可以观看有趣的节目,而不是由我来控制各个显像管,数字信号的转换等等。
但是我们不能只注重面向对象而抛弃面向过程,这两者是缺一不可,相辅相成的。我的总体思路是解决问题的顺序是过程化的,而设计方式是以类为基础的面向对象。
面向对象三大特征:
1.封装性:
有时称为数据隐藏,是与对象有关的一个重要概念,从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,操作数据的过程叫方法。
实现封装的关键在于绝对不能让类中的方法直接访问其他类的实例域,程序仅通过对对象的方法与对象数据进行交互。封装给对象赋予了“黑盒”特征,这是提高重用性和可靠性的关键。
2.多态性:
从字面上理解,多态就是指一个对象在运行是会有多种形态,就比如可以说student是一个person,也可以说student是一个object。
Person student=new Student();
为什么要使用多态呢?多态可以让代码更加灵活,再举一个例子:
这也是我们常写的一句代码,为什么不把List换成ArrayList?
List<String> list=new ArrayList<>();
一个很大的原因就是要考虑到以后的情况,假设以后ArrayList已无法满足我们软件的需求,这时候可能需要一个和ArrayList相似的类来替代它,那么如果我们直接面向具体的类进行编程,以后的可维护性肯定会变差,所以多态能使我们面向抽象进行编程,使代码更加地灵活。
多态的缺点
那么多态肯定会有它的缺点,那就是我们无法调用我们具体类的方法。什么意思?举个例子:
假设我们的Person类有一个speak方法,Student类是从Person类继承过来的,它有一个额外的方法study。
那么我们直接这样:
Person student=new Student();
很明显,这样我们就失去了study这个方法。
3.继承性:
1.继承性的好处:①减少了代码的冗余,提高了代码的复用性;②更好的扩展性 ③为多态性的使用提供了前提
*
- 2.格式:class A extends B. extends:继承,(延展、扩展
- 子类(SubClass:A
- 父类(SuperClass、超类、基类:B
lass Person{ // 定义Person类
private String name ; // 定义name属性
private int age ; // 定义age属性
public Person(){
System.out.println("父类Person中的构造。") ;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
};
class Student extends Person{ // 定义Student类
private String school ; // 定义school属性
public Student(){
super() ; // 默认隐藏
System.out.println("子类Student中的构造。") ;
}
public void setSchool(String school){
this.school = school ;
}
public String getSchool(){
return this.school ;
}
};
public class InstanceDemo{
public static void main(String arsg[]){
Student stu = new Student() ;// 实例化子类对象
stu.setName("张三") ; // 此方法在Student类中没有明确定义
stu.setAge(21) ;
stu.setSchool("东北大学") ;
System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge() + ",学校:" + stu.getSchool() ) ;
}
};