五.面向对象思想

五.面向对象思想

面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,是一种对现 实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

面向对象是相对于面向过程来讲的,指的是把 相关的数据和方法组织为一个整体 来看待,从更高的层次来进行系 统建模,更贴近事物的自然运行模式。

面向过程到面向对象思想层面的转变: 面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。 面向过程到面向对象,是程序员思想上 从执行者到指挥者的转变。

类和对象的区别和联系:

1) 类是抽象的,概念的,代表一类事物,比如人类,猫类.., 即它是数据类型.

2) 对象是具体的,实际的,代表一个具体事物, 即 是实例.

3) 类是对象的模板,对象是类的一个个体,对应一个实例

 

如何创建对象

1) 先声明再创建

Cat cat ; //声明对象 cat

cat = new Cat(); //创建

2) 直接创建

Cat cat = new Cat();

如何访问属性

基本语法 对象名.属性名;

类和对象的内存分配机制

1) 栈: 一般存放基本数据类型(局部变量)

2) 堆: 存放对象(Cat cat , 数组等)

3) 方法区:常量池(常量,比如字符串), 类加载信息

 

 

练习
Person a = new Person();
a.age = 10;
a.name = "小明";
Person b;
b = a;
System.out.println(b.name);//小明
b.age = 200;
b = null;
System.out.println(a.age);//200
System.out.println(b.age);//异常

image-20211028101513484

成员方法

在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名..),我们人类还有一 些行为比如:可以说话、跑步..,通过学习,还可以做算术题。这时就要用成员方法才能完成。

成员方法的定义:

访问修饰符 返回数据类型 方法名(形参列表..) {//方法体

语句;

return 返回值;

}

成员方法的好处:

1) 提高代码的复用性

2) 可以将实现的细节封装起来,然后供其他用户来调用即可

示例
public class Method01 {
//编写一个 main 方法
  public static void main(String[] args) {
      //方法使用
      //1. 方法写好后,如果不去调用(使用),不会输出
      //2. 先创建对象 ,然后调用方法即可
      Person p1 = new Person();
      p1.speak(); //调用方法
      p1.cal01(); //调用 cal01 方法
      p1.cal02(5); //调用 cal02 方法,同时给 n = 5
      p1.cal02(10); //调用 cal02 方法,同时给 n = 10
      //调用 getSum 方法,同时 num1=10, num2=20
      //把 方法 getSum 返回的值,赋给 变量 returnRes
      int returnRes = p1.getSum(10, 20);
      System.out.println("getSum 方法返回的值=" + returnRes);
  }
}
class Person {
  String name;
  int age;
  //方法(成员方法)
  //添加 speak 成员方法,输出 “我是一个好人”
  //老韩解读
  //1. public 表示方法是公开
  //2. void : 表示方法没有返回值
  //3. speak() : speak 是方法名, () 形参列表
  //4. {} 方法体,可以写我们要执行的代码
  //5. System.out.println("我是一个好人"); 表示我们的方法就是输出一句话
  public void speak() {
  System.out.println("我是一个好人");
  }
  //添加 cal01 成员方法,可以计算从 1+..+1000 的结果
  public void cal01() {
      //循环完成
      int res = 0;
      for(int i = 1; i <= 1000; i++) {
        res += i;
      }
  System.out.println("cal01 方法 计算结果=" + res);
  }
  //添加 cal02 成员方法,该方法可以接收一个数 n,计算从 1+..+n 的结果
  //老韩解读
  //1. (int n) 形参列表, 表示当前有一个形参 n, 可以接收用户输入
  public void cal02(int n) {
      //循环完成
      int res = 0;
      for(int i = 1; i <= n; i++) {
      res += i;
  }
  System.out.println("cal02 方法 计算结果=" + res);
  }
  //添加 getSum 成员方法,可以计算两个数的和
  //老韩解读
  //1. public 表示方法是公开的
  //2. int :表示方法执行后,返回一个 int 值
  //3. getSum 方法名
  //4. (int num1, int num2) 形参列表,2 个形参,可以接收用户传入的两个数
  //5. return res; 表示把 res 的值, 返回
  public int getSum(int num1, int num2) {
      int res = num1 + num2;
      return res;
  }
}

解析:

访问修饰符 (作用是控制 方法使用的范围)

如果不写默认访问,[有四种: public, protected, 默认, private]

 

返回数据类型

1) 一个方法最多有一个返回值 [思考,如何返回多个结果 返回数组 ]

2) 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)

3) 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 return 值; 而且要求返回值类型必须和 return 的 值类型一致或兼容 4) 如果方法是 void,则方法体中可以没有 return 语句,或者 只写 return;

 

方法名

遵循驼峰命名法,最好见名知义,表达出该功能的意思即可, 比如 得到两个数的和 getSum, 开发中按照规范

 

成员方法传参机制

基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参

 

引用数据类型,传递的是地址,可以通过形参影响实参

 

方法递归调用

递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变 得简洁

示例

阶乘问题

//factorial 阶乘
public int factorial(int n) {
  if (n == 1) {
  return 1;
  } else {
  return factorial(n - 1) * n;
}

 

posted @ 2021-10-28 19:39  brysjs  阅读(204)  评论(0)    收藏  举报