面向对象 - 概述、类的创建、 实例化与内存解析

一、学习面向对象的三条主线

  • Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类
  • 面向对象的特征:封装、继承、多态、(抽象)
  • 其他关键字的使用:this、super、package、import、static、final、interface、abstract等

二、叙述面向对象的编程思想

1.程序设计的思路

        面向对象,是软件开发中的一类编程风格、开发范式。除了 面向对象 ,还有 面向过程指令式编程函数式编程 。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。

类比:史书类型

  • 纪传体:以人物传记为中心,“本纪”叙述帝王,“世家”记叙王侯封国和特殊人物,“列传”记叙 民间人物。
  • 编年体:按年、月、日顺序编写。
  • 国别体:是一部分国记事的历史散文,分载多国历史。

        早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现 了面向对象思想并成为目前主流的方式。

 2.面向过程的程序设计思想(Process-Oriented Programming),简称 POP

  • 关注的焦点是过程 :过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以 把这个过程抽取为一个 函数 。这样就可以大大简化冗余代码,便于维护。
  •  典型的语言:C语言
  • 代码结构:以 函数 为组织单位。 

3.面向对象的程序设计思想( Object Oriented Programming),简称 OOP 

  • 关注的焦点是 :在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽 象出来,用类来表示。
  • 典型的语言:Java、C#、C++、Python、Ruby和PHP等
  • 代码结构:以为组织单位。每种事物都具备自己的 属性行为/功能
  • 是一种“ 设计者思维 ”,适合解决复杂问题。代码扩展性强、可维护性高。

4. 类比举例

a)面向过程

1.打开冰箱

2.把大象装进冰箱

3.把冰箱门关住

b)面向对象

人{

        打开(冰箱){

                冰箱.开门();

        }

        操作(大象){

                大象.进入(冰箱);

        }

        关闭(冰箱){

                冰箱.关门();

        }

}

冰箱{

        开门(){ }

        关门(){ }

}

大象{

        进入(冰箱){ }

}

三、Java语言的基本元素:类和对象

1.引入

        大千世界,其实任何事物都可以认为是对象,这也就是“万物皆对象”。用一个例子说明这种情况。

        小茗同学今年13岁,初一三班学生,性别男。生活比较单调,除了读书睡觉和吃,其他技能尚未发现。和他同班同学的小智、小青、小龙都是如此,真是“臭味相投”成了好朋友。

        上面这段话中,小铭同学就是一个对象。其中年龄、性别、班级这些称之为属性,读书睡觉和吃称之为方法或函数。对象都是类实例化的结果,那么上述的例子中讲这些学生抽象化,就是一个“学生类”。

2.类的成员概述

  • 面向对象程序设计的重点是类的设计
  • 类的设计,其实就是类的成员的设计

        现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的 细胞 构成的。同理,Java代码世界是 由诸多个不同功能的 类 构成的。

        现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、… 

        Java中用类class来描述事物也是如此。类,是一组相关属性行为的集合,这也是类最基本的两 个成员。

  • 属性:该类事物的状态信息。对应类中的成员变量(别名: 属性 Field
  • 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法方法 函数 Method

3.总结

(Class) 和 对象(Object) 是面向对象的核心概念。

a)类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。

b)对象:实际存在的该类事物的每个个体 ,是具体的,因而也称为实例(instance) 。

c)类 => 抽象概念的人 ; 对象 => 实实在在的某个人

四、使用类并创建对象的三个步骤

1.步骤一:类的定义

类的定义使用关键字:class。格式如下:

[修饰符] class 类名{

        属性声明;

        方法声明;

}

举例: 

public class Dog{

        //声明属性

        String type; //种类

        String nickName; //昵称

        String hostName; //主人名称

        //声明方法

        public void eat(){

                //吃东西

                System.out.println("狗狗进食");

         }

}

2.步骤二:对象的创建(类的实例化)

创建对象,使用关键字:new

创建对象语法:

//方式1:给创建的对象命名

//把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了

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

//方式2:

new 类名()//也称为匿名对象

举例:

class DogTest{

        public static void main(String[] args){

                //创建Dog类的对象

                Dog dog = new Dog();

        }

}

3.步骤三:对象调用属性或方法

  • 对象是类的一个实例,必然具备该类事物的属性和行为(即方法)。
  • 使用" 对象名.属性 " 或 " 对象名.方法 "的方式访问对象成员(包括属性和方法)

举例:

class DogTest{

        public static void main(String[] args){

                //创建Dog类的对象

                Dog dog = new Dog();

                dog.type="泰迪";

                dog.nickName="小小";

                dog.hostName="小铭";

                dog.eat();

        }

}

4.匿名对象

  • 我们也可以不定义对象的句柄(变量),而直接调用这个对象的方法。这样的对象叫做匿名对象。
    • 如:new Person().shout();
  • 使用情况
    • 如果一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
    • 我们经常将匿名对象作为实参传递给一个方法调用。

五、对象的内存解析

1.JVM内存结构划分

HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。

 其中:

堆(Heap):此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一 点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

栈(Stack) :是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。

方法区(Method Area) :用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.对象内存解析

a)举例:

class Person { //类:人

        String name;

        int age;

        boolean isMale;

}

public class PersonTest { //测试类

        public static void main(String[] args) {

                Person p1 = new Person();

                p1.name = "赵同学";

                p1.age = 20;

                p1.isMale = true; 

                Person p2 = new Person();

                p2.age = 10;

                Person p3 = p1;

                p3.name = "郭同学";

        }

}

b)内存解析图

c)说明

  • 堆:凡是new出来的结构(对象、数组)都放在堆空间中。
  • 对象的属性存放在堆空间中。
  • 创建一个类的多个对象(比如p1、p2),则每个对象都拥有当前类的一套"副本"(即属性)。当通过一个对象修改其属性时,不会影响其它对象此属性的值。
  • 当声明一个新的变量使用现有的对象进行赋值时(比如p3 = p1),此时并没有在堆空间中创建新的对象。而是两个变量共同指向了堆空间中同一个对象。当通过一个对象修改属性时, 会影响另外一个对象对此属性的调用。

d)一道面试题

面试题:对象名中存储的是什么呢?

答:对象地址

public class StudentTest{

        public static void main(String[] args){

                System.out.println(new Student());//Student@7852e922

                

                Student stu = new Student();

                System.out.println(stu);//Student@4e25154f

                

                int[] arr = new int[5];

                System.out.println(arr);//[I@70dea4e

        }

}

直接打印对象名和数组名都是显示“类型@对象的hashCode值",所以说类、数组都是引用数据类型,引用数据类型的变量中存储的是对象的地址,或者说指向堆中对象的首地址

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

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

相关文章

北欧风情在浦东,5 大公司为你定制美好

在繁华的浦东,追求高品质生活的您,是否渴望拥有一个充满北欧风情的温馨家园?今天,我们将为您推荐 5 家顶尖的装修公司,它们将以精湛的工艺和独特的设计理念,为您量身定制梦想中的北欧风家居。 推荐一&#…

大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

大厂的堡垒机到底是啥?为什么需要它?

什么是堡垒机 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及…

【文件解析漏洞】实战详解!

漏洞描述: 文件解析漏洞是由于中间件错误的将任意格式的文件解析成网页可执行文件,配合文件上传漏洞进行GetShell的漏洞! IIS解析漏洞: IIS6.X: 方式一:目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹,其目…

免费发送邮件两种接口方式:SMTP和邮件API

SMTP与邮件API在处理大批量邮件发送时,哪个更稳定? 在现代信息化的社会中,邮件已成为不可或缺的沟通工具。无论是个人还是企业,发送邮件都是日常工作的一部分。AokSend将详细介绍两种常用的免费发送邮件接口方式:SMTP…

麒麟V10系统统一认证子系统国际化

在适配麒麟V10系统统一认证子系统国际化过程中, 遇到了很多的问题,关键是麒麟官方的文档对这部分也是粗略带过,遇到的问题有: (1)xgettext无法提取C源文件中目标待翻译的字符串。 (2)使用msgf…

程序一调用这个接口就会崩溃, 因为他的静态库添加是放在release文件下,而我用的debug模式

程序一调用这个接口就会崩溃 因为他的静态库添加是放在release文件下 而我用的debug模式 DESTDIR ../x64/ReleaseINCLUDEPATH ./../3rdparty/ZZDecode/include LIBS -lopengl32 \-lglu32 \-luser32 \./../3rdparty/ZZDecode/x64/release/ZZDecodeInterface.lib

Python软件开发:AI毕业设计生成器引领未来

🌟 革新软件开发:Python毕业设计生成器引领未来 🚀 目录 🌟 革新软件开发:Python毕业设计生成器引领未来 🚀🎓 课题简介🌟 开发目的📈 开发意义 📚 研究方法&…

Jvm的无关性

Jvm具有无关性,主要体现在两个方面: 平台无关性:任何操作系统都能运行Java代码。 语言无关性:Jvm能运行除Java以外的其他代码。 Java源代码首先需要使用Javac编译器编译成 .class文件,然后由Jvm执行.class文件&…

如何准备 Java API 文档以供下游对接

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

如何在 Odoo 16 Studio 中添加智能选项卡和管道

具有优雅定制功能的软件系统(如 Odoo ERP)可让客户调整和个性化其公司应用程序。定制在过去并不普遍,但现在对于组织来说,满足客户需求和需求激增至关重要。即使许多行业的竞争很少,但当前的竞争市场仍不稳定。尽管引入…

Mybatis批量更新数据库错误

问题:记录一次使用Mybatis批量更新数据库的错误,错误信息,Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 "update_time" 的类型为 timestamp without time zone, 但表达式的类型为 text 建议&am…

Prometheus+Grafana 监控平台实践-搭建常用服务监控告警

前言 Prometheus 是一个开放性的监控解决方案,通过各种 Exporter 采集当前主机/服务的数据,和 Grafana 相结合可以实现强大的监控和可视化功能 本篇将分享使用 docker compose 构建 Prometheus+Grafana,并监控之前文章所搭建的主机&服务,分享日常使用的一些使用经验 文…

7月速览| 卓翼飞思获荣誉、助大赛、展技术!

行业殊荣 ● 荣获 “全国低空经济先导产业行业产教融合共同体” 常务理事单位称号,助力打造低空经济产业领域人才智库。 “共同体”是低空经济领域,国家职教战略与新质生产力发展战略融合对接的重要成果。旨在汇聚优质资源,搭建交流平台&…

传统放牧方式与北斗科技的碰撞:北三短报文头羊定位追踪器PD28守护放牧生活

在大草原的广袤天地中,放牧生活是蒙古族人民的传统之一。然而,除了美丽和自由,放牧生活也伴随着一些危险。以前由于科技落后,人工成本低,主要依靠人力去放牧,牧民放牧顶风踏雪走个几十公里都极为寻常。除了…

AI赋能交通治理:非机动车监测识别技术在城市街道安全管理中的应用

引言 城市交通的顺畅与安全是城市管理的重要组成部分。非机动车如自行车、电动车、摩托车等在城市交通中扮演着重要角色,但同时也带来了管理上的挑战。尤其是在机动车道上误入非机动车的现象,不仅影响交通秩序,还可能引发交通事故。思通数科…

upload-labs靶场(1-19关)

upload-labs靶场 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共19关&#xff0c;每一关都包含着不同上传方式。 注意&#xff1a;能运行<?php phpinfo();?&…

Linux的软硬连接

目录 见一下软硬连接 特征 什么是软硬连接&#xff0c;有什么用 软连接有什么用 硬连接有什么用 总结 见一下软硬连接 建立一个软连接 建立硬连接 特征 1. 软连接是一个独立的文件&#xff0c;因为有自己的inode号&#xff0c;由上图可知&#xff1b; 软连接的内容&…

怎麼使用ixbrowser指紋流覽器?

ixBrowser是一款指紋流覽器流覽器&#xff0c;利用指紋隔離技術確保在與Pixelscan等第三方檢測網站進行測試時具有出色的通過率&#xff0c;能夠輕鬆管理多個獨立帳戶。此外&#xff0c;ixBrowser能夠創建無限的獨立個人資料並邀請團隊成員。簡化了運營&#xff0c;降低了運營成…

java基础概念07-switch语句

一、switch定义 二、基本语法 switch (expression) { case value1: // 当expression的值等于value1时执行的代码 break; // 可选 case value2: // 当expression的值等于value2时执行的代码 break; // 可选 // 你可以有任意数量的case语句 default: // 可选 // 当没有…