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 …

可以修改linux 文件的所有者吗

是的&#xff0c;你可以修改Linux文件的所有者。这通常是通过chown&#xff08;change owner&#xff09;命令来完成的。以下是使用chown命令的一些示例&#xff1a; 更改文件的所有者&#xff1a; chown new_owner file.txt这条命令会将file.txt的所有者更改为new_owner。 同…

如果数据给的是树形 转好的树形结构并且是有两个二级children的话 该如何写?

第一我们要自己写一个children 并且张数据里面的所要渲染的二级进行赋值 赋给我们新建的children 以下是代码转树形赋值 organ().then(function (res) {console.log(res); // 成功回调// setLists(res.data.data)res.data.data res.data.data.map((obj) > ({...obj, // …

Kafka 面试题(三)

1. 简述什么是 Kafka 的 Broker &#xff1f; Kafka的Broker是Kafka集群中的一个核心组件&#xff0c;扮演着消息代理的角色。它是生产者和消费者之间的中间件&#xff0c;负责接收、存储和分发消息。具体来说&#xff0c;Broker接收来自生产者的消息&#xff0c;并将其持久化…

(十二)C语言的结构体

一.结构体 数组&#xff1a;允许定义可存储相同类型数据项的变量&#xff0c; 结构&#xff1a;另一种用户自定义的可用的数据类型&#xff0c;它允许您存储不同类型的数据项。 特点&#xff1a;结构体中的数据成员可以是基本数据类型&#xff08;如 int、float、char 等&…

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

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

Vue 监控变化watch

1、watch 监控某个定义的属性的值,如果想要深层次的监听则需要定义deep:true 2、监控多层次单个元素使用"b.aa" 3、监控多层次所有的值定义deep:true ******data:{a:true,b:{aa:1,bb:2 }}*****catch:{a:{handler(newavlue,oldvalue){}},//监控b里面的aab.aa:{h…

经典分类网络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…

webpack进阶 -- 自定义Plugin,Loader封装打包优化

介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。在 Webpack 处理应用程序时&#xff0c;它会在内部构建一个依赖图(dependency graph)&#xff0c;这个依赖图对应映射到项目所需的每个模块&#xff0c;并生成一个或多个 bundle。在这个过程中…

Docker-compsoe部署prysm-beacon-chain + geth服务(geth版本v1.14.0)

1、创建目录结构 ~ # mkdir -p /data/docker-compose/eth ~ # cd /data/docker-compose/eth /data/docker-compose/eth# mkdir beacondata eth ethdata prysm2、编写prysm-beacon-chain Dockerfile和启动脚本文件 /data/docker-compose/eth# vim Dockerfile /data/docker-…

Git的系统级设置

一、如何查看当前系统登录的GIt用户信息 1.看全局Git配置文件 cat ~/.gitconfig 2.查看系统级Git配置文件 cat /etc/gitconfig 3.使用Git命令查看配置的用户名和电子邮件地址 git config --global user.name git config --global user.email 4.如果你想查看所有Git配置&…

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第2节 ( 多个接口与方法别名)

11.2.3 多个接口与方法别名 ​ 接口的另一个非常重要的特点是一个类可以实现多个接口。下面的 TAthlete 类就演示了这一点&#xff0c;该类同时实现了 IWalker 和 IJumper 接口&#xff1a; TAthlete class(TInterfacedObject, IWalker, IJumper) privateFJumpImpl: TJumpe…

旅行卡使用秘籍:告别出游烦恼

在现代社会&#xff0c;随着人们生活水平的不断提高&#xff0c;旅游已经成为越来越多人的休闲方式。而为了让旅行更加方便、实惠&#xff0c;各种旅游卡应运而生。然而&#xff0c;很多人在使用旅游卡时&#xff0c;对于其使用规则并不是非常清楚。接下来&#xff0c;我们就来…

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

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

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

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

Centos系统实用运维命令记录(持续更新)

本文记录Centos服务器常用的运维命令&#xff0c;备忘 查询当前内存占用最高(前10)的进程列表和占用比例&#xff0c;进程ID ps -eo pid,comm,%mem,cmd --sort-%mem | head -n 11注: 内存警报时定位问题时非常有用 查询占用某个端口号的进程id lsof -i :9000注: 后面的9000…

Ai绘画工具Stable Diffusion提示词如何使用

Stable Diffusion是一种基于深度学习的AI绘画工具&#xff0c;它可以根据用户提供的提示词&#xff08;prompt&#xff09;生成相应的图像。提示词是引导AI生成图像的关键&#xff0c;正确的使用和调试提示词对于获得满意的结果至关重要。本文将介绍如何使用和调试Stable Diffu…

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…