07-面向对象编程(基础部分)

学习java最核心最重要的就是要理解面向对象

1. 类与对象

1.1 介绍

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

对象是具体的,实际的,代表一个具体事物,,是实例,具体的张三、李四、小花猫、大黄狗。

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

1.2 类和对象的内存分配机制

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

2. 成员方法 

人类:除了有一些属性外(年龄,姓名...),人类还有一些行为,比如:说话、跑步、玩游戏、听音乐,这些就要用成员方法才能完成。

class Person {// 属性String name;int age;// 方法(成员方法)//1. public 表示方法是公开//2. void : 表示方法没有返回值//3. speak() : speak 是方法名, () 形参列表//4. {} 方法体,可以写我们要执行的代码public void speak() {System.out.println("我今天真的有好好吃饭!");}
}

好处

  • 提高代码的复用性
  • 可以将实现的细节封装起来,然后供其它用户来调用

3. 成员方法传参机制

3.1 基本数据类型的传参机制

示例

public static void main(String[] args) {int a = 10;int b = 20;// 创建 AA 对象 名字 objAA obj = new AA();obj.swap(a, b); //调用 swapSystem.out.println("main 方法 a=" + a + " b=" + b);//a=10 b=20
}class AA {public void swap(int a,int b){System.out.println("\na 和 b 交换前的值\na=" + a + "\tb=" + b);//a=10 b=20// 完成了 a 和 b 的交换int tmp = a;a = b;b = tmp;System.out.println("\na 和 b 交换后的值\na=" + a + "\tb=" + b);//a=20 b=10}
}

结论:

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

3.2 引用数据类型的传参机制

B 类中编写一个方法 test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

B 类中编写一个方法 test200,可以接收一个 Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否会变化?

public class MethodParameter02 {public static void main(String[] args) {// 测试1// B b = new B();// int[] arr = {1, 2, 3};// b.test100(arr);//调用方法// System.out.println(" main 的 arr 数组 ");// //遍历数组// for(int i = 0; i < arr.length; i++) {//     System.out.print(arr[i] + "\t");// }// System.out.println();// 测试2Person p = new Person();p.name = "jack";p.age = 10;b.test200(p);//测试题, 如果 test200 执行的是 p = null ,下面的结果是 10//测试题, 如果 test200 执行的是 p = new Person();..., 下面输出的是 10System.out.println("main 的 p.age=" + p.age);//10000}
}class Person {String name;int age;
}class B {public void test200(Person p) {//p.age = 10000; //修改对象属性//思考p = new Person();p.name = "tom";p.age = 99;//思考//p = null;}//B 类中编写一个方法 test100,//可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化public void test100(int[] arr) {arr[0] = 200;//修改元素//遍历数组System.out.println(" test100 的 arr 数组 ");for(int i = 0; i < arr.length; i++) {System.out.print(arr[i] + "\t");}System.out.println();}
}

结论:

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

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

1)编写类 MyTools 类,编写一个方法可以打印二维数组的数据。

2)  编写一个方法 copyPerson,可以复制一个 Person 对象,返回复制的对象。克隆对象, 注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同

public class MethodExercise02 {public static void main(String[] args) {Person p = new Person();p.name = "milan";p.age = 100;//创建 toolsMyTools tools = new MyTools();Person p2 = tools.copyPerson(p);//到此 p 和 p2 是 Person 对象,但是是两个独立的对象,属性相同System.out.println("p 的属性 age=" + p.age + " 名字=" + p.name);System.out.println("p2 的属性 age=" + p2.age + " 名字=" + p2.name);//这里老师提示: 可以同 对象比较看看是否为同一个对象System.out.println(p == p2);//false}
}class Person {String name;int age;
}class MyTools {//编写一个方法 copyPerson,可以复制一个 Person 对象,返回复制的对象。克隆对象//注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同//编写方法的思路//1. 方法的返回类型 Person//2. 方法的名字 copyPerson//3. 方法的形参 (Person p)//4. 方法体, 创建一个新对象,并复制属性,返回即可public Person copyPerson(Person p) {//创建一个新的对象Person p2 = new Person();p2.name = p.name; //把原来对象的名字赋给 p2.namep2.age = p.age; //把原来对象的年龄赋给 p2.agereturn p2;}
}

4. 方法重载

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

  • calculate(int n1, int n2)  // 两个整数的和
  • calculate(int n1, double n2)  // 一个整数,一个 double 的和
  • calculate(double n2, int n1) // 一个 double ,一个 Int 和

5. 可变参数

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

语法

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

代码示例

public class VarParameter01 {public static void main(String[] args) {HspMethod m = new HspMethod();System.out.println(m.sum(1, 5, 100)); //106System.out.println(m.sum(1,19)); //20}
}class HspMethod {public int sum(int... nums) {int res = 0;for(int i = 0; i < nums.length; i++) {res += nums[i];}return res;}
}

注意:

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

6. 作用域

基本使用

  • 全局变量:也就是属性变量,作用域为整个类体。
  • 局部变量:除了属性之外的其它变量,作用域为定义它的代码块中。

全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值。

注意事项

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

7. 构造方法/构造器

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

public class Constructor01 {public static void main(String[] args) {//当我们 new 一个对象时,直接通过构造器指定名字和年龄Person p1 = new Person("smith", 80);System.out.println("p1 的信息如下");System.out.println("p1 对象 name=" + p1.name);//smithSystem.out.println("p1 对象 age=" + p1.age);//80}
}//在创建人类的对象时,就直接指定这个对象的年龄和姓名
class Person {String name;int age;//构造器//1. 构造器没有返回值, 也不能写 void//2. 构造器的名称和类 Person 一样//3. (String pName, int pAge) 是构造器形参列表,规则和成员方法一样public Person(String pName, int pAge) {System.out.println("构造器被调用~~ 完成对象的属性初始化");name = pName;age = pAge;}
}

注意:

  • 一个类可以定义多个不同的构造器,即构造器重载(如,定义一个构造器,用来创建对象的时候,只指定人名,不指定年龄)。
  • 构造器名和类名要相同。
  • 构造器没有返回值。
  • 构造器是完成对象的初始化,并不是创建对象
  • 在创建对象时,系统自动的调用该类的构造方法。
  • 如果没有定义构造器,系统会自动给类生成一个默认的无参构造器(也叫默认构造器)。
  • 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下。

8. 对象创建的流程分析

class Person {int age;String name;Person(int dAge, String dName) {name = dName;age = dAge;}
}Person p = new Person("18", "李嘉图");

流程分析:

  1. 加载Person类信息(Person.class),只会加载一次。
  2. 在堆中分配空间(地址)。
  3. 完成对象的初始化(构造器的初始化,age = 18,name = 李嘉图)。
  4. 把对象在堆中的地址(引用),返回给p。

从JVM角度:

  1. 加载类:首先,JVM需要加载对象所属的类。这涉及到查找类文件(.class文件或.jar文件),然后将其加载到JVM的内存中。加载类是由类加载器(ClassLoader)完成的。

  2. 链接:链接包含三个阶段:验证、准备和解析。

    • 验证:验证被加载的类文件是否符合JVM规范,例如文件格式、字节码等。
    • 准备:为类的静态变量分配内存,并将其初始化为默认值(例如,对于int类型的静态变量,默认值为0)。
    • 解析:将符号引用转换为直接引用。
  3. 初始化:初始化类的静态变量和静态代码块。这一步是由JVM执行的,而不是由类的构造器执行的。

  4. 创建对象:一旦类被加载、链接和初始化,就可以创建该类的对象了。在堆内存中分配对象所需的内存,并调用相应的构造器来初始化对象的实例变量。对象的内存分配涉及到垃圾回收的问题,所以Java的对象内存管理相对复杂。

  5. 返回引用:对象的引用(或指针)被返回给调用者,调用者可以使用这个引用来访问和操作对象的实例变量和方法。

9. this 关键字

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

public Person(String name, int age){//this.name 就是当前对象的属性 namethis.name = name;//this.age 就是当前对象的属性 agethis.age = age;
}

this图解

 this使用注意:

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

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

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

相关文章

Leetcode227. 基本计算器 II

Every day a Leetcode 题目来源&#xff1a;227. 基本计算器 II 解法1&#xff1a;单栈模拟 因为没有括号&#xff0c;所以可以简化成单栈。 代码&#xff1a; class Solution { public:int calculate(string s){vector<int> nums;char preSign ;int num 0;int n …

Android 系统版本与SDK API对应关系-2024.5

官网地址&#xff1a;https://developer.android.google.cn/tools/releases/platforms?hlth

经典分类网络LeNet5和VGG16项目:实现CIFAR10分类

CIFAR10分类 v1&#xff1a;LeNet5&#xff1a;2cnn3fc 可视化结果 精确率 损失 最佳 v2&#xff1a;LeNet5&#xff1a;3cnn2fc 可视化结果 精确率 损失 最佳 v3&#xff1a;LeNet5&#xff1a;2cnnbnres3fc 可视化结果 精确率 损失 最佳 v4&#xff1a;VG…

Sarcasm detection论文解析 |基于语义知识和辅助信息增强讽刺检测方法

论文地址 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0306457322000139?via%3Dihub 论文首页 笔记框架 基于语义知识和辅助信息增强讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Information Processing & Managem…

如何把公章盖在电子档文件上?

将公章盖在电子档文件上&#xff0c;尤其是确保其法律效力和安全性&#xff0c;通常涉及以下步骤&#xff1a; 准备工作 获取合法的电子公章&#xff1a;确保你拥有公司或机构正式授权的电子公章图像&#xff0c;且该图像经过了必要的加密或数字签名处理&#xff0c;以确保其…

使用海外云手机为亚马逊店铺引流

在全球经济一体化的背景下&#xff0c;出海企业与B2B外贸企业愈发重视海外市场的深耕&#xff0c;以扩大市场份额。本文旨在探讨海外云手机在助力亚马逊店铺提升引流效果方面的独特作用与优势。 海外云手机&#xff0c;一种基于云端技术的虚拟手机&#xff0c;能够在单一硬件上…

let命令

let 命令 let 与 var 二者区别&#xff1a; 作用域不同&#xff1a;变量提升&#xff08;Hoisting&#xff09;&#xff1a;临时性死区重复声明&#xff1a; 联系&#xff1a;举例说明&#xff1a; 块级作用域 块级作用域的关键字使用 var&#xff08;无块级作用域&#xff09;…

JavaScript手写专题——图片懒加载、滚动节流、防抖手写

图片懒加载场景&#xff1a;在一些图片量比较大的网站&#xff08;比如电商网站首页&#xff0c;或者团购网站、小游戏首页等&#xff09;&#xff0c;如果我们尝试在用户打开页面的时候&#xff0c;就把所有的图片资源加载完毕&#xff0c;那么很可能会造成白屏、卡顿等现象&a…

ICode国际青少年编程竞赛- Python-2级训练场-range函数

ICode国际青少年编程竞赛- Python-2级训练场-range函数 1、 for i in range(4):Dev.turnLeft()Dev.step(i 1)2、 for i in range(4):Spaceship.step(i 1)Spaceship.turnRight()3、 for i in range(4):Spaceship.step(i 1)Dev.step(2)Dev.step(-2)4、 for i in range(1, 5)…

【深度学习】【Lora训练2】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、如何为图片打标1.1. 打标工具1.1.1. 秋叶中使用的WD1.41.1.2. 使用BLIP21.1.3. 用哪一种 二、 Lora训练数据的要求2.1 图片要求2.2 图片的打标要求 三、 Lora的其他问题qa1qa2qa3qa4qa5 四、 对图片的处理细节4.1. 图片尺寸问题4.2. 图片内容选取问题4.3. 什么是一…

2024年3月份宠物行业线上市场数据分析:市场呈现出精细化、品质化趋势

近些年来&#xff0c;养宠物的家庭越来越多&#xff0c;宠物经济也逐渐衍生开来。宠物经济主要是围绕宠物产生的一整条产业链&#xff0c;包括宠物食品、宠物家居、宠物美容和最近火起来的宠物保险等多个领域。目前随着居民人均收入的提高&#xff0c;宠物市场也得到稳步发展。…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Slider的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 输入类控件 | Slider的使用及说明 文章编号&#xff1a;…

Java | Leetcode Java题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return sl…

查看pytorch与cuda对应版本

查看cuda版本 打开cmd,输入nvidia-smi&#xff0c;即可可以看到cuda的版本了 2. pytorch与cuda版本对应关系 可以参考这篇文章&#xff0c;写的非常详细&#xff1a;https://blog.csdn.net/FL1768317420/article/details/134769203

5. 分布式链路追踪TracingFilter改造增强设计

前言 在4. 分布式链路追踪客户端工具包Starter设计一文中&#xff0c;我们实现了基础的Starter包&#xff0c;里面提供了我们自己定义的Servlet过滤器和RestTemplate拦截器&#xff0c;其中Servlet过滤器叫做HoneyTracingFilter&#xff0c;仅提供了提取SpanContext&#xff0…

WebRTC 客户端状态机

WebRTC 客户端状态机 WebRTC 客户端状态机客户端状态机客户端加入流程图客户端离开流程图端到端连接的基本流程 WebRTC 客户端状态机 客户端状态机 首先我们来看一下客户端的一个状态机&#xff0c;客户端与服务器直接通过信令的一个交互之后自然而然的形成一个状态机&#x…

读天才与算法:人脑与AI的数学思维笔记23_人工智能讲故事

1. 伟大的自动语法分析器 1.1. 思维呆板机械的阿道夫奈普&#xff08;Adolphe Knipe&#xff09;一直想成为一名作家&#xff0c;可是他写出来的东西既迂腐又无趣 1.2. 后来&#xff0c;灵光乍现&#xff0c;他得到了一个启示&#xff1a;语言遵循语法规则&#xff0c;这规则…

【连连国际注册_登录安全分析报告】

连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

OPC :快速上手

本系列为OPC技术的快速上以及持续研究和技术实战专栏&#xff0c;将不定期更新。 本章节提供OPC系列技术博文的快速导航。 《OPC服务器简介和入门介绍》 《物联网平台如何为OPC服务器创造新生命力》 《OPC服务器开发之WtOPCSvr——开发文档&#xff08;1&#xff09;》 《OPC服…

何为基差?股指期货的升水和贴水又怎么理解?

基差是一个金融术语&#xff0c;它指的是现货价格和期货价格之间的差额。在股指期货市场中&#xff0c;现货就是指实际的股票指数&#xff0c;而期货则是基于这个指数未来某个时间点的价格预期。基差可以是正的或负的&#xff0c;具体取决于期货价格是高于还是低于现货价格。 1…