Java进阶 之 再论面向对象(1)——面向对象的编程思想 Java中的类和对象 深入认识对象,内存图解+变量作用域+参数传递

本文主要是介绍Java进阶 之 再论面向对象(1)——面向对象的编程思想 Java中的类和对象 深入认识对象,内存图解+变量作用域+参数传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

前言

我们都知道Java是一门面向对象object-oriented(OOP)的编程语言,但究竟什么是面向对象,为什么要用面向对象,往往会语焉不详。

本篇博客从面向过程和面向对象的编程思想谈起,阐述了类和对象在Java中的编程中的应用,此外,对于对象的内存,变量作用域,参数传递等进行了阐述。

其他相关的Java进阶相关的博客文章合集如下:

【合集】Java进阶——Java深入学习的笔记汇总 & JVM底层、多线程、类加载 …

在这里插入图片描述

目录

  • 前言
  • 引出
  • 编程思想
    • 什么是思想
    • 编程思想分类
    • 面向过程与面向对象对比
    • 面向对象举例
      • 1.面向过程解决
      • 2.面向对象解决
    • 面向对象思维方式的好处
    • 总结
  • 类和对象
    • 对象在需求中的使用
    • 对象在代码中的体现
    • 使用定义好的类
      • 创建对象
      • 测试
  • 深入认识对象
    • 对象的内存图解
      • 说明
      • 图示
    • 类和对象的区别
    • 局部变量和成员变量区别
    • 基本类型和引用类型作为参数传递
      • 1.基本类型作为参数传递
      • 2.引用类型作为参数传递
  • 总结

引出


从面向过程和面向对象的编程思想谈起,阐述了类和对象在Java中的编程中的应用,此外,对于对象的内存,变量作用域,参数传递等进行了阐述。

编程思想

什么是思想

何谓编程思想?首先解释一下“思想”。

先问你个问题:你想做个怎样的人?

可能你会回答:我想做个好人,孝敬父母,尊重长辈,关爱亲朋…

你看,这就是思想。这是你做人的思想,或者说,是你做人的原则。做人有做人的原则,编程也有编程的原则。这些编程的原则呢,就是编程思想。

编程思想分类

  • 面向对象:Object Oriented Programming
  • 面向过程:Procedure Oriented Programming

面向过程与面向对象都是我们编程中,编写程序的一种思维方式。

面向过程与面向对象对比

  • 面向过程

    面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。

    例如:公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生打扫干净了。

  • 面向对象

    面向对象的程序设计方式,是遇到一件事时,思考“我该让谁来做”,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。

    例如,公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向对象的程序设计方式会思考“我该让谁来做,如小明擦玻璃、让小丽扫地、让小郭拖地、让小强倒垃圾等”,这里的“小明、小丽、小郭、小强”就是对象,他们要打扫卫生,怎么打扫是他们自己的事,反正最后一群对象合力把公司卫生打扫干净了。

面向对象举例

需求:买电脑(组装机)

1.面向过程解决

假如我们需要买组装电脑,这时首先会在网上查询具体每一个硬件的参数和报价。然后会去电脑城进行多家询价,接着询价结束后回家根据具体的结果分析出自己比较满意的哪家报价,接着会到这家店里进行组装,组装时还需要进行现场监督,组装完成安装相应的系统,然后电脑抱回家。

分析上述整个过程大体分一下几步:上网查询参数和报价、电脑城询价、现场安装和监督、抱电脑回家。在整个过程中我们参与了每一个细节,并且会感觉相当累。

2.面向对象解决

假如我们需要买组装机,这时应该找一个懂电脑硬件的人,让他帮我们查看参数和报价,并进行询价和杀价,以及现场组装监督。而我们自己并不需要亲历亲为具体怎么做,只要告诉这个人我们想要的具体需求即可。

分析上述整个过程,发现瞬间变的十分轻松,只要找到懂电脑硬件的这个人,我们的问题都可以解决。并且在这个过程中我们不用那么辛苦。

面向对象思维方式的好处

通过生活中的真实场景使用面向对象分析完之后,我们开始分析面向过程和面向对象的差异做出总结:

  • 面向对象思维方式是一种更符合人们思考习惯的思想
  • 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多的体现是指挥者(指挥对象做事情)。
  • 面向对象思维方式将复杂的问题简单化。
  • 程序员从面向过程的执行者转化成了面向对象的指挥者。

总结

洗衣服:

面向过程:把衣服脱下来—>找盆—>放洗衣粉—>加点水—>浸泡10分钟—>揉一揉—>清洗衣服—>拧干—>晾起来

面向对象:把衣服脱下来—>打开全自动洗衣机—>扔衣服—>按钮—>晾起来

区别:

  • 面向过程:强调步骤。
  • 面向对象:强调对象,这里的对象就是洗衣机。

类和对象

对象在需求中的使用

对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象。

我们把大象装冰箱为例进行分析。

在针对具体的需求,可以使用名词提炼的办法进行分析,寻找具体的对象。

需求:把大象装冰箱里

对象:大象、冰箱

分三步:

1、打开冰箱门

2、将大象装进去

3、关闭冰箱门

分析发现打开、装、关闭都是冰箱的功能。即冰箱对象具备如下功能:

冰箱打开

冰箱存储

冰箱关闭

用伪代码描述,上述需求中有两个具体的事物 大象 和 冰箱

 描述大象:class 大象{}描述冰箱:class 冰箱
{void 打开(){}void 存储(大象){}void 关闭(){}}

当把具体的事物描述清楚之后,需要使用这些具体的事物,Java使用具体的事物,需要通过new关键字来创建这个事物的具体实例。

使用对象:

1、创建冰箱的对象

冰箱 bx = new 冰箱();

2、调用冰箱的功能

对象.功能();

bx.打开();

bx.存储(new 大象());

bx.关闭();

总结:

  • 先按照名词提炼问题领域中的对象
  • 对对象进行描述,其实就是在明确对象中应该具备的属性和功能
  • 通过new的方式就可以创建该事物的具体对象
  • 通过该对象调用它以后的功能。

对象在代码中的体现

在分析现实生活中的事物时发现,这些事物都有其具体的特点和功能,这些特点和功能就组成了这个特殊的事物。

描述小汽车。

分析:

事物的特点(属性):

颜色。

轮胎个数。

事物的(功能):

运行。

可以简单理解:属性就是数值,其实就是变量;行为就是功能,就是方法。

小汽车

{

​ 颜色;

​ 轮胎个数;

​ 运行() { }

}

通过计算机语言Java来描述这个事物:

定义类的格式:

public class 类名 {//可编写0至n个属性数据类型 变量名1;数据类型 变量名2//可编写0至n个方法修饰符 返回值类型 方法名(参数){执行语句;}
}

汽车类:

public class Car {String color;int number;public void run() {System.out.println(color + ":" + number);}
}

通过代码的描述,知道类的真正意义就是在描述事物。属性和功能统称为事物中的成员。

  • 事物的成员分为两种:成员属性和成员功能。
  • 成员属性在代码中的体现就是成员变量
  • 成员功能在代码中的体现就是成员方法

使用定义好的类

创建对象

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

测试

public class CarDemo {public static void main(String[] args) { // 1,创建Car的对象。给对象起个名字。Car c = new Car();// c是类类型的变量。c指向了一个具体的Car类型的对象。// 2,通过已有的对象调用该对象的功能。格式:对象.对象成员;// 3,可以该对象的属性赋值。c.color = "red";c.number = 4;c.run();}
}

深入认识对象

对象的内存图解

说明

经过上面对小汽车的描述,和Java代码测试,我们虽然可以将生活中的事物使用Java代码描述出来,但是这些代码在内存中是如何执行的,接下来我们需要研究下对象在内存的图解。

接下来就是分析对象在内存中的分配情况。这里需要画图一步一步演示,严格按照画图流程讲解内存对象创建过程。

图示

在这里插入图片描述

类和对象的区别

面向对象的编程思想力图在程序中对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,面向对象的思想中提出两个概念,即类和对象。其中,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。接下来通过一个图例来抽象描述类与对象的关系,如下图所示。

在这里插入图片描述

在上图中,可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。从上图中可以明显看出对象是根据类创建的,并且一个类可以对应多个对象。

经过前面几个知识点的学习,基本上掌握了类是用于描述事物的,类中可以定义事物的属性和行为。而对象是通过描述的这个类,使用new关键字创建出来,通过对象就可以调用该对象具体的属性和功能了。

局部变量和成员变量区别

理解清楚了类和对象之后,发现在描述类的属性和前面学习定义变量差别不大,唯一区别就是位置发生了改变,那么类中定义的变量,和在方法定义的变量有啥差别呢?

回忆以前学习时变量的定义方式和位置,以及现在定义类中属性的特点。总结下面几点异同:

  • 区别一:定义的位置不同

    • 定义在类中的变量是成员变量
    • 定义在方法中的变量是局部变量
  • 区别二:在内存中的位置不同

    • 成员变量存储在对内存的对象中
    • 局部变量存储在栈内存的方法中
  • 区别三:声明周期不同

    • 成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失
    • 局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失
  • 区别四:初始化不同

    • 成员变量因为在堆内存中,所有默认的初始化值
    • 局部变量没有默认的初始化值,必须手动的给其赋值才可以使用。

基本类型和引用类型作为参数传递

1.基本类型作为参数传递

在这里插入图片描述

基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。

2.引用类型作为参数传递

在这里插入图片描述

当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6.show方法弹栈。

由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。

总结


1.什么是类

:是一组相关属性行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该

类事物。

现实中,描述一类事物:

  • 属性:就是该事物的状态信息。
  • 行为:就是该事物能够做什么。

举例:小猫。

  • 属性:名字、体重、年龄、颜色。
  • 行为:走、跑、叫。

2.什么是对象

对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。

现实中,一类事物的一个实例:一只小猫。

举例:一只小猫。

  • 属性:tom、5kg、2 years、yellow。
  • 行为:溜墙根走、蹦跶的跑、喵喵叫。

3.类和对象的关系

  • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
  • 对象:是能够看得到摸的着的真实存在的实体
  • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

这篇关于Java进阶 之 再论面向对象(1)——面向对象的编程思想 Java中的类和对象 深入认识对象,内存图解+变量作用域+参数传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203260

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory