面向对象编程

面向对象与面向过程

  • 面向对象(OOP)面向过程(POP)

    • 两者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,是将功能封装进对象,强调具备了功能的对象。
    • 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
  • 面向对象的三大特征

    • 封装(Encapsulation)
    • 继承(Inheritance)
    • 多态(Polymorphism)

面向对象的思想概述

  • 可以理解为:类 = 汽车设计图;对象 = 实实在在的汽车
  • 面向对象程序设计的重点是类的设计(也就是造汽车的重点是图纸的设计)
  • 定义类其实是定义类中的成员【成员变量(汽车零部件)和成员方法(汽车运行方法)】

Java类及类的成员

  • 现实世界万事万物是由分子、原子构成的。同理,Java代码世界是由诸多个不同功能的类构成的。
  • 现实世界中的分子、原子又是由什么构成的呢?原子核、电子!那么,Java中用类class来描述事物也是如此

    • 属性:对应类中的成员变量
    • 行为:对应类中的成员方法

类的语法格式

修饰符 class 类名{
    属性声明;
    方法声明;
}
/*说明:
修饰符,如public:类可以被任意访问
类的正文要用{}括起来
*/

创建Java自定义类

步骤:

  1. 定义类(考虑修饰符、类名)
  2. 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
  3. 编写类的方法(考虑修饰符、返回值属性、方法名、形参等)
/**
 * 这是一个描述人的类
 * @author mycheol
 *
 */
public class Person {
    //属性,成员变量;类的成员变量可以先声明,不用初始化,类成员变量是有默认值的
    String name;//姓名,String的默认值是null
    int age;//年龄,int的默认值是0

    //行为,成员方法,也叫函数;
    /**
     * 文档注释可以加在类或者方法前
     * 打印姓名
     */
    public void showName() {//方法名称如果是多个单词,驼峰命名法
        System.out.println("姓名:" + name);
    }
    
    /**
     * 获取年龄
     * @return
     */
    public int getAge() {
        return age;
        /* 如果是一个有返回值的方法,那么方法体的最后一行一定是返回相应的数据
        * 使用的是return关键字,返回的数据类型与方法定义的一致
        */
    }
}

对象的创建和使用

Java类的实例化,即创建类的对象

  • 使用new + 构造器创建一个新的对象。
  • 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)。

类的成员之一:属性

语法格式:

修饰符 类型 属性名 = 初始值;
  • 修饰符private:该属性只能由该类的方法访问。
  • 修饰符public:该属性可以被该类以外的方法访问。
  • 类型:任何基本类型,如int、boolean或任何类。

变量的分类:成员变量与局部变量

  • 成员变量:在方法体外,类体内声明的变量

    • 实例变量(不以static修饰)

    在类实例化成对象之后才能使用的

    • 类变量(以static修饰)

    static,意思是静态的,这样的变量不需要类实例化成对象就可以使用,直接通过「类名.属性名」这样的方式就可以使用

  • 局部变量:在方法体内部声明的变量

    • 形参(方法签名中定义的变量)
    • 方法局部变量(在方法内定义)
    • 代码块局部变量(在代码块内定义)

成员变量(属性)和局部变量的区别

  • 成员变量:

    • 成员变量定义在类中,在整个类中都可以被访问。
    • 成员变量分为类成员变量和实例成员变量,实例成员变量存在于对象所在的堆内存中。
    • 成员变量有默认初始化值。
    • 成员变量的权限修饰符可以根据需要,选择任意一个。
  • 局部变量:

    • 局部变量只定义在局部范围内,如:方法内,代码块内等。
    • 局部变量存在于栈内存中。
    • 作用的范围结束,变量空间会自动释放。
    • 局部变量没有默认初始化值,每次必须显式初始化。
    • 局部变量声明时,不指定权限修饰符。

类的成员之二:方法

什么是方法(函数)?

  • 方法是类或对象行为特征的抽象,也称为函数。
  • Java里的方法不能独立存在,所有的方法必须定义在类里。

语法格式:

修饰符 返回值类型 方法名(参数类型 形参1,参数类型 形参2,...){
    方法体语句;
}
  • 修饰符:public,private,protected等。
  • 返回值类型:return语句传递返回值;void没有返回值。

对象的创建和使用

如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。

Person p1 = new Person();
Person p2 = new Person();
p1.name = "张三";
p2.name = "李四";
p1.showName();//姓名:张三
p2.showName();//姓名:李四

方法的调用

public class Test{
    public static void main(String[] args){
        Test t = new Test();
        int area = t.getArea(3,5);
        System.out.println(area);
    }
    
    public int getArea(int x,int y){
        return x * y;
    }
}
  • 方法只有被调用才会被执行
  • 方法调用的过程分析:首先进入主程序,实例化对象,调用方法并传参,执行方法并返回结果
  • 没有具体返回值的情况,返回值类型用关键字void表示,如果该函数中的return语句在最后一句可以省略不写。
  • 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
  • 方法中只能调用方法,不可以在方法内部定义方法。
  • 同一个类中,所有的方法可以直接相互调用,不用new去实例化对象

对象的产生

当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型,如上面的Person及前面讲过的数组。

成员变量类型初始值
数字类型0
char'u0000'(表示为空)
booleanfalse
引用类型null

匿名对象

  • 我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。

    • 例如:

      new Person().showName();
  • 使用情况

    • 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
    • 我们经常将匿名对象作为实参传递给一个方法调用。

类的访问机制

  • 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static的成员变量,编译不通过)
  • 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。

面向对象思想”落地“法则

  1. 关注于类的设计,及设计类的成员:属性、方法。
  2. 类的实例化,即创建类的对象。比如:Person p = new Person()
  3. 通过 ”对象.属性“、”对象.方法“ 执行。

方法的重载(overload)

  • 重载的概念:

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数数据类型或者参数顺序不同即可。

  • 重载的特点:

与返回值类型无关,只看参数列表,且参数列表(参数个数或者参数类型或者参数顺序)必须不同。调用时,根据方法参数列表的不同来区别。

  • 重载示例:

    //返回两个整数的和
    int add(int x,int y){
        return x + y;
    }
    //返回三个整数的和
    int add(int x,int y,int z){
        return x + y + z;
    }
    //返回两个小数的和
    int add(double x,double y){
        return x + y;
    }
Last modification:December 29th, 2019 at 10:41 pm
If you think my article is useful to you, please feel free to appreciate