什么是面向对象编程?就是把万事万物都抽象成为对象,一切都是对象!
什么是抽象?抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。
什么是对象?对象是一个自包含的整体,用一组可识别的特征和行为来标识。
人是对象,苹果是对象,猫是对象,鸟是对象,总之一切都是对象!对象有属性(域)和行为(方法)。比如人有名字,身高,体重等属性,有吃,喝,玩,思考等行为。
那怎样创建对象呢?用类来创建。
类是具有相同的属性和功能的对象的抽象的集合。用class表示。
面向对象编程很简单,就是定义很多类,然后用类生成对象,并使他们互相通信以完成需要的功能。
Class Person{
//定义人的两个属性:名字和年龄
String name;//人都有名字
Int age;//人都有年龄
//定义人的行为:思考
Public void think(){
System.out.println(“人可以思考问题”);
}
}
有时候我们要初始化类,就必须用到构造方法,构造方法名与类名相同,无返回值。所有类都有构造方法,他是用来初始化类的,上面的类就隐含了一个构造方法:
Public Person(){}
我们可以添上他。如果我们没有定义构造方法,系统默认提供一个无参数的构造方法。如果我们定义了,系统不再定义。可以定义多个构造方法,这叫方法重载(方法名相同,但是参数类型或个数不同)。
Class Person{
Public Person(){}
Public Person(String name){}
String name;//人都有名字
Int age;//人都有年龄
Public void think(){
System.out.println(“人可以思考问题”);
}
}
面向对象的核心思想是抽象,类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象。面向对象有三大特征:封装,继承,多态。
面向对象三大原则之一:封装
什么是封装?每个对象都包含它能进行操作所需要的全部信息,这个特性称为封装。因此对象不必依赖其他对象来完成自己的操作。
封装的好处:
1, 良好的封装能减少类与类之间的耦合 什么是耦合呢?就是类与类之间的关系密切程度。就是藕断丝连,两个类关系越密切,耦合性越高,我们称为强耦合;反之为弱耦合。我们要尽量减少类之间的耦合性,为什么呢?因为两个类关系越密切,我们越难阅读,理解他,从而更难修改,维护他。
我们要为交互对象之间的松耦合设计而努力!如此我们便容易理解,进而扩展维护他们。
2, 类内部的实现可以自由的更改 如果你有多public属性,其他类也引用了他们,你改了他们其他类也同样修改了,这样有时很麻烦。但如果封装的好,只有本类用,我们可以自由更改它,而不用顾忌他引起了其他变化。
3, 类具有清晰的对外接口 其他类可以通过本类提供的public方法(对外接口)与本类进行通信。
封装的实现形式:
1, 类的封装 能不用public修饰符就不用。
2, 属性的封装 所有属性原则上都要用private修饰(考虑到测试等原因可以提高级别)。可提供get,set方法设置访问恩,但是get可以提供,set如果没有必要则不提供。
3,方法的封装 首选private,其次protected ,default,尽量避免用public。
面向对象三大原则之二:继承
对象的继承代表了一种“is a”关系(是)。比如猫是一种动物,Cat is a animal,则表明猫类继承动物类,猫是子类,动物是父类。记住三句话:
1. 子类拥有父类非private的属性和行为(方法)。(private表示只能在本类使用)
2. 子类具有自己的属性和行为,即子类可以扩展父类没有的属性和行为。
3. 子类还可以以自己的方式实现父类的功能(方法重写)
继承可以减少重复代码。程序设计中我们应该尽量减少重复冗余的代码,不能来说Ctrl+c再Ctrl+v的,这是最初级的程序员的做法。而且重复代码越多,越难阅读,越难修改和维护。我们要构建简洁,精炼,封装良好的模块。
继承的好处:使得所有子类公共的部分都放在了父类里,使得代码共享,避免了重复。另外使得修改或扩展都较为容易。
坏处:父类变,子类不得不变。继承破坏了封装,子类和父类强耦合,父类的实现细节暴漏给了子类。
什么时候使用:当两个类之间具备“is a”关系的时候,就可以考虑用继承了。
如:猫是一种动物,玫瑰是一种花。。。
面向对象三大原则之三:多态
多态表示 是允许将父对象设置成为和一个或多个它的子对象相等的技术。
1. 子类以父类的身份出现 儿子代表老子
2. 子类在工作时以自己的方式进行
3. 子类以父类的身份出现时,子类特有的属性和方法不可以使用。
实现多态必须有:继承,重写,子类引用指向父类。
Father instance = new Son();//instance不能调用son类独有的属性方法。
抽象类
1. 抽象类不能实例化
2. 抽象方法必须被子类重写
3. 包含抽象方法的类必然是抽象类
4. 抽象类应该拥有尽可能多的共同代码,以及尽可能少的数据(属性)。
5. 抽象类是用来继承的!具体类不是用来继承的。
接口
1. 接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。
2. 接口的方法没有实现。Interface ITest{void test();}
3. 一个类可以实现多个接口。Class A implemens I1,I2{}
抽象类和接口的区别
1.类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象。
接口是对类的局部(行为)进行抽象,不针对属性。抽象类是对类整体的抽象(属性和行为)。他们的共性就是抽象!
2.如果行为跨越不同类的对象,可以使用接口;而对于一些相似的类对象,用继承抽象类。如人类,鸟类,动物类都可以行走,我们可以定义一个接口IWalk实现一个行走的方法,从而人类,鸟类,动物类实现(implemens)IWalk,从而拥有走的功能。苹果,桔子,西瓜有很多相同的属性和行为,我们可以定义一个水果的抽象父类。
3.从设计角度讲,抽象类是从子类中发现了公共的东西(苹果,桔子都是水果,都可以吃),泛化出父类,然后子类继承父类;而接口是根本不知道父类的存在,方法如何实现还不确定,预先定义。
我们先写了几个类,突然发现他们有很多共同的属性和方法,我们于是重构一下,定义一个抽象父类,然后让他们继承父类。
· 通过重构改善现有代码的设计!