【Java】面向对象
类(Class)
-
类是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义的引用数据类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。
-
类是对现实生活中一类具有共同特征的事物的抽象。如果一个程序里提供的数据类型与应用中的概念有直接的对应,这个程序就会更容易理解,也更容易修改。一组经过很好选择的用户定义的类会使程序更简洁。此外,它还能使各种形式的代码分析更容易进行。特别地,它还会使编译器有可能检查对象的非法使用。
-
类的内部封装了属性和方法,用于操作自身的成员。类是对某种对象的定义,具有行为(behavior),它描述一个对象能够做什么以及做的方法(method),它们是可以对这个对象进行操作的程序和过程。它包含有关对象行为方式的信息,包括它的名称、属性、方法和事件。
-
类的构成包括成员属性和成员方法(数据成员和成员函数)。数据成员对应类的属性,类的数据成员也是一种数据类型,并不需要分配内存。成员函数则用于操作类的各项属性,是一个类具有的特有的操作,比如“学生”可以“上课”,而“水果”则不能。类和外界发生交互的操作称为接口。
一、面向对象三大特征之封装(Encapsulation)
合理隐藏,合理暴露
属性私有化,提供setter和getter方法访问属性
隐藏具体实现细节,仅对外提供开放接口
控制访问级别
增加数据安全性,不必在意实现细节,只需使用提供接口方法。
JavaBean
类必须是具体的公开的,必须提供无参构造器,并合理隐藏合理暴露。
二、面向对象三大特征之继承(Extend)
将多个类共有的属性方法,提取出作为一个父类(基类)。
其余类需要共有属性方法,作为子类(派生类)继承父类。
减少代码冗余(多余的重复或罗嗦内容),提高代码质量,使代码复用性强,但尽量减少继承关系,以降低耦合度(程序中,模块及模块之间信息或参数依赖的程度)。
Java中,不能多继承,可以多重继承。
三、面向对象三大特征之多态(Polymiorph)
同类型的对象,执行同一个行为,会表现出不同的行为特征。
设计时多态
指使用方法重载的方式进行设计,即可进行多种选择。
重载,一个类中可以存在多个方法名相同,但必须参数数量或类型的不同的方法,返回值也可以选择性不相同。
运行时多态
指使用方法重写的方式进行设计,即可使调用起来更加灵活。
重写,指在继承模式中,子类可以重新将父类的方法重新设计翻新。
四、抽象类
抽象类必须使用abstract来修饰类,抽象类必须存在至少一个抽象方法。
通常在不确定方法的实现,没有足够的信息来描述一个具体对象的时候,使用抽象类。
子类继承抽象类必须实现抽象类中的抽象方法。
模版方法
在抽象类中实现一个模版方法,在模版方法中调用自己的抽象方法,由子类继承抽象类来实现抽象方法从而实现模版方法中的具体细节。
不同的子类实现抽象类中的抽象方法(回调),实现不同的细节,从而形成模版方法。
来一个有味道的模版方法例
五、接口
接口与抽象类的区别
-
1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
-
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
-
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
-
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
注:JDK 1.8 以后,接口里可以有静态方法和方法体了。
注:JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。
注:JDK 1.9 以后,允许将方法定义为 private,使得某些复用的代码不会把方法暴露出去。
更多区别推荐资料:深入理解Java的接口和抽象类
六、内部类
静态内部类
成员内部类
局部内部类
匿名内部类
java面向对象的五大原则
单一职责原则:一个类,最好只做一件事,只有一个引起它变化。每个类应该实现单一的职责,如果不是,那就把类拆分
开放封闭原则:对扩展开放,对修改封闭
里氏替换原则:子类必须能够替换其基类,里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现
依赖倒置原则:依赖于抽象接口,不要依赖于具体实现,简单来说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户于与实现模块间的耦合
接口隔离原则:使用多个小的专门接口,而不是使用一个大的接口