深入理解Java面向对象:类与对象、匿名对象、成员变量与局部变量

第一章 类和对象

1. 面向对象的介绍

  • 面向对象编程的核心思想:将现实世界的事物抽象为程序中的类和对象,强调数据和行为的封装。

  • 面向对象与面向过程的对比

    • 面向过程关注 “过程” 和 “步骤”,适合简单任务。

    • 面向对象关注 “对象” 和 “行为”,更贴合现实世界建模。

  • 面向对象的三大特性:封装、继承、多态。

2. 类和对象

2.1 类 (实体类) _class

  • 定义:
    类是对一类事物的抽象,描述其共有的属性和行为。
    定义类的基本语法:

    public class ClassName {// 属性 (成员变量)数据类型 属性名;// 方法返回类型 方法名(参数列表) {// 方法体}
    }
    
  • 类的组成部分

    1. 属性(成员变量):描述这一类事物的特性。
      • 定义位置:类中,方法外。
      • 作用范围:作用于当前类的所有非静态方法和代码块。
      • 定义格式数据类型 变量名;
      • 默认值
        • 整数类型:0
        • 浮点类型:0.0
        • 字符类型:'\u0000'
        • 布尔类型:false
        • 引用类型:null
    2. 行为(成员方法):描述这一类事物可以执行的操作。
    3. 定义方法的方式:去掉方法中的 static ,其余保持不变。
    4. 构造器:用于创建对象并初始化属性。
    5. 内部类:定义在类内部的类,可以分为静态内部类和非静态内部类。
    6. 静态成员:使用 static 修饰的属性或方法,可以直接通过类名访问。

2.2 对象

1. 概述

对象是类的实例化,是类的具体体现。一个类可以通过创建多个对象,每个对象都拥有类定义的属性和行为。

2. 如何创建对象

创建对象的语法格式:

类名 对象名 = new 类名();

例如:

Person person = new Person();  // 创建一个 Person 类的对象
3. 使用对象
  • 成员访问:
    使用对象名 + . 来访问对象的成员(属性和方法):

    对象名.成员变量;
    对象名.方法名();
    

    例如,创建一个 Person 对象,并访问其成员:

    person.name = "Hello Java !";  // 访问并修改属性
    person.age = 24;      
    person.method01();         // 调用方法method01
    person.method02();         // 调用方法method02
    
4. 类和对象的关系
  • :是对一类事物的抽象,定义了该类事物的属性和行为。
  • 对象:是类的实例化,每个对象都具有类定义的属性和行为。
5. 导包
  • 如果两个类在同一个包下,互相使用成员时不需要导包
  • 如果两个类不在同一个包下,想要使用对方的成员,需要导包。可以通过 import 语句导入类:
    import 包名.类名;
    
  • 特殊包:java.lang 包中的类(如 StringSystem 等)不需要显式导入。
6. 代码示例

同一包内的两个类
Java类: Person.java

// Person类:定义了属性和行为
public class Person {// 属性(成员变量)String name;int age;// 行为(成员方法)public void method01() {System.out.println("行为一");}public void method02() {System.out.println("行为二");}
}

Java类: DemoPerson.java

// DemoPerson类:用来创建Person对象并调用其成员
public class DemoPerson {public static void main(String[] args) {// 创建一个 Person 对象Person person = new Person();// 访问并打印属性值(默认值)System.out.println(person.name);  // nullSystem.out.println(person.method02);   // 0// 修改属性值person.name = "Hello Java !";person.age = 24;// 打印修改后的属性值System.out.println(person.name);  // Hello Java !System.out.println(person.age);   // 24// 调用对象的方法person.method01();   // 行为一person.method02();   // 行为二}
}

3. 匿名对象的使用

定义:匿名对象是没有引用变量指向的对象,常用于一次性调用。

(1)什么是匿名对象?

匿名对象是指在 Java 中没有显式声明对象变量的对象。换句话说,匿名对象就是没有名字的对象,只在创建时立即使用。与普通对象不同,匿名对象通常没有引用变量来存储对象的引用,因此它们不能被多次引用或访问。

匿名对象的创建通常通过 new 关键字来实例化类,但没有给它指定变量名。

new 类名();  // 匿名对象的创建

(2) 匿名对象的示例

假设我们有一个 Person 类:

public class Person {String name;int age;// 方法:展示个人信息public void showInfo() {System.out.println("Name: " + name + ", Age: " + age);}
}

使用匿名对象来创建并直接调用 showInfo() 方法:

public class Test {public static void main(String[] args) {// 创建匿名对象并直接调用方法new Person().showInfo();}
}

在这个例子中,我们没有为 Person 对象指定变量名,而是直接在创建对象后调用了 showInfo() 方法。匿名对象直接用在方法调用中,创建之后立刻使用,并且在使用完之后就会被销毁。

(3)匿名对象的使用场景

匿名对象常见于以下几种场景:

  • 简化代码:当不需要反复引用对象时,可以使用匿名对象来减少代码量。
  • 仅用于方法调用:如果对象只是为了调用某个方法,且无需后续使用,可以直接使用匿名对象。
  • 临时对象:匿名对象在程序中只使用一次,一旦方法调用完成,对象就没有任何引用,因此它会被垃圾回收。
① 匿名对象用于方法调用

匿名对象可以用在方法参数中,传递给方法,避免了为对象创建额外的变量。

public class Test {public static void main(String[] args) {// 传递匿名对象给方法printPerson(new Person());}public static void printPerson(Person person) {person.showInfo();}
}

在这个例子中,new Person() 是匿名对象,它被传递给 printPerson 方法。无需在主方法中声明一个变量来存储该对象。

② 匿名对象用于事件监听器

匿名对象常常用于事件监听器的实现。例如,在图形界面编程(如 Swing)中,我们可以直接在事件源(如按钮)上使用匿名对象来处理事件:

import java.awt.*;
import java.awt.event.*;public class ButtonTest {public static void main(String[] args) {Frame frame = new Frame("匿名对象示例");Button button = new Button("点击我");// 使用匿名对象处理按钮点击事件button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("按钮被点击了");}});frame.add(button);frame.setSize(300, 200);frame.setVisible(true);}
}

在这个例子中,我们没有为 ActionListener 创建一个单独的类或对象,而是直接创建了一个匿名对象来处理按钮点击事件。

(4)匿名对象的优缺点

① 优点
  • 减少代码量:使用匿名对象可以避免声明和定义不必要的变量,代码更简洁。
  • 提高代码可读性:当对象只使用一次时,直接使用匿名对象能使代码更直观,减少冗余。
  • 提高开发效率:在不需要对象引用的情况下,使用匿名对象能快速实现某些操作,避免了多余的类和变量定义。
② 缺点
  • 不可重复使用:由于匿名对象没有显式的引用变量,它们只能在创建时使用一次,不能重复引用。如果需要多次操作该对象,必须重新创建对象。
  • 难以调试:匿名对象没有名称,这使得在调试时追踪对象和其状态可能更加困难。

(5)匿名对象与普通对象的比较

特点普通对象匿名对象
是否有名称有名称无名称
使用方式可通过变量名多次访问只能访问一次
代码清晰度需要额外的变量声明代码简洁,减少不必要的声明
内存占用需要存储变量的引用不需要存储引用,直接创建并销毁

(6) 结论

匿名对象是 Java 中不需要命名的对象,通常通过 new 关键字创建,适用于临时任务或方法调用。它们简化代码,特别是当对象只使用一次时。常见的应用场景包括事件监听和方法调用。匿名对象能有效减少代码量、提高开发效率。但由于无法重复使用且调试较为困难,实际开发中应根据具体情况权衡使用。

⭐匿名对象无法重复使用,适合简单逻辑

4. 一个对象的内存图

在 Java 中,每次创建一个对象时,JVM 会在 堆内存 中为该对象分配空间。每个对象的内存分配包含多个部分:

  • 对象头:存储对象的元数据(如类型信息、GC 信息等)。
  • 实例数据:对象的实例变量(属性),这些值根据类的定义不同而有所不同。
  • 对齐填充:根据虚拟机的要求,内存中的某些字段可能需要填充一定的字节数,以保持内存对齐。

内存图示例
假设我们有一个简单的 Person 类,其中有两个成员变量:nameage

public class Person {String name;int age;
}

当我们创建一个 Person 对象时,内存分布如下所示:

+--------------------+
|       对象头        |   <- 存储该对象的元信息(如对象类型、GC信息等)
+--------------------+
|    name(引用类型)  |   <- 这里存储的是 `name` 的引用(即指向 `name` 对象的内存地址)
+--------------------+
|    age (基本类型)  |   <- 这里存储的是 `age` 的值
+--------------------+

对象的生命周期:

  • 当对象创建时,JVM 会在堆内存中分配一块内存空间。
  • 当对象不再被使用时,垃圾回收器会回收这块内存空间,释放资源。

5. 两个对象的内存图

如果我们创建多个对象,每个对象都会在堆内存中独立分配内存空间。即使它们属于同一个类,每个对象都有自己的实例数据。

假设我们创建两个 Person 对象:

Person person1 = new Person();
Person person2 = new Person();

内存图将如下所示:

+--------------------+         +--------------------+
|       对象头        |         |       对象头        |
+--------------------+         +--------------------+
|    name(引用类型)  |         |    name(引用类型)  |
+--------------------+         +--------------------+
|    age (基本类型)  |         |    age (基本类型)  |
+--------------------+         +--------------------+person1                        person2

在这种情况下,person1person2 是两个独立的对象,它们各自拥有自己独立的内存区域,存储着不同的 nameage 数据。

6. 两个对象指向同一块内存空间

如果我们让两个对象引用同一个对象实例,内存图就会有所不同。在这种情况下,两个变量会共享同一块堆内存区域。

Person person1 = new Person();
Person person2 = person1;  // person2 引用 person1,指向同一个对象

内存图如下所示:

+--------------------+
|       对象头        |   <- 共享的对象头,两个引用指向同一个对象
+--------------------+
|    name (引用类型) |
+--------------------+
|    age (基本类型)  |
+--------------------+|           ||           |
person1      person2

此时,person1person2 都指向同一个 Person 对象,它们共享相同的内存空间。因此,修改 person1 的属性,person2 也会看到这些变化。

代码示例
让我们通过一些简单的代码示例来加深理解。

一个对象的内存图:

public class Person {String name;int age;
}public class Test {public static void main(String[] args) {Person person1 = new Person();  // 创建一个对象person1.name = "Alice";person1.age = 25;}
}

两个对象的内存图:

public class Test {public static void main(String[] args) {Person person1 = new Person();  // 创建第一个对象Person person2 = new Person();  // 创建第二个对象person1.name = "Alice";person2.name = "Bob";}
}

两个对象指向同一块内存:

public class Test {public static void main(String[] args) {Person person1 = new Person();  // 创建一个对象Person person2 = person1;  // person2 引用 person1 指向同一个对象person1.name = "Alice";System.out.println(person2.name);  // 输出 Alice,因为 person2 和 person1 是同一个对象}
}

第二章. 成员变量和局部变量的区别

在 Java 编程中,成员变量和局部变量是两种常见的变量类型。它们在作用范围、内存分配和生命周期等方面有很大不同。理解这些区别对编写高效、清晰的代码至关重要。

1. 定义位置

  • 成员变量:定义在类中方法外部,属于类的实例或静态类。
  • 局部变量:定义在方法内部或者方法的参数列表中,仅在方法内部有效。
public class Example {// 成员变量int memberVar;public void method() {// 局部变量int localVar = 10;}
}

2. 初始化值

  • 成员变量:有默认值。例如,int 类型的成员变量默认值为 0boolean 类型的成员变量默认值为 falseObject 引用类型的成员变量默认值为 null
  • 局部变量:没有默认值,必须在使用前显式赋值,否则编译器会报错。
public class Example {// 成员变量int memberVar;  // 默认值为 0public void method() {// 局部变量int localVar;  // 没有默认值,必须赋值才能使用// System.out.println(localVar); // 编译错误,localVar 未初始化}
}

3. 作用范围

  • 成员变量:作用于整个类,可以被该类的所有方法访问。
  • 局部变量:只在其所在的方法或构造函数中有效,方法执行完毕后,局部变量会被销毁,其他方法无法访问。
public class Example {// 成员变量int memberVar;public void method1() {// 局部变量int localVar = 10;System.out.println(localVar);  // 可用}public void method2() {// System.out.println(localVar);  // 编译错误,localVar 在 method2 中不可用}
}

4. 内存位置

  • 成员变量:存储在堆内存中,随着对象的创建而存在,随着对象的消失而消失。
  • 局部变量:存储在栈内存中,随着方法的调用而存在,方法调用结束后即被销毁。

在上面的代码中,memberVar 存储在堆内存中,而 localVar 存储在栈内存中。

public class Example {// 成员变量int memberVar;public void method() {// 局部变量int localVar = 10;}
}

5. 生命周期

  • 成员变量:在对象创建时被分配内存,并且随着对象的生命周期而存在。当对象销毁时,成员变量也会被销毁。
  • 局部变量:在方法被调用时创建,在方法调用结束时销毁。局部变量的生命周期仅限于方法调用期间。

在这个例子中,memberVar 会随着 Example 类的对象创建和销毁而存在,而 localVar 只在 method() 方法执行时存在。

public class Example {// 成员变量int memberVar;public void method() {// 局部变量int localVar = 10;}
}

6. 结论

  • 定义位置:成员变量定义在类中,局部变量定义在方法中。
  • 初始化值:成员变量有默认值,局部变量没有默认值。
  • 作用范围:成员变量在整个类中可见,局部变量只在方法中可见。
  • 内存位置:成员变量在堆内存中,局部变量在栈内存中。
  • 生命周期:成员变量的生命周期与对象相同,局部变量的生命周期与方法相同。

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

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

相关文章

利用webworker解决性能瓶颈案例

目录 js单线程的问题webworker的基本使用webworker的常见应用可视化优化导出Excel js单线程的问题 众所周知&#xff0c;js不擅长计算&#xff0c;计算是同步的&#xff0c;大规模的计算会让js主线程阻塞&#xff0c;导致界面完成卡死。比如有一个600多亿次的计算&#xff0c;…

【数据结构05】排序

系列文章目录 【数据结构05】排序 . 【算法思想04】二分查找 文章目录 系列文章目录[toc] 1. 基本思想与实现1.1 插入类排序1.1.1 直接插入排序&#xff08;*&#xff09;1.1.2 折半插入排序1.1.3 希尔排序&#xff08;*&#xff09; 1.2 交换类排序1.2.1 冒泡排序&#xff08…

数据挖掘——概论

数据挖掘——概论 数据、信息和知识的关联和联系数据挖掘数据挖掘定义数据挖掘的步骤数据挖掘的主要内容 数据、信息和知识的关联和联系 数据、信息和知识是知识工作者感知和认识客观事物的3个连贯的阶段。 数据无处不在&#xff0c;聚合/集成后转化为信息&#xff0c;结构化后…

Hello 2025

Hello 2025 A. MEX Table 题意&#xff1a; 给出 0 到 n ∗ m − 1 的数字&#xff0c;排列成 n m 的表格&#xff0c;最大化 ∑ i 1 n mex ⁡ ( { a i , 1 , a i , 2 , … , a i , m } ) ∑ j 1 m mex ⁡ ( { a 1 , j , a 2 , j , … , a n , j } ) 给出0到n*m-1的数字&…

[答疑]用例规约:系统请求3dsMax创建体块

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2024-12-22 12:39 潘老师&#xff0c;请教一个问题&#xff1a;在需求工作流书写系统用例规约时&#xff0c;这个“计算”&#xff08;改变&#xff09;可不可以写多个内容&…

第431场周赛:最长乘积等价子数组、计算字符串的镜像分数、收集连续 K 个袋子可以获得的最多硬币数量、不重叠区间的最大得分

Q1、最长乘积等价子数组 1、题目描述 给你一个由 正整数 组成的数组 nums。 如果一个数组 arr 满足 prod(arr) lcm(arr) * gcd(arr)&#xff0c;则称其为 乘积等价数组 &#xff0c;其中&#xff1a; prod(arr) 表示 arr 中所有元素的乘积。gcd(arr) 表示 arr 中所有元素的…

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案&#xff0c;旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能&#xff0c;如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好&#xff0c;让用户能够轻松选择所需的商品或服务&…

Uniapp Android 本地离线打包(详细流程)

一、简介 App 离线 SDK 暂时不支持 Kotlin&#xff0c;未来不清楚。 uniapp 提供了 云打包 与 本地打包 两种方案&#xff0c;云打包 需要排队且还有次数限制&#xff0c;本地打包 则就没有这些限制&#xff0c;而且会 本地打包 对开发 原生插件 有很大的帮助。 细节&#x…

GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线

文章目录 零、前言一、授权码登录体验优化&#xff1a;一步直达聊天界面二、全新“项目”功能&#xff1a;让工作更有条理三、语音功能升级&#xff1a;全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 亲爱的用户&…

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

一、引言 本文对MPEG2-PS格式进行简介。 进行简介之前&#xff0c;请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的&#xff0c;ISO/IEC是付费的&#xff0c;所以我们主要阅读ITU提供的官方文档&#xff0c;比如较新…

概述(讲讲python基本语法和第三方库)

我是北子&#xff0c;这是我自己写的python教程&#xff0c;主要是记录自己的学习成果方便自己日后复习&#xff0c; 我先学了C/C&#xff0c;所以这套教程中可能会将很多概念和C/C去对比&#xff0c;所以该教程大概不适合零基础的人。 it seems that python nowadays 只在人工…

Java jni调用nnom rnn-denoise 降噪

介绍&#xff1a;https://github.com/majianjia/nnom/blob/master/examples/rnn-denoise/README_CN.md 默认提供了一个wav的例子 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h>#include …

【软考网工笔记】计算机基础理论与安全——网络规划与设计

HFC 混合光纤同轴电缆网 HFC: Hybrid Fiber - Coaxial 的缩写&#xff0c;即混合光纤同轴电缆网。是一种经济实用的综合数字服务宽带网接入技术。 HFC 通常由光纤干线、同轴电缆支线和用户配线网络三部分组成&#xff0c;从有线电视台出来的节目信号先变成光信号在干线上传输…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件&#xff0c;新建文件或项目。如果要写一个GUI程序&#xff0c;应当选择Application&#x…

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…

数据仓库中的指标体系模型介绍

数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI&#xff08;关键绩效指标&#xff09;模型5. 主题域模型6.平衡计分卡&#xff08;BSC&#xff09;模型7.数据指标框架模…

2025元旦源码免费送

我们常常在当下感到时间慢&#xff0c;觉得未来遥远&#xff0c;但一旦回头看&#xff0c;时间已经悄然流逝。对于未来&#xff0c;尽管如此&#xff0c;也应该保持一种从容的态度&#xff0c;相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…

2025年Stable Diffusion安装教程(超详细)

StableDiffusion的安装部署其实并不困难&#xff0c;只需简单点击几下&#xff0c;几分钟就能安装好&#xff0c;不管是windows还是苹果mac电脑&#xff0c;关于StableDiffusion的各种安装方式&#xff0c;这片文章一一来给大家讲明白。&#xff08;所有安装资料都给大家整理好…

【openwrt】OpenWrt 路由器的 802.1X 动态 VLAN

参考链接 [OpenWrt Wiki] Wi-Fi /etc/config/wirelesshttps://openwrt.org/docs/guide-user/network/wifi/basic#wpa_enterprise_access_point 介绍 基于802.1X 无线网络身份验证࿰