[JAVA学习笔记] 类与对象

面向对象编程概念

面向对象编程(OOP),英文全称为Object Oriented Programming,除了OOP(面向对象编程)外,还有OOD(面向对象的设计)、OOA(面向对象的分析)。
在早期的编程语言中,都是以面向过程编程为主,那么面向过程和面向对象又有什么区别?这里我引用什么是面向对象(OOP)一文的一个例子:

有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择:
1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。
2、去饭店,张开嘴:老板!来一份鱼香肉丝!
看出来区别了吗?1是面向过程,2是面向对象。

其实究其根本,面向对象编程最底层也是面向过程编程,只不过我们将某些特定功能抽象成了类(Class),然后对其进行封装,在需要该功能的时候只需要调用这个封装好的类即可。
那么面向对象编程又有什么优势呢?

1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。

面向对象编程特性

三大基本特点

  • 封装性
    也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只 需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现 MVC 分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。
  • 继承性
    就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP 只支持单继承,也就是说一个子类只能有一个父类。
  • 多态性
    子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

五大基本原则

  • 单一职责原则 SRP (Single Responsibility Principle)
    类的功能要单一。
  • 开放封闭原则 OCP (Open-Close Principle)
    一个模块对于拓展是开放的,对于修改是封闭的。
  • 里式替换原则 LSP (the Liskov Substitution Principle LSP)
    子类可以替换父类出现在父类能够出现的任何地方。
  • 依赖倒置原则 DIP (the Dependency Inversion Principle DIP)
    高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
  • 接口分离原则 ISP (the Interface Segregation Principle ISP)
    设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。

Java中的类与对象

基础语法

类 Class

Java中定义一个类的基础语法为:

class TestClass{
    ...... //类主体
}

需要注意的是,类的命名需要遵循大驼峰原则命名,即每个单词的首字母都需要大写
public权限类的定义必须保存在与类名相同的文件中,这个限制不适用于非公共类。

字段 Field

Java类中,字段(field)是变量,字段可以是基本类型,也可以是对象的引用,例如:

class TestClass{
    int age = 18;  //基本整型
    OtherClass name;  //OtherClass对象的引用,格式为:<类名> <类的变量>
}

与类的命名不同的是,字段的命名需要遵循小驼峰原则,即第一个单词首字母不大写,其余每个单词首字母都需要大写

方法 Method

方法(method)定义了一个类的对象(或类的实例)可以执行的动作(功能)。方法包括声明部分主体部分,声明部分由返回值方法名参数列表组成,主体部分则包含了操作执行的代码。
定义方法的基础语法如下:

returnType methodName (ListOfArg){ //声明部分,也称方法签名
    ...... //主体部分
}

例如:

String getName (String name){  //String表明该方法将返回一个String类型的结果,String name表明该方法需要传入一个Sring类型的变量
    return name;
}

OtherClass getAge (int age){  //该方法将会返回一个OtherClass对象,并且需要传入一个int类型的变量
    return age;
}

方法的返回类型(Return Type)可以是基本类型(String、int、double等)、对象、void(为空)。
返回类型为void则表明该方法不返回任何东西。

上一篇:程序设计六大原则


下一篇:Codeforces - A. Watermelon