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

news2024/11/25 16:45:37

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

  • 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://www.coloradmin.cn/o/1962639.html

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

相关文章

机械学习—零基础学习日志(高数16——函数极限性质)

零基础为了学人工智能,真的开始复习高数 这里我们继续学习函数极限的性质。 局部有界性 充分条件与必要条件 极限存在是函数局部有界的充分条件。什么是充分条件,什么是必要条件呢?我这里做了一点小思考,和大家分享&#xff0c…

alibaba cloud linux+JDK+TOMCAT+NGINX+PHP+MYSQL配置实践

CentOs要停止维护了,一直在服务器上用的CentOs7也最迟到2024年6月了,这次给公司新购一台备用服务器,在选择操作系统的时候,考虑了一下,决定试用一下阿里云的alibaba cloud linux。 alibaba cloud linux分为2和3版本&am…

创客项目秀 | 基于xiao的光剑

在《星球大战》宇宙中,光剑不仅仅是武器;它们是持有者与原力的桥梁,制造一把光剑几乎是每个创客的梦想,今天给大家带来的是国外大学生团队制作的可伸缩光剑项目。 材料清单: 电机驱动模块1:90减速电机套装MP3模块、喇叭Xiao RP2…

ingress使用HostNetwork部署

1.三种常用的部署模式 1.1 DeploymentLoadBalancer模式的service 用Deployment部署igress-controller,创建一个type为LoadBalancer的service关联这组pod。大部分公有云,都会为LoadBalancer的service自动创建一个负载均衡器,通常还绑定了公网…

Java面试八股之Spring如何解决循环依赖

Spring如何解决循环依赖 在Spring框架中,循环依赖问题通常发生在两个或多个Bean相互依赖的情况下。Spring为了解决循环依赖问题,采用了不同的策略,这些策略主要取决于Bean的作用域以及依赖注入的方式。下面是一些关键点: 单例Be…

护眼灯真的有用吗?护眼灯到底该不该买?

护眼灯真的有用吗?随着科技的发展,生活质量水平的不断提升,大家对于生活的要求也在不断拔高。护眼台灯进入众多家庭里面,成为不可或缺的产品。然而,护眼台灯在市面上,种类颇多,其质量也是参差不…

力扣高频SQL 50题(基础版)第三十三题

文章目录 力扣高频SQL 50题(基础版)第三十三题610.判断三角形题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题(基础版)第三十三题 610.判断三角形 题目说明 表: Triangle ----------------- | Column Name | Typ…

Python入门宝藏《看漫画学Python》,495页漫画带你弄清python知识点!简单易懂 | 附PDF全彩版

华为出品的《看漫画学Python》全彩PDF教程是一本适合Python初学者的学习资料,通过漫画的形式将复杂的Python技术问题简单化,使学习过程更加生动有趣。以下是对该教程的内容简介、本书概要及本书目录的详细解析: 内容简介 《看漫画学Python》…

无线领夹麦哪个品牌音质最好?无线领夹麦克风怎么挑选

在直播行业中,声音质量直接影响着观众的观看体验。一款优质的无线领夹麦克风,能够确保你的声音在直播过程中始终保持清晰、稳定,减少背景噪音的干扰。它不仅方便佩戴,还能让你在移动中自由发挥,无需担心线缆束缚。对于…

数说故事 | 社媒聆听“顶流”红山动物园UGC声量

7月,CASETiFY和南京红山森林动物园联名啦,一个号称“手机壳中的爱马仕”,一个是“动物园顶流”,两大IP梦幻联动,推出了“明星动物”系列手机壳,CASETiFY还解锁“饲养员”身份,认养了酷酷的美洲豹…

某土地市场网JS逆向:debugger脚本限制秒退和webpack hash参数加密

🔍某土地市场网逆向思路 🚫 解决网页反debugger 🔍 网页禁止打开开发者工具 在访问中国土地市场网时,我们会发现网页禁止了开发者工具的使用,包括F12和右键调试。 🔍强制进入开发者工具 窗口关闭并回退 …

IDEA对线上项目远程debug

1、在启动脚本上添加以下配置内容 -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 nohup java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar test.jar > misc.out & 2、在IDEA中进行配置 (1)选择远程…

我们的网站被狗爬了!

大家好,我是程序员鱼皮。 世风日下,人心不古。我们的程序员面试刷题网站 《面试鸭》 才刚刚上线了一个多月,就由于过于火爆,被不少同行和小人发起网络攻击。 而且因为我们已经有 4500 多道人工整理的企业高频面试题、100 多个各…

不得不安利的程序员开发神器,太赞了!!

作为一名程序员,你是否常常为繁琐的后端服务而感到头疼?是否希望有一种工具可以帮你简化开发流程,让你专注于创意和功能开发?今天,我要向大家隆重推荐一款绝佳的开发神器——MemFire Cloud。它专为懒人开发者准备&…

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo原型图(没错,就是它,童年回忆) 遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想,想要在前端实现一个fc游戏手柄,然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单&…

单细胞|MEBOCOST·细胞间代谢通讯

概述 在代谢活跃的细胞中,表达的代谢酶催化代谢反应生成许多代谢物。这些代谢物中的一些可以扩散到细胞外空间并作为信号分子发挥作用。某些细胞外代谢物可以与空间上邻近细胞的感应蛋白结合。我们将分泌代谢物的细胞称为发送细胞,而表达感应蛋白的细胞称…

开放式耳机稳固吗?音质好吗?四款开放式耳机测评

对于体验过不下50款耳机的我来说,在这么多耳机类型里,我推荐入手开放式耳机。 开放式耳机拥有着舒适的体验。有挂耳式的设计,相比入耳式,开放式耳机不会对耳道造成影响。再加上大部分开放式耳机的挂耳式设计都是人体工学设计&…

Astro 实现TodoList网页应用案例

Astro 是一个现代化的静态站点生成器和前端框架,它具有独特的设计理念:岛屿架构。它允许开发人员使用组件化的方式构建内容优先的网站,将各种技术栈(如React、Vue、Svelte等)的组件无缝集成到同一个项目中。 1、创建项…

STM32高级运动控制系统教程

目录 引言环境准备高级运动控制系统基础代码实现:实现高级运动控制系统 4.1 传感器数据采集模块 4.2 数据处理与运动控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:运动控制与优化问题解决方案与优化收尾与总结 1. 引言 高级运动…

【FCA FineDataLink认证指南】解锁高薪职业新机遇,提升职场竞争力

数据集成作为数字化转型的核心组成部分,正在经历前所未有的增长和创新。随着企业对数据驱动决策的需求日益增长,数据集成领域的人才在各行各业中都备受青睐。而且随着大数据、云计算和人工智能技术的不断发展,数据集成领域的职业机会也在不断…