[Java基础] 面向对象编程-基础(六)

一、类与对象

1. 区别和联系

  • 类是抽象的,概念的,代表一类事物。
  • 对象是具体的,实际的,代表一个具体事物。
  • 类是对象的模版,对象是累的一个个体,对应一个实例。

2. 对象在内存中存在形式‼️

代码示例

Cat cat = new Cat();
cat.name = "小白";
cat.age = 12;
car.color = "白色";

图示

在这里插入图片描述

3. 属性/成员变量

基本介绍

成员变量 = 属性 = 字段(field)

属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型

注意示例

  • 属性的定义语法同变量:访问修饰符 属性类型 属性名
  • 属性的定义类型可以为任何类型,包括基本类型和引用类型
  • 属性如果不赋值,有默认值,规则和数组一致

4. 创建对象

  1. 先声明再创建:
Cat cat;
cat = new Cat();

  1. 直接创建
Cat cat = new Cat();

5. 访问属性

基本语法

对象名.属性名

cat.name;
cat.age;

6. 内存分配机制

代码示例

Cat cat1 = new Cat();
cat1.name = "小白";
cat1.age = 3;
car1.color = "白色";

Cat cat2 = cat1;

图示

在这里插入图片描述

结构分析

  • 栈:一般存放基本数据类型(局部变量)
  • 堆:存放对象(Cat cat 、 数组等)
  • 方法区:常量池、类加载信息

创建对象流程

  1. 先加载类信息(只会加载一次⚠️)
  2. 在堆中分配内存,进行默认初始化
  3. 把地址赋给p,p就指向对象

二、成员方法

1. 基本介绍

某些情况下,我们要需要定义成员方法(简称方法)。

比如人类:除了有一些属性外( 年龄,姓名.),我们人类还有一些行为比如:可以说话、跑步…,通过学习,还可以做算术题。

2. 调用机制‼️

代码示例

Person p1 = new Person();
int res = p1.getSum(10,20);

public int getSum(int num1,int num2){
	int res = num1 + num2;
	return res
}

图示

在这里插入图片描述

3. 成员方法优点

  • 提高代码的复用性
  • 可以将实现的细节封装起来,供其他人使用

4. 定义成员方法

表达式

访问修饰符 返回数据类型 方法名(形参列表){
方法体语句;
return 返回值; //(可有可无)
}

public void Tools(){
	...
}
  • 形参列表:表示成员方法输入
  • 返回数据类型:表示成员方法输出
  • 方法主体:表示为了实现某一功能代码块
  • return语句不是必须的

5. 注意示例

返回数据类型

  • 一个方法最多有一个返回值
  • 返回类型可以为任意类型,包含基本类型和引用类型
  • 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return
  • 如果方法是void,则方法体可以没有return语句,或者只写retutn;

形参列表

  • 一个方法可以有0个参数,也可以多个参数,中间要用逗号隔开
  • 参数类型可以可以为任意类型,包含基本类型和引用类型
  • 调用带参数的方法时,一定对应着参数列表传入形同类型或兼容的参数
  • 方法定义时的参数称为形参列表,方法调用时的传入参数称为实际参数

三、成员方法传参机制‼️‼️

1. 基本数据类型

代码示例

int a = 10;
int b = 20;
A obj = new A();
obj.swap(a,b);
System.out.println(a + " " + b);	//a = 10;b =20;

public void swap(int a,int b){
	int temp = a;
	a = b;
	b = temp;
}

图示

在这里插入图片描述

2. 引用数据类型

代码示例1

int arr[] = {1, 2, 3};
A obj = new A();
obj.swap(arr);
System.out.println(arr[0]);	//arr[0]=100⚠️;

public void swap(int arr[]){
	arr[0] = 100;

图示1

在这里插入图片描述

代码示例2

int arr[] = {1, 2, 3};
A obj = new A();
obj.swap(arr);
System.out.println(arr[0]);	//arr[0]=1⚠️;

public void swap(int arr[]){
	arr = null;

图示2

在这里插入图片描述

四、方法递归调用‼️

1. 基本介绍

递归就是方法自己调用自己,每次调用时传入不同的变量

递归有助于编程者解决复杂问题,同时可以让代码更加简洁

2. 递归

代码示例

public class Recursion{
	public static void main(String[] args){

		int n = 5;
		Tools tool = new Tools();

		tool.recur(n);
	}
}

class Tools{
	public void recur(int n){
		if (n > 2) {
			recur(n-1);
		}
	System.out.println(n);
	}
}

图示

在这里插入图片描述

递归重要规则

  • 执行一个方法时,就创建一个新的受保护的独立空间
  • 方法的局部变量是独立的,不会相互影响
  • 如果方法中使用的是引用类型的变量,就会共享该引用类型的数据
  • 递归必须向退出递归的条件逼近,否则会无限递归

五、方法重载

1. 基本介绍

Java中允许同一类中,多个同名方法的存在,但要求形参列表不一致

2. 重载的优点

  • 减轻了起名的麻烦
  • 减轻了记名的麻烦

3. 注意示例

  • 方法名:必须相同
  • 形参列表:必须不同
  • 返回类型:无要求

六、可变参数

1. 基本概念

Java中允许同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法

2. 基本语法

访问修饰法 返回类型 方法名(数据类型…形参名){}

public String fun(double...score){
	...
}

3. 注意示例

  • 可变参数的实参可以为0个或任意多个
  • 可变参数的实参可以为数组
  • 可变参数的本质是数组
public String fun(double...score){
	int len = score.length;
	int res;
	for (int i =0; i<score.length; i++) {
		res += score[i];
	}
}
  • 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在后面
public String fun(double...score,int n){	//❌

}
  • 一个形参列表中只能有一个可变参数
public String fun(double...score,int...n){	//❌

}

七、作用域

1. 基本用法

  • 在Java编程中,主要的变量就是属性(成员变量)和局部变量
  • 我们说的局部变量一般是指在成员方法中定义的变量
  • 全局变量可以不赋值,直接使用,有默认值⚠️
  • 局部变量必须赋值后,才能使用,没有默认值⚠️
  • 全局变量:也就是属性,作用域为整个类
  • 局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中

2. 注意示例

  • 属性和局部变量可以重名,访问时遵循就近原则
  • 在同一个作用域中,两个局部变量不能重名
  • 属性生命周期较长,伴随对象创建而创建,伴随对象销毁而销毁
  • 局部变量生命周期较短,伴随代码块执行而创建,伴随代码块的结束而销毁
  • 属性:可以被本类使用,或其他类使用(通过对象调用);可以加修饰符
  • 局部变量:只能在本类中对应的方法中使用;不可以加修饰符
    在这里插入图片描述

八、构造方法/构造器

1. 基本语法

表达式

[修饰符] 方法名(形参列表){
方法体;
}

  • 构造器的修饰符可以默认,也可以是public等
  • 方法名和类名字必须一样
  • 参数列表和成员方法一样的规则

2. 基本介绍

构造方法又叫构造器,是类的一种特殊方法,它的主要作用是完成对新对象的初始化

3. 注意示例

  • 方法名和类名相同
  • 没有返回值
  • 一个类可以定义多个不同的构造器,即构造器重载
  • 构造器是完成对象的初始化,而不是创建对象
  • 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化
  • 如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器,使用javap指令反编译看看
  • 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显性的定义一下,即:Dog(){}‼️

4. 创建对象流程

  1. 先加载类信息(只会加载一次⚠️)
  2. 在堆中分配内存,进行默认初始化(1⃣️默认初始化、2⃣️显性初始化、3⃣️构造器初始化)
  3. 把地址赋给p,p就指向对象
    在这里插入图片描述

九、this关键字

1. 深入理解

Java虚拟机会给每个对象分配this,代表当前对象

2. 注意示例

  • this关键字可以用来访问本类的属性、方法、构造器
  • this同于区分当前类的属性和局部变量
  • 访问成员方法的语法:this.方法名(参数列表)
  • 访问构造器语法:this(参数列表)注意只能在构造器中使用
  • this不能在类定义的外部使用,只能在类定义的方法中使用
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你怎么知道我头发乌黑浓密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值