1 面向对象的设计思想

1.1 什么是面向对象

  1. 面向对象是一种思维方式

  2. 面向对象是一种编程方式

  3. 面向对象并不只针对某一种编程语言

  4. 面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。

2 面向对象和面向过程的区别

2.1 面向过程

面向过程过程侧重整个问题的解决步骤,着眼局部或者具体

优缺点

  • 优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;

    ​ 效率高,面向过程强调代码的胆小精悍,善于结合数据结构来开发高效率的程序。

    ​ 流程明确,具体步骤清楚,便于节点分析。

  • 缺点:

    ​ 需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高;

    ​ 对复杂业务来说,面向过程的模块话难度较高,耦合度也比较高。

2.2 面向对象

面向对象侧重具体的功能,让某个对象具有这样的功能。更加侧重于整体。

优缺点

  • 优点:结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式;

    ​ 封装性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省;

    ​ 容易扩展,代码重用率高,可继承,可覆盖;

    ​ 实现简单,可有效地减少程序的维护工作量,软件开发效率高。

  • 缺点:

    ​ 效率较低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少,从而不适合底层开发和游戏开发,甚至是多媒体开发;

    ​ 复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。

3 类与对象的关系

3.1 类

3.1.1 什么是类

高度概括:类是一组相似事物的统称!类可以看成一组相似对象的模板。

首先:请看“一组”,思考一下为什么是“一组”,不是“一个”?其次:请看“相似”,思考一下为什么是“相似”,不是“相同”?最后:请看“统称”,思考一下为什么是“统称”,不是“名称”?

  • 一组:一组的玄机在于“多个“,单个事物无法成为类。一个很简单的例子:“狗“可以是一类,但“你家2哈”就不是一个类(那又是什么呢,请看后文分解?)

  • 相似:相似的玄机在于“比较像,但不完全相同”。还是“狗”这个例子:“你家2哈”和“路边的土狗”都是狗,有很多相似的地方,但它们两个绝对不是完全相同的。

  • 统称:统称的玄机在于“统”,也可以叫做“通称”,统称要能够概括这一组“多个”事物。如:“车”、“人”等。

3.1.2类的组成

类由三部分组成:

  1. 属性

  2. 方法

  3. 构造函数(构造器)

3.1.3 类的定义,以及属性的定义、方法的定义

定义一个类的步骤

  1. 定义类名

  2. 编写类的属性

  3. 编写类的方法

[访问修饰符(public)]  class  类名 {

  //定义属性部分
  属性1的类型 属性1;
  属性2的类型 属性2;
  ……
  属性n的类型 属性n;

  //定义方法部分
  方法1;
  方法2;
  ……
  方法m;
}

代码示例:

public class Dog {
    //定义属性
     String name;

     int age;

     double height;

    //定义方法
    public void eat(){
        System.out.println("吃的方法...");
    }

    public void run(){
        System.out.println("跑的方法...");
    }

}

3.2 对象

3.2.1 什么是对象 ——(万物皆对象)

高度概括:对象是描述客观事物的一个实体!对象可以看成类的一个具体实例(事物)。

课堂练习:

  • 说一说教室里的对象

  • 描述他们的属性和方法

3.2.1 对象的创建

    //创建对象
    new 类();

3.3 变量的分类(变量一定要初始化才能使用)

3.3.1 成员变量(若没有指定初始化则会默认初始化)

  • 定义:直接定义在类中的变量

  • 作用域:在整个类的内部都可以访问

3.3.2 局部变量(必须指定初始化,不会被默认初始化)

  • 定义:定义在方法中的变量

  • 作用域:只在定义该局部变量的方法内部可以访问

示例代码:

public class HelloWorld {

    String name="张三"; //成员变量

    public void test(){
        int age=18; //局部变量
    }
}

课堂练习:

  1. 创建一个名为Book的类,用来代表一本书。类中有3个属性,分别是String类型的bookName, int类型的pageCount和double类型的price。

  2. 使用第1题中的Book类,首先创建一个Book类的对象,然后给类中的三个属性赋值,最后将Book类对象的三个属性值输出到控制台。

  3. 理解对象和引用之间的关系:编写一个程序,使用第1题中的Book类。首先创建一个Book类的对象,然后创建book1利book2两个Book类的引用,让它们都指向创建出的Book对象。通过这两个引用修改Book对象的属性值,最后将Book对象的属性值输出到控制台。

​ (使用: 对象的引用名.(属性和方法))

​ (引用:1、赋值 = :表示地址的传递

​ 2、一个对象可以有多个引用,一个引用只能指向一个对象)

public class Main2 
    /**
     * 对象与引用的关系
     * 
     * @param args
     */
    public static void main(String[] args) {
        // 一个对象可以拥有多个引用    
        // 一个引用只能指向一个对象
        int[] as = new int[] { 1, 2, 3, 4, 5 };
        int[] bs = as;// 地址的传递
        bs[2] = 999;
        as = new int[] { 7, 8, 9 };//将新对象地址传递给as。as会断开旧的对象引用
        as[0] = 888;
        System.out.println(bs[0]);
    }
}

5 构造器

构造器又称构造函数,也叫构造方法。但它并不是一个“方法”。

5.1 构造器的定义

1、构造器的名字和类名相同。

2、构造器的作用在于构造并初始化对象。

public class HelloWorld {

    String name="张三";//成员变量

      //1、参数化构造器   带有形参
    public HelloWorld(String name) {
        this.name = name;
    }

    //2、默认(隐式)构造器  也叫无参构造器。
    // public HelloWorld() {
    // }

    public void test(){
        int age=18;//局部变量
    }
}

注意:

  1. 如果一个类中没有显示的定义任何一个构造器,则这个类会有一个默认的隐式的无参构造器。

  2. 如果一个类中定义了任意一个构造器,则默认的隐式的无参构造器就不存在了。如果需要用到无参构造器,则必须再显示的声明。

5.2 构造器的调用

在使用关键字new来创建对象的时候,根据传入的参数一定会调用相应的构造器

5.3 构造器(构造方法)重载

和普通方法重载一样(讲方法的时候再讲解...)

6 this关键字

  1. 每个类的每个非静态方法(没有被static修饰)都会隐含一个this引用名称,它指向调用这个方法的对象。

  2. 当在方法中使用本类的属性时,都会隐含地使用this名称,当然也可以明确指定。

  3. this可以看作是一个变量,它的值就是当前对象的引用。

6.1 this.属性:访问本类的成员属性

public class Employee {
    String name;        //姓名
    int age;            //年龄
    double salary;      //薪水
    public Employee(String name, int age, double salary){    //构造方法
        this.name = name;   //左边的name是成员变量name,右边的name是局部变量
        this.age = age;
        this.salary = salary;
    }
 }

6.2 this.方法:访问本类的成员方法

//如果某个构造方法的第一条语句具有形式this(...),那么这个构造方法将调用本类中的其他方法。
public class Employee {
    private String name;//姓名
    private int age;//年龄
    private double salary;//薪水
    public Employee(String name, int age, double salary){//构造方法1
        this.name = name;//使用this,访问成员属性
        this.age = age;
        this.salary = salary;

      this.test();//使用 this访问成员方法
    }
      public void test(){
      System.out.println("成员方法");
      }
}

6.3 this():访问本类中的构造器

方法重载的时候细讲 ...

results matching ""

    No results matching ""