Java 类与对象(对象的分配机制、对象的创建过程、匿名对象)

news2024/9/28 13:23:53

面向对象

面向对象编程(Object-Oriented Programming 简称 OOP)是一种程序设计思想和编码架构。 Java 是完全面向对象的, 必须熟悉 OOP 才能够编写 Java 程序。

面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自标准库,还有一些是自定义的。在 OOP 中,不必关心对象的具体实现,只要能够满足用户的需求即可。

Alan Kay(面向对象编程思想的创始人之一) 总结了其五大基本特征:

  1. 万物皆对象。可以从要解决的问题身上抽象出概念性的组件,然后在程序中将其表示为一个对象。
  2. **程序是一组对象,通过消息传递来告知彼此该做什么。**要请求调用一个对象的方法,需要向该对象发送消息。
  3. 每个对象都有自己的存储空间,可容纳其他对象。通过封装现有对象,可制作出新型对象。
  4. 每个对象都有一种类型。每个对象都是某个“类”的一个“实例”。一个类最重要的特征就是“能将什么消息发给它?”。
  5. 同一类所有对象都能接收相同的消息。由于类型为“圆”的一个对象也属于类型为“形状”的一个对象,所以一个圆完全能接收发送给”形状”的消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP最重要的概念之一。

一个对象具有自己的状态,行为和标识。这意味着对象有自己的内部数据(提供状态)、方法 (产生行为),并彼此区分(每个对象在内存中都有唯一的地址)。

面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态

类(class)是构造对象的模板或蓝图。 我们可以将类想象成制作小甜饼的切割机,将对 象想象为小甜饼。 由类构造(construct)对象的过程称为创建类的实例(instance)

在类之间, 最常见的关系有:

  • **依赖(uses-a):**依赖(dependence),即“uses-a”关系,是一种最明显的、最常见的关系。如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。应该尽可能地将相互依赖的类减至最少(让类之间的耦合度最小)。
  • **聚合(has-a):**聚合(aggregation),即“has-a” 关系,是一种具体且易于理解的关系。聚合关系意味着类A的对象包含类B的对象。
  • **继承(is-a):**继承(inheritance),即“is-a”关系,是一种用于表示特殊与一般关系的。如果类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能是继承。

抽象

所有编程语言都提供抽象机制。

类与对象

类与对象的关系:

类是对一类事物的描述,是抽象的。可以看做是自定义的数据类型。

对象是一类事物的实例,是具体的

类是对象的模板,对象是类的实体

类的定义格式:

权限修饰符 class 类名 {
    //成员变量
    //成员方法
}

成员变量

**成员变量(属性)**是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。

比如前面定义猫类的int age就是属性。

属性的定义语法同变量,示例:

访问修饰符 属性类型 属性名;

有四种访问修饰符 publicproctected默认private

定义成员变量:

class Cat{
    String name;
    int age;
    String color;
    double weight;
}

访问成员变量:

使用对象访问类中的成员:

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

成员变量的默认值:

属性的定义类型可以为任意类型,包含基本类型或引用类型,引用类型如果不符值,则默认值为null。

数据类型默认值
基本数据类型整型(byte,short,int,long)0
浮点型(float,double)0.0
字符(char)‘\u0000’
布尔(boolean)false
引用数据类型数组,类,接口null

创建对象

在对象与对象变量之间存在着一个重要的区别。一个对象变量并没有实际包含一个对象, 而仅仅引用一个对象。任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用。

Cat cat1 = new Cat();,cat1是对象的名字,new Cat() 是创建对象的空间,是真正的对象。

Date deadline; 
// 定义了一个对象变量deadline, 它可以引用 Date 类型的对象。
// 但是现在还不是一个对象,因为他没有引用到一个对象
// 因此,下面的语句将编译失败
s = deadline.toString();    // 编译失败

// 必须首先初始化变量deadline,才可使用
// 有两种方法:
// 1. 可以用新构造的对象初始化这个变量
deadline = new Date();
// 2. 可以让这个变量引用一个已存在的对象
deadline = birthday;

// 表达式 new Date(),构造了一个Date类型的对象,并且它的值是对新创建对象的引用。
// 这个引用存储在变量 deadline 中。

// 也可以将对象变量设置为 null,表明这个对象变量目前没有引用任何对象。
deadline = null;
// 如果讲一个方法应用于一个值为null的对象上,会产生运行时错误
String s = birthday.toString();    // 此行会报错
public class ObjectDome01 {
    public static void main(String[] args) {

        // 使用面向对象解决
        // 实例化一只猫[创建一个猫的对象]
        /*
        * 1. new Cat(); 创建一只猫的对象
        * 2. Cat cat1 = new Cat(); 将猫的对象赋值给 cat1
        * 3. cat1 就是一个对象
        * */
        Cat cat1 = new Cat();
        cat1.name = "小白";
        cat1.age = 3;
        cat1.color = "白色";
        cat1.weight = 10;
        // 创建第二只猫,并赋值给 cat2
        Cat cat2 = new Cat();
        cat2.name = "小花";
        cat2.age = 100;
        cat2.color = "花色";
        cat2.weight = 20;

        // 使用
        System.out.println("第一只猫信息:" + cat1.name + " " + cat1.age + " " + cat1.color + " " + cat1.weight);
        System.out.println("第二只猫信息:" + cat2.name + " " + cat2.age + " " + cat2.color + " " + cat2.weight);
    }
}

// 使用面向对象解决养猫问题
class Cat{
    // 自定义属性
    String name;
    int age;
    String color;
    double weight;
}

image

对象分配机制、创建的过程

类和对象的内存分配机制
内存分析
一般存放基本数据类型(局部变量)
存放对象(对象、数组等)
方法区常量池(常量、字符串等),类加载信息(类的成员变量和成员方法)
创建对象的简单过程
Person zhangsan = new Person();
zhangsan.name = "张三";
zhangsan.age = 10;

简单分析:

  1. 先加载Person类信息(成员变量和成员方法信息,只会加载一次)
  2. 在堆中分配空间,进行默认初始化,比如name的默认值为nullage的默认值为0
  3. 把该对象在堆中的地址赋给变量zhangsan,此时zhangsan就指向该对象4. 进行指定初始化,比如zhangsan.name = "张三"zhangsan.age = 10

匿名对象

创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。虽然是创建对象的简化写法,但是应用场景非常有限。

**匿名对象 :**没有变量名的对象。

new 类名(参数列表);

**应用场景:**创建匿名对象直接调用方法,没有变量名。

new Scanner(System.in).nextInt();

一个匿名对象,只能使用一次,一旦调用两次方法,就是创建了两个对象,造成浪费。

new Scanner(System.in).nextInt(); 
new Scanner(System.in).nextInt();

匿名对象可以作为方法的参数和返回值

作为参数:

class Test {
    public static void main(String[] args) { 
        // 普通方式
        Scanner sc = new Scanner(System.in); 
        input(sc);
        //匿名对象作为方法接收的参数
        input(new Scanner(System.in));
    }
    public static void input(Scanner sc){
        System.out.println(sc);
    }
}

作为返回值:

class Test2 {
    public static void main(String[] args) {
        // 普通方式
        Scanner sc = getScanner();
    }
    public static Scanner getScanner(){
        //普通方式
        //Scanner sc = new Scanner(System.in); 
        //return sc;
        //匿名对象作为方法返回值
        return new Scanner(System.in);
    }
}

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

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

相关文章

最新!进口芯片龙头代理商名录更新

众所周知,代理商一直充当着厂家和客户中间的桥梁的角色。经过这么多年的变化和沉淀,摆在代理商面前的挑战与日俱增,定位也逐渐开始分化。 由于原厂对于市场的把控越来越严,各类原厂直营商城的上线以及原厂之间的并购直接主导了市…

【机组】时序与启停实验的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺一、 实验目…

MySQL 索引(上)

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL-进阶篇 🍹文章作者技术和水平很有限,如果文中出现…

openlayers [九] 地图覆盖物overlay三种常用用法 popup弹窗,marker标注,text文本

文章目录 简介overlay 实现popup弹窗overlay 实现label 标注信息overlay实现 text 文本信息完整代码 简介 常见的地图覆盖物为这三种类型,如:popup弹窗、label标注信息、text文本信息等。 overlay 实现popup弹窗 方法详解 实例一个 new Overlay()&…

链动2+1模式:月流水6000万是怎么做到的?

一个好的企业往往只需要最简单的营销方式。当我们面对当今的商业市场,琳琅满目的商业模式,应接不暇的营销方案,我们一定会举足无措的不知道怎么选择。因为一个好的公司或企业,一定要有一个十分经得起推敲的模式来面对消费者。 那么…

对m3u8视频进行批量采集

一、相关网页(网页链接:https://www.acfun.cn/v/ac36564705) 二、多视频采集网页(找出每个视频ID) 三、相关代码(代码含有注释) # Time: 2024/1/18 22:57 # Author: 马龙强 # File: 对m3u8视频…

有效防范网络风险的关键措施

在数字化时代,企业面临着日益复杂和频繁的网络风险。提高员工的网络安全意识是防范网络威胁的关键一步。本文将探讨企业在提升网络安全意识方面可以采取的措施,以有效预防潜在的网络风险。 1. 开展网络安全培训:企业应定期组织网络安全培训&…

Android Studio读写低频RFID T5557卡源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id675212889085&spma1z10.5-c.w4002-21818769070.13.21166f89nKgnJ7 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xml…

【AI绘画+本地部署】基于krita的AI绘画(含windows一键整合包)

comfyuikrita所有相关资源整合包(无需下载后面链接)百度网盘&#xff1a;https://pan.baidu.com/s/1iwNRpdTaD26YbzSDm6WLDA?pwdbur8 –来自百度网盘超级会员V4的分享 krita绘画软件官网地址 https://krita.org/en/download/krita-desktop/ krita-ai-diffusion 插件&#xff…

对java的interface的理解

一个例子来让我们理解更加深刻 这是我们的整体文件布局 ①A是接口 ②B和C是用来实现接口的类 ③show是我们的运行函数&#xff0c;用来展示 A接口 接口中定义的方法可以不用去实现,用其他类去实现(必须实现) 关键字:interface public interface A { // public static …

Redis分布式锁存在的问题及解决方案(值得珍藏)

Redis分布式锁存在的问题 在购票软件的情境中&#xff0c;当仅剩一张或几张票时&#xff0c;众多用户同时尝试购买。在不考虑任何外部干扰的情况下&#xff0c;逻辑上&#xff0c;系统应首先检查是否还有余票。如果仍有余票&#xff0c;用户可以顺利购买并导致库存相应减少&am…

鸿蒙next开发-OpenHarmony的NDK开发

Native API&#xff08;NDK&#xff09;入门 Native API是OpenHarmony SDK上提供的一组native开发接口与工具集合&#xff08;也称为NDK&#xff09;&#xff0c;方便开发者使用C或者C语言实现应用的关键功能。Native API只覆盖了OHOS基础的一些底层能力&#xff0c;如libc&am…

史上最全EasyExcel

一、EasyExcel介绍 1、数据导入&#xff1a;减轻录入工作量 2、数据导出&#xff1a;统计信息归档 3、数据传输&#xff1a;异构系统之间数据传输 二、EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内…

制作一个Python聊天机器人

我们学习一下如何使用 ChatterBot 库在 Python 中创建聊天机器人&#xff0c;该库实现了各种机器学习算法来生成响应对话&#xff0c;还是挺不错的 什么是聊天机器人 聊天机器人也称为聊天机器人、机器人、人工代理等&#xff0c;基本上是由人工智能驱动的软件程序&#xff0…

代码随想录训练营第三十天|332.重新安排行程51. N皇后37. 解数独

332.重新安排行程 采用哈希表方式进行储存出发点和到达点&#xff0c;终止条件是result中的机场数量为机票1&#xff1b; 重点在于哈希表的运用和遍历方法 51. N皇后 wtf? 回溯算法非常形象的N叉树解法&#xff1a; 输入n&#xff0c;row col,chessboard 终止条件&#x…

2024年pmp的考试时间是什么时候?

2024最新考试时间已经出来了&#xff1a;分别是 3月、6月、8月、11月&#xff0c;四次&#xff0c;具体考试日期还需要关注官网的进一步通知。 一、PMP报考条件 年龄满足 22 周岁有官方授权的培训机构给的 35个PDU&#xff08;学时&#xff09; 就能报名。 是不是相当于没有…

[Python] 如何通过ctypes库来调用C++ 动态库 DLL?

ctypes库介绍 ctypes是Python的一个外部库,它提供了一种灵活的方式来调用C语言的动态链接库(DLL)或共享库(SO)。通过ctypes,我们可以在Python中直接调用C语言编写的函数和变量,从而实现跨语言的互操作。 ctypes 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的…

本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程连接

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

【Linux系列】在Pop!OS的启动器中添加自定义程序图标

文章目录 前言一、创建快捷方式二、快捷方式参数三、添加右键菜单和注册MIME 前言 无论是在Windows上&#xff0c;还是Linux&#xff0c;或者安卓这些我们常用的操作系统上&#xff0c;一些应用程序的快捷方式放在桌面或者启动器&#xff0c;只需要简单的点击就可以启动&#…

【算法】串联所有单词的子串【滑动窗口】

题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c; 那么 "abcd…