7.面向对象编程(基础部分)|Java学习笔记

news2024/11/24 7:43:36

文章目录

  • 类与对象
    • 类与对象的关系
    • 类和对象的区别和联系
    • 对象在内存中的存在形式
      • 类和对象的内存分配机制
  • 成员方法
    • 方法的调用机制原理
  • 成员方法传参机制
    • 基本数据类型的传参机制
    • 引用数据类型的传参机制
    • 成员方法返回类型是引用类型应用实例
  • 方法递归调用
    • 递归重要规则
    • 汉诺塔和八皇后
  • 方法重载
    • 注意事项和使用细节
  • 可变参数
    • 注意事项和使用细节
  • 作用域
    • 注意事项和使用细节
  • 构造方法/构造器
  • 对象创建流程分析
  • this 关键字

java 设计者 引入 类与对象(OOP) ,根本原因就是现有的技术,不能完美的解决新的新的需求.

类与对象

class Cat {
	// 成员变量=属性=field(字段)
    String name;
    int age;
    String color;
    double weight;
}

类与对象的关系

在这里插入图片描述
在这里插入图片描述

类和对象的区别和联系

  1. 类是抽象的,概念的,代表一类事物,比如人类,猫类…, 即它是数据类型.
  2. 对象是具体的,实际的,代表一个具体事物, 即 是实例.
  3. 类是对象的模板,对象是类的一个个体,对应一个实例

对象在内存中的存在形式

例子一:
在这里插入图片描述
例子二:
在这里插入图片描述
在这里插入图片描述

Person p = new Person();
p.name = “jack”;
p.age = 10

Java 创建对象的流程简单分析:

先加载 Person 类信息(属性和方法信息, 只会加载一次)
在堆中分配空间, 进行默认初始化(看规则)
把地址赋给 p,p 就指向对象
进行指定初始化,比如 p.name =“jack” p.age = 10

类和对象的内存分配机制

Java 内存的结构分析

  1. 栈: 一般存放基本数据类型(局部变量)
  2. 堆: 存放对象(Cat cat , 数组等)
  3. 方法区:常量池(常量,比如字符串), 类加载信息

Java内存结构 中写道:
在这里插入图片描述
这里 p1,p2 是局部变量(放在栈中),它指向 new 出来的对象(放在堆中)。

成员方法

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

成员方法的好处

  1. 提高代码的复用性。
  2. 可以将实现的细节封装起来,然后供其他用户来调用即可。

成员方法的定义

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

方法体里面不能再定义方法!即:方法不能嵌套定义。

  • 同一个类中的方法调用:直接调用即可。
  • 跨类中的方法A类调用B类方法:需要通过对象名调用。e.g. 对象名.方法名(参数);

方法的调用机制原理

在这里插入图片描述

成员方法传参机制

基本数据类型的传参机制

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

引用数据类型的传参机制

引用类型传递的是地址传递也是值,但是值是地址),可以通过形参影响实参

例如改变了

p.name = "1"

那么外面的 p 的 name 也会被改变。

但是

p = null

并不会使外面的 p 也变成 null。因为它只是让 p 不指向原来的堆了。

成员方法返回类型是引用类型应用实例

public Person copyPerson(Person p) {
	Person p2 = new Person();
	p2.name = p.name;
	p2.age = p.age;
}

方法递归调用

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

在这里插入图片描述

递归重要规则

  1. 执行一个方式时,就创建一个新的受保护的独立空间(栈空间)
  2. 方法的局部变量是独立的,不会相互影响,比如变量n
  3. 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据
  4. 递归必须向退出递归的条件逼近,否则就是无限递归(StackOverflowError)
  5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

汉诺塔和八皇后

汉诺塔

public class HanoiTower {
    public static void main(String[] args) {
        Tower tower = new Tower();
        tower.move(3, 'A', 'B', 'C');
    }
}
class Tower {
    //方法
    //num 表示要移动的个数, a, b, c 分别表示 A 塔, B 塔, C 塔
    public void move(int num , char a, char b ,char c) {
        //如果只有一个盘 num = 1
        if(num == 1) {
            System.out.println(a + "->" + c);
        } else {
            //如果有多个盘, 可以看成两个 , 最下面的和上面的所有盘(num-1)
            //(1)先移动上面所有的盘到 b, 借助 c
            move(num - 1 , a, c, b);
            //(2)把最下面的这个盘, 移动到 c
            System.out.println(a + "->" + c);
            //(3)再把 b 塔的所有盘, 移动到 c ,借助 a
            move(num - 1, b, a, c);
        }
    }
}

输出结果为:

A->C
A->B
C->B
A->C
B->A
B->C
A->C

八皇后
面试题 08.12. 八皇后
51. N 皇后
52. N 皇后 II

方法重载

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

重载的好处

  1. 减轻了起名的麻烦
  2. 减轻了记名的麻烦

一个例子:
在这里插入图片描述

注意事项和使用细节

  1. 方法名:必须相同
  2. 形参列表:必须不同(形参类型个数顺序,至少有一样不同,参数名无要求)
  3. 返回类型:无要求

可变参数

java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
就可以通过可变参数实现。

基本语法

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

一个案例

public class VarParameter01 {
    public static void main(String[] args) {
        int[] a = new int[2];
        System.out.println(a.getClass());   // class [I
        HspMethod m = new HspMethod();
        System.out.println(m.sum(1,2,3));
    }    
}

class HspMethod {
    public int sum (int... nums) {
        System.out.println(nums.getClass());    // class [I
        int res = 0;
        for (int i=0; i<nums.length; i++) {
            res += nums[i];
        }
        return res;
    }
}

打印了一下 int… nums 的类型,发现是 class [I ,和 int[] 的数据类型一样。

注意事项和使用细节

  1. 可变参数的实参可以为0个或任意多个。
  2. 可变参数的实参可以为数组。
  3. 可变参数的本质就是数组。
  4. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后。
  5. 一个形参列表中只能出现一个可变参数。

java 可变参数 (写的超级好的而一篇关于 java 可变参数的文章!)

  1. 调用一个被重载的方法时,如果此调用既能够和固定长度的重载方法匹配,又能和可变参数的重载方法匹配的话,会优先选择固定参数的重载方法。
  2. 当调用一个被重载的方法时,如果此调用能够和两个有可变参数的重载方法匹配,会出现编译错误。
  3. 避免使用空值和null,当两个方法的方法名和其他参数都相同,只有可变参数不同的时候,传入空值或者null会产生编译错误。(修改方法:让编译器知道传入的null是什么类型的,好让他找到对应的方法。)
  4. 可变参数在编译为字节码后,在方法签名中是以数组形态出现的,如果两个方法签名编译后的是一致的话,是不能编译通过的,不可以作为方法的重载。

作用域

  1. 在 java 编程中,主要的变量就是属性(成员变量)和局部变量。
  2. 我们说的局部变量一般是指在成员方法法中定义的变量
  3. java 中作用域的分类:(1)全局变量:也就是属性,作用域为整个类体 (2)局部变量:也就是除了属性之外的其他变量,作用域为定义它的代码块中
  4. 全局变量(属性)可以不复制,直接使用,因为有默认值,局部变量必须复制后才能使用,因为没有默认值。

注意事项和使用细节

  1. 属性和局部变量可以重名,访问时遵循就近原则。
  2. 在同一个作用域中,比如在同一个成员方法中,两个局部变量,不能重名。
  3. 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁。即在一次方法调用过程中。
  4. 作用域范围不同
    全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
    局部变量:只能在本类中对应的方法中使用
  5. 修饰符不同
    全局变量/属性可以加修饰符
    局部变量不可以加修饰符

构造方法/构造器

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:

  1. 方法名和类名相同
  2. 没有返回值
  3. 在创建对象时,系统会自动地调用该类的构造器完成对象的初始化。

基本语法

[修饰符] 方法名(形参列表){
	方法体;
}
  1. 构造器的修饰符可以默认, 也可以是 public protected private
  2. 构造器没有返回值
  3. 方法名 和 类名字 必须一样
  4. 参数列表 和 成员方法一样的规则
  5. 构造器的调用, 由系统完成

  1. 一个类可以定义多个不同的构造器,即构造器重载。
  2. 如果没有定义构造器,系统会自动给类生成一个默认无参构造器。
  3. 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式地定义一下。如:
Dog () {
    
}

对象创建流程分析

class Person {
	int age = 90;
	String name;
	Person (String n, int a) {
		name = n;
		age = a;
	}
}
Person p = new Person("小威", 23);
  1. 加载Person类信息(Person.class),只会加载一次。
  2. 在堆中分配空间(地址)。
  3. 完成对象初始化。
    1. 默认初始化 age=0 name=null
    2. 显式初始化
    3. 构造器的初始化
  4. 在对象在堆中的地址,返回给p (p是对象名,也可以理解成是对象的引用)。

this 关键字

java 虚拟机会给每个对象分配 this,表示当前对象。

简单的说,哪个对象调用,this 就表代表哪个对象。

  1. this 关键字可以用来访问本类的属性、 方法、 构造器。
  2. this 用于区分当前类的属性和局部变量。
  3. 访问成员方法的语法: this.方法名(参数列表)。
  4. 访问构造器语法: this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句) !
this(name, gender, age);

this 不能在类定义的外部使用, 只能在类定义的方法中使用。

匿名对象:只能使用一次

new Test().count1();

创建好之后就调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有哪些内外网都能传输文件的工具-镭速

随着互联网的快速普及&#xff0c;不同地区的人们之间进行了更为频繁的交流与合作。对于企业和组织而言&#xff0c;文件的共享和传输也变得越来越重要&#xff0c;特别是在不同的地理位置之间。此时&#xff0c;一个既可在内网使用&#xff0c;又能在外网实现高速传输的工具就…

企业直播MR虚拟直播实例(混合现实直播)

MR虚拟直播带来的内容、体验和互动的升级&#xff0c;对多个行业、场景具有重大意义&#xff0c;尤其是在汽车、科技、带货、活动等对视觉呈现要求更高的行业和场景中&#xff0c;将会重塑用户的观看体验&#xff0c;​高效赋能企业业务增长​。随着用户对直播体验的需求、企业…

Learning C++ No.29 【右值引用实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/7/9:39&#xff0c;上午有课&#xff0c;且今天是周三&#xff0c;承接之前博客&#xff0c;今天我又去帮我舍友签到早八&#xff0c;但愿这次不会被发现吧&#xff01;嘻嘻嘻&#xff01;并且刚刚发文有关对C11相关知识&#xf…

Day_47选择排序

目录 一. 选择排序的实现 1. 简单选择排序 2. 性能分析 二. 代码实现 1. 核心代码 三. 代码展示 四. 数据测试 五. 总结 一. 选择排序的实现 1. 简单选择排序 选择排序的基本思想是&#xff1a;每一趟&#xff08;如第i趟&#xff09;在后面n-i1&#xff08;i1,2,3...n-1&a…

Java 面试题:Spring,Spring MVC,Spring Boot 之间什么关系?

来&#xff0c;先和我看张图&#xff1a; Spring全家桶了为了解决不同场景的问题&#xff0c;逐渐演化出多套生态环框&#xff0c;如&#xff1a;Spring、SpringMVC、SpringBoot、SpringCloud。 Spring MVC和Spring Boot都属于Spring&#xff0c;Spring MVC是基于Spring的一个…

【每日算法】【168. Excel表列名称】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

Vue-ECharts使用说明

Vue-ECharts使用说明 vue-echarts 是在Apache Echarts官网的echarts使用方法上二次封装的组件&#xff0c;方便我们创建echarts图应用到我们的项目中。 参考&#xff1a; vue-echarts 官网&#xff1a;https://github.com/ecomfe/vue-echarts Apache Echarts 官网&#xff1a;h…

推荐一款比Flink CDC更好用的免费CDC工具

很多中大型企业都希望选择一款足够轻量好用的CDC工具&#xff0c;而且最好是小白用户都能使用的CDC工具&#xff0c;今天就推荐一款小白都能安装并立即使用的CDC工具给大家。 CDC&#xff08;Change Data Capture&#xff09;是一种用于捕获和传递数据库实时变更的技术。它允许…

怎样通过大数据获客?

零售商知道他们需要大数据&#xff0c;并且正在向前冲锋以进入游戏。但许多零售商继续面临挑战。应该收集什么类型的数据&#xff1f;应如何使用数据来生成见解&#xff1f;如何衡量投资回报率&#xff1f; 101data最近对美国各种规模的零售商进行了调查。当被问及哪些流程将受…

YOLOv5/v7 添加注意力机制,30多种模块分析②,BAM模块,CBAM模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、BAM模块1、BAM模块的原理2、实验结果3、应用示例 三、CBAM模块1、CBAM模块的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xf…

测试之路-我曾经跨过无数Bug,也怼过各大佬开发

前言&#xff1a; 这是我从事测试的第五个年头的开端&#xff0c;忙忙碌碌到头发现好像忙了个寂寞。也忘了最初走向这条不归路的初心是什么。当时14年学完计算机出来找工作&#xff0c;看着茫茫人海&#xff0c;第一反应就是退缩&#xff0c;该找什么工作&#xff1f;开发&…

sparkSQL的使用

sparksql只能处理结构化数据 基于rdd构建dataframe对象 from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerTypeif __name__ __main__:spark SparkSession.builder.appName(test).master(local[*]).getOrCreate()sc spa…

JS-Object无序问题

1、 背景 在开发图表功能时&#xff0c;由于历史原因&#xff0c;后端返回的图表数据如下&#xff1a; 是对象类型&#xff0c;键为日期&#xff0c;值为日期和当天日期的值。在H5端、微信小程序端运行结果正常&#xff0c;结果到了百度小程序突然发现&#xff0c;这个值的顺…

IDEA2021.1.3版本lombok插件--代码爆红问题解决

最近&#xff0c;突然心血来潮将自己工作中开发使用的idea升级到2021.1.3版本&#xff0c;安装成功后&#xff0c;打开代码发现有关get、set方法全部爆红&#xff0c;不用想&#xff0c;肯定是Lombok插件问题&#xff0c;通过setting->plugin里面搜索Lombok居然不存在&#…

终于有人把Linux系统收发网络数据包的过程讲清楚了!

Linux 服务器收到网络数据包&#xff0c;需要经过哪些处理&#xff0c;一步步将数据传给应用进程的呢&#xff1f;应用进程发送数据包时&#xff0c;Linux 又是如何操作将数据包发送出去的呢&#xff1f;今天我们就来聊聊这个话题。 在准备好接收网络数据包之前&#xff0c;Lin…

Mysql数据库入门基础篇--sql语句简单使用

Mysql数据库入门基础篇--sql语句简单使用 &#x1f53b;一、数据库创建、删除、选择1.1 &#x1f343; create database 创建数据库1.2 &#x1f343; 使用 mysqladmin 创建数据库1.3 &#x1f343; drop 命令删除数据库--一般不建议在数据库执行delete、drop等命令1.4 &#x…

redis入门学习

redis基本数据结构 redis的返回值 在设置一个key-value对的时候通常会返回ok告诉我们操作成功了&#xff0c;1代表成功&#xff0c;0代表失败&#xff0c;通常会根据返回值的不同处理不同的业务逻辑用redis.cn来查看命令 全局操作 flushdb清空内存数据库keys *展示所有存储…

第十八章:MySQL8其他新特性

第十八章&#xff1a;MySQL8其他新特性 18.1&#xff1a;MySQL8新特性概述 ​ MySQL从5.7版本直接跳跃发布了8.0版本 &#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&#xff0c;开发者对MySQL的源代码进行了重构&#xff0c;最突出…

2023-06-08 Unity AssetBundle1——AB包介绍与使用

文章目录 一、AB 包介绍二、AB 包资源打包&#xff08;一&#xff09;导入 AB 包&#xff08;二&#xff09;将资源关联 AB 包&#xff08;三&#xff09;打包参数选项&#xff08;四&#xff09;打包结果&#xff08;五&#xff09;AB 包信息 三、加载 AB 包资源&#xff08;一…

如何让访问者能更快地加载出你的网站?

​  在当今互联网时代&#xff0c;网站已成为人们获取信息、交流互动、进行商业活动等的主要场所之一。然而&#xff0c;由于网络环境的复杂性和不确定性&#xff0c;用户在访问网站时常常会遇到访问缓慢、卡顿等问题&#xff0c;从而影响了用户的使用体验。为了让用户更快地…