[Java基础]面向对象

news2024/11/28 8:43:09

      

目录

1、对象和类

2、类之间的关系

3、引用

4、对象的创建和使用

5、构造函数/构造方法

6、内存解析


       在这篇文章中,我们将学习面向对象的思想,并学习如何使用面向对象思想编程。在学习面向对象编程之前,我们先了解一下编程语言的发展:机器语言,汇编语言,高级语言,面向对象的语言。

        机器语言:直接由计算机指令组成,指令,数据,地址,都用0或1的符号串组成,可以由计算机直接执行;

        汇编语言:用容易理解和记忆的符号表示指令,数据,寄存器,抽象层次低,程序员不易理解。

        高级语言:屏蔽了机器细节,提高了语言的抽象层次,更接近于人类语言。60年代出现的结构化编程语言,提出了结构化数据和语句,数据和过程抽象等概念。

        面向对象语言:与以往的语言的不同点是,它的出发点是能更加客观的描述问题域中客观存在的事物。

        编程语言朝着人类更能理解的方向发展。

        提到面向对象,大家都会想到面向过程开发,那么这两者的区别是什么呢?主要区别在于:

        面向过程关注怎么做,做多少事。

        面向对象关注谁去做,多少人去做。

        面向对象编程,以下概念必须要掌握:

1、对象和类

1)对象用于计算机语言中对问题域中事物的描述。对象通过“属性”和“方法”来分别对应事务的静态和动态属性。

2)类是对同一类型事物的抽象,类中定义了这类对象具备的动态和静态属性。

3)类可以看做是一类对象的模板,对象是一个类具体的实现,Instance。

2、类之间的关系

关系
关联最弱的关系,所有的关系都是关联关系
聚合

整体到部分。又分为聚集,组合。

聚集:雁群和大雁的关系;组合:身体和头的关系

继承从一般到特殊。XX is a XX 
多态
实现

了解完上述内容后,用面向对象的思想如何分析问题呢?

  1. 这个问题应该有哪些类,哪些对象;
  2. 每个类和对象应该具备哪些属性和方法;
  3. 类和类之间的关系是怎样的。

3、引用

Java语言中,除基本类型之外的类型都称之为引用类型。Java中的对象通过引用对其操作。

String s; // 1.声明String类型变量s
s = new String("hello world!"); // 2.给s赋值"hello world!"

如以上代码:

执行第1句时,声明String类型的引用变量s;

执行第2句时,通过new语句创建一个String类型的对象,用s指向它,以后通过s完成对这个对象的操作。

从内存的角度看这两步:

执行第1句时,在栈中分配一块空间,保存对象的地址,此时存的地址是null。

执行第2句时,在堆中分配一块空间,保存对象,此时s存的地址是堆内存的地址。

 那如何在内存中区分类和对象呢?

类是静态的的概念,每个类只有一份,保存在代码区;

对象是运行过程中new出来的,保存在堆中,类中的成员变量在不同对象中有不同的值(除静态变量),对象在没有引用时会被回收掉。

4、对象的创建和使用

1)必须使用new创建对象;

2)执行对象.成员变量来引用成员变量;

3)执行对象.方法(实参列表)来引用方法;

4)同一个类的每个对象的成员变量有不同的存储空间;

5)同一个类的每个对象共享该类的方法。

非静态的方法,是针对每个对象调用。

5、构造函数/构造方法

说到对象的创建,必须要说一下对象的构造函数。

1)使用new() + 构造函数的方法创建一个对象;

2)构造函数是定义在Java类的,一个用来初始化对象的成员变量函数;

3)构造函数名和类名相同,没有返回值;

4)没有指定构造函数时,编译器为每个类自动添加一个无参构造函数,如:

类名(){};

6、内存解析

Java在函数调用中传递参数时,遵循值传递的原则:基本类型传递数据值本身。引用类型,传递对象的引用,而不是对象本身。

public class MemoryAnalysis {
    public static void main(String[] args) {
        Point p1 = new Point(1, 1, 1);  // 1
        Point p2 = new Point(2, 2, 2);  // 2
        double distance = p2.getDistance(p1);  // 3
        System.out.println(distance);  // 4
        p1.setX(5);   // 5
        System.out.println(p1.getDistance(new Point(3, 3, 3)));   // 6
    }

}

class Point {
    double x, y, z;

    Point(double _x, double _y, double _z) {
        x = _x;
        y = _y;
        z = _z;
    }

    public void setX(double x) {
        this.x = x;
    }

    double getDistance(Point p) {
        return (x - p.x) * (x - p.x) + (y - p.y) * (y - p.y) + (z - p.z) * (z - p.z);
    }
}


Point p1 = new Point(1, 1, 1);  // 1
Point p2 = new Point(2, 2, 2);  // 2
double distance = p2.getDistance(p1);  // 3

 

 第4步执行结束后,栈中变量的空间被释放

System.out.println(distance);  // 4

p1.setX(5);   // 5
System.out.println(p1.getDistance(new Point(3, 3, 3)));   // 6

 从图中我们可以看出,在方法传参,参数是引用类型时,在栈中创建一个变量指向参数的引用地址,而不是生成一个新的对象。

方法执行结束后,栈空间的变量全部被释放,堆空间的对象等垃圾回收时被释放

我们在分析的时候,可能会遇到复杂表达式,这时候有个原则:从里到外分析

形参,实参在栈中都会占用一块空间,方法的返回值也会存在一块临时区域(栈)中,方法执行结束后,临时区域(栈)的空间自动释放;

 

7.方法重载

是指一个类中可以定义方法名相同,参数列表不同的多个方法。在实际使用时根据不同的参数列表选择方法。

普通方式的重载已经老生常谈了,这里我们重点看下构造函数的重载 

class Point {
    private double x;
    private double y;

    Point() {}

    Point(int x1, int y1) {
       this.x = x1;
       this.y = y1;
    }

    public double getX() {return x;}

    public double getY() {return y;}

    public void setX(double x) {this.x = x;}

    public void setY(double y) {this.y = y;}
}

接下来我们举个例子,从内存的角度解析程序执行过程

因为内存解析篇幅较长,我们单独拿出来讲解。请亲爱的读者朋友移步:

[Java基础]面向对象-内存解析_小王师傅66的博客-CSDN博客

 所以上面就是面向对象中,关于对象和类,类之间的关系,引用,对象的创建和使用,构造函数,内存解析的全部内容。

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

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

相关文章

Win安装Node.js Npm

1、在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm: nodejs 下的包管理器。 webpack: 它主要用途是通过CommonJS 的语法把所有浏览器端需要发布的静态资源作相应的准备,比如资源的合并和打包。 vue-cli: 用户生成Vue工…

HNU-操作系统OS-作业4(37-40章)

OS_homework_4 这份文件是OS_homework_4 by计科2102 梅炳寅 202108010206 文档设置了目录,可以通过目录快速跳转至答案部分。 第37章 运行程序wolf/OS-homework/file-disks/disk.py 解释一些参数 -G可以查看可视化内容-c可以计算结果。-a 提供待访问的数组-S 将寻道速率改…

深度学习训练营之优化器对比

深度学习训练营之优化器对比 原文链接环境介绍前置工作设置GPU 数据处理导入数据数据集处理数据集可视化 模型构造模型训练结果可视化 原文链接 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:365天深度学习训练营…

deque(简单介绍一下)

deque的基本情况: 简单的来说deque是一个双头队列。且两边的尺寸可以动态收缩或者扩张。 其底层实现相当复杂,而且效率并不高。大多数时候都不会使用。 deque诞生的原因是vector和list的优缺点不可分割。 正好复习一下vector和list的优缺点。 vector的…

手机抓包fiddler配置及使用教程

本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意:Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。当Fiddler退出的时候它会自动注销,这样就不会影响别的 程序。不过如果Fiddler非正常退出&…

学校热水供应系统方案

学校热水供应系统是现代化校园建设的重要组成部分。一套高效、可靠、安全、环保的热水供应系统,不仅能够满足学生、教职工的日常生活需求,也能提高学校形象和竞争力。 在设计学校热水供应系统方案时,需要考虑以下几个方面: 一、热…

【计算机网络复习之路】运输层(谢希仁第八版)万字详解 主打基础

运输层是OSI七层模型中最重要最关键的一层,是唯一负责总体数据传输和控制的一层。运输层要达到两个主要目的:第一,提供可靠的端到端的通信(“端到端的通信” 是应用进程之间的通信);第二,向会话…

【css】box-sizing属性

box-sizing 是一个 CSS 属性,用于指定元素的总宽度和高度的计算方式。它影响内容框的大小,并可以包括或排除元素的填充、边框和外边距。 box-sizing 属性接受两个值: content-box:这是默认值。它指定元素的宽度和高度只包括内容区…

培训班出来拿17K,入职后8天就被裁了....

最近翻了一些网站的招聘信息,把一线大厂和大型互联网公司看了个遍,发现市场还是挺火热的,虽说铜三铁四,但是软件测试岗位并没有削减多少,建议大家有空还是多关注和多投简历,不要闭门造车,错过好…

电脑重装系统后无法开机是什么原因导致的

电脑重装系统是一种常见的解决问题和提升性能的方法,但有时候重装系统后可能会遇到无法开机的问题。本文将介绍一些常见原因和解决方法,帮助您解决电脑重装系统后无法开机的困扰。 工具/原料: 系统版本:windows7系统 品牌型号&…

HNU-操作系统OS-作业3(26-31章)

OS_homework_3 这份文件是OS_homework_3 by计科210X wolf 202108010XXX 文档设置了目录,可以通过目录快速跳转至答案部分。 第26章 运行该程序wolf/OS-homework/threads-intro/x86.py 通过README可知一些重要的标识符如下 -p:指定程序 -t:线程数 -i:指定每执行i个指令…

BT8918D----GPIO模块

0 Preface/Foreword 1 宏定义和数据结构 1.1 gpio_t typedef struct { psfr_t sfr; //GPIO SFR ADDR u8 num; u8 type; //type 1,高压IO,没有300R的强上下拉电阻。 type 0, 普通IO, 有内部300R上下拉电阻。 } gpio_t; 1.…

LeetCode - 18 四数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 18. 四数之和 - 力扣(LeetCode) 题目描述 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], n…

selenium.chrome怎么写扩展拦截或转发请求?

Selenium WebDriver 是一组开源 API,用于自动测试 Web 应用程序,利用它可以通过代码来控制chrome浏览器! 有时候我们需要mock接口的返回,或者拦截和转发请求,今天就来实现这个功能。 代码已开源: https:/…

Spring AOP(面向切面编程)详解

文章目录 前言AOP 概述AOP的基本概念AOP 应用场景AOP 常用的接口 Spring AOP 实现方式基于XML的配置基于注解的配置 Spring AOP 的使用一、Spring 的 API 接口实现AOP二、自定义类实现AOP三、注解实现AOP 模拟实现 Spring AOP 前言 Spring 提供了功能强大IOC、AOP等功能&#…

文心一言 VS 讯飞星火 VS chatgpt (36)-- 算法导论5.3 6题

六、请解释如何实现算法 PERMUTE-BY-SORTING,以处理两个或更多优先级相同的情形。也就是说,即使有两个或更多优先级相同,你的算法也应该产生一个均匀随机排列。 文心一言: 算法 PERMUTE-BY-SORTING 是一种基于排序的随机排列算法…

【第二章:物理层】

目录 知识框架No.0 : 引言No.1 :通信基础一、基本概念二、两个公式lim求极限1、失真(失去真实性) 三、编码和调制四、数据交换方式 No.2 :传输介质一、导向型介质二、非导向型介质 No.3 :物理层设备一、中继器二、集线…

selenium:元素定位之xpath、css

元素定位是在做UI自动化测试中最重要的一环,要牢牢掌握定位的方法,才能更有效率的进行UI自动化测试。 常见的元素定位方式: idnametag_nameclass_namelink_textpartial_link_textxpathcss 其中id,name是具有唯一性的&#xff0…

高考攀升小红书热榜!互动量破千万,品牌如何毕业季营销?

光影间,又是一年毕业季,弹指之间,那些青葱岁月如同白驹过隙般悄然从指缝溜走。近期,一年一度的高考、大学毕业又来袭,登上各大社媒平台热搜,成为热门话题;本期,随小编一起运用小红书…

【C++】智能指针 学习总结 |std::shared_ptr |std::unique_ptr | std::weak_ptr

文章目录 前言一、智能指针介绍二、普通指针和智能指针的比较案例三、std::shared_ptr四、std::unique_ptr五、std::weak_ptr六、std::shared_ptr |std::unique_ptr | std::weak_ptr三大智能指针的区别 前言 参考答案:chatgpt 一、智能指针介绍 智能指针是C的一种…