AnthonyCJ's Blogs

Find your passion, and you'll feel the light.

JavaSE-3-面向对象-1

JavaSE-学习笔记,主要内容为Java方法(函数)相关概念、面向对象三大特性(封装、继承、多态)-封装相关知识。

1. Java方法(函数)

1.1 概念

概念:也叫函数,其实就是具有一定特殊功能的一段代码,将需要在多个位置重复使用的一组代码,
定义在方法内部。
意义:1.避免了重复的代码。2.增强了程序的扩展性。


1.2 定义方法

语法格式

1
2
3
4
[修饰符1,修饰符2...] 返回值/void 方法名(参数列表) {
...
return
}

示例

1
public static void main(String[] args) {}

修饰符:public,static
返回值:一个方法执行之后,返回给调用处的结果。可能有,也可能没有。
有:在方法定义的时候,写清楚方法要返回的数据的类型。
没有:void,表示这个方法执行结束之后,没有返回值给调用处。
方法名:也是一种标识符。首字母小写,驼峰式命名。
():方法的标志。括号里:参数列表
{}:方法体
参数列表:方法在运算过程中的未知数据,调用者调用方法时传递
return :将方法执行后的结果带给调用者,方法执行到 return ,整体方法运行结束


1.3 调用方法

如果一个方法只有定义,那么方法中代码并没有被执行,只有被调用了才会执行方法中的代码。

通过方法的名字进行调用。

  • 对于静态static方法,调用方法如下
    • 类名.方法名()
    • 调用当前类中的静态方法时,类名可以省略
  • 对于非静态的方法
    • 需要创建该类的对象,通过对象调用方法
    • ClassName objectName = new ClassName();
    • objectName.method();

1.4 方法返回值

如果一个方法调用之后,需要返回给调用处结果,那么表示这个方法有返回值,在方法中需要使用
return语句把结果返回给调用处。

注意

  • 如果一个方法声明了有返回值(非void),那么方法中一定要使用return语句返回结果。
  • 定义方法的时候,声明的返回值类型,一定要和return后实际上返回的数值类型一致。
  • 如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行哪个分
    支,都要有return可以被执行到。
  • 如果一个方法声明没有返回值(void),那么方法中也可以使用return语句,用于强制结束方法的执
    行。

1.5 方法参数

一个方法中,有些数据的数值不确定,我们定义为参数,由调用处调用方法的时候,传入具体的数
据。

  • 形式参数
    • 定义方式,声明的参数,用于接收调用处传来的数据。
  • 实际参数
    • 调用方法的时候,实际赋值给形参的数据。

1.6 方法重载

概念:一个方法的多种形式。

  • 同一个类中
  • 方法名相同
  • 参数列表必须不同(顺序,个数,类型)
    • 与static,返回值,其他的修饰符……无关

1.7 递归

方法中调用方法本身,就叫做递归方法。

递归方法一定有出口,并逐层的向出口靠近。

  • 递归需要满足的三个条件
    1. 一个问题的解可以分解为几个子问题的解
    2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
    3. 存在递归终止条件
  • 如何编写递归代码
    • 最关键的是写出递推公式,找到终止条件
      1. 找到如何将大问题分解为小问题的规律
      2. 并且基于此写出递推公式
      3. 然后再推敲终止条件
      4. 最后将递推公式和终止条件翻译成代码

举例

题目:假如这里有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这 n 个台阶有多少种走法?如果有 7 个台阶,你可以 2,2,2,1 这样子上去,也可以 1,2,1,1,2 这样子上去,总之走法有很多,那如何用编程求得总共有多少种走法呢?

用公式表示:f(n) = f(n-1)+f(n-2)

递归终止条件就是 f(1)=1,f(2)=2

代码实现:

1
2
3
4
5
int f(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return f(n-1) + f(n-2);
}



2. 封装

2.1 面向对象思想概述

面向对象编程(OOP - Object Oriented Programing)

面向对象不是一门编程语言,也不是一种语法,而是一种编程思想。

Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。

面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。

  • 面向过程:关注的是过程。遇到一个问题时候,”我该怎么做”,一步一步实现最终的功能即可。
  • 面向对象:关注的是对象。遇到一个问题时候,”我该让谁来做”,这个谁就是我们要关注的对象。

2.2 类和对象

  • 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。

现实中,描述一类事物:
属性 :就是该事物的状态信息。
行为 :就是该事物能够做什么。

举例:小猫。
属性:名字、体重、年龄、颜色。
行为:走、跑、叫。

  • 对象 :是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。

现实中,一类事物的一个实例:一只小猫。
举例:一只小猫。
属性:tom、5kg、2 years、yellow。
行为:溜墙根走、蹦跶的跑、喵喵叫。

  • 类与对象的关系
    • 类是对一类事物的描述,是抽象的
    • 对象是一类事物的实例,是具体的
    • 类是对象的模板,对象是类的实体

2.3 类的定义

格式

1
2
3
4
5
6
7
8
[修饰符] class ClassName {
属性字段:field
...
成员方法:method()
...
构造方法:Constructor()

}

创建对象

1
ClassName objectName = new ClassName();

类中成员变量,和局部变量不同,有默认值。
基本类型:
int,byte,short,long,float,double,,默认值都是0;
char 的默认值”空字符”,也就是‘\u0000’,数值为0;
boolean默认值false;
引用类型:默认值都是null,空;


2.4 构造函数

构造方法是一种特殊的方法.

  1. 定义的语法结构不同
1
2
3
[访问权限修饰符] 方法名(参数列表) {

}
  • 修饰符:访问权限修饰符
  • 没有返回值类型,也不写void
  • 方法名:必须和类名一致
  • 参数:
    • 没有参数:无参构造
    • 有参数列表:有参构造
  1. 调用方法不同
    • 通过new关键字调用
1
new Constructor();
  1. 作用不同:专门用于创建对象

注意:如果一个类中,没有写构造方法,那么当创建对象的时候,编译器会自动添加一个无参的构造方法。但
是如果类中写了构造方法,那么编译器不再自动添加无参构造方法。


2.5 this 关键字

this代表所在类的当前对象的引用(地址值),即对象自己的引用。

方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

用途一:当局部变量和成员变量命名冲突的时候,通过this来区分。

1
2
3
4
5
public Person(String name,int age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
}

用途二:访问本类的属性和方法

1
2
this.field;
this.method();

用途三:指代构造方法:this();

如果存在多个构造方法,那么this指代的构造方法要靠参数来区分:顺序,个数,类型。

注意:this指向构造函数的时候,只能放在第一句。

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
* @author AnthonyCJ
* @version 1.0
* @description 自己手动实现ArrayList
* @date 2022/12/01 9:52
*/
public class MyArrayList<E> implements Iterable<E> {
// 真正存储数据
private E[] data;
// 记录当前数组中元素的个数
private int size;
// 默认初始容量
private static final int INIT_CAP = 1;

public MyArrayList() { this(INIT_CAP); }

public MyArrayList(int initCapacity) {
data = (E[]) new Object[initCapacity];
size = 0;
}

...
}

2.6 面向对象三大特性之封装

面向有三大特性:封装,继承,多态。

封装性:尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限。

面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。

封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

  1. 隐藏了实现的细节
  2. 提高了代码的复用性
  3. 提高了安全性
  • 封装步骤
    1. 使用private修饰符来修饰属性。限于本类中访问
    2. 在类中提供getterssetters用于对属性进行赋值和取值
      • 注意它们的修饰符,如果都是public,那么实际上和没有封装是一样的,可以通过对象调用方法随意地修改属性

用爱发电,无需打赏哦~