【JavaSE成神之路】Java面向对象(上)

news2024/12/26 23:21:06

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容是Java的面向对象。

首先我们回顾一下,之前的章节我们学到了哪些东西。

我们学会了写一个类,然后里面弄一个main方法,在main方法里面写一个输出语句。

我们学会了循环结构和分支结构。

我们学会了8种基本数据类型。

我们学会了怎么定义一个普通方法,然后在main方法中调用普通方法。

我们学会了Java的作用域,常量和变量。

这些知识,可以让我们来解决一些简单的问题,但是如果涉及到复杂的业务逻辑,就不够用了。

可以这么理解,之前我们学到的东西,可以让你搭一间茅草屋,但不足以你用来建造商品房。

要建造商品房,需要我们掌握工程化的东西,而在Java中,这个就是面向对象。

1. 类和对象

面向对象,就是用程序来模拟我们在现实世界处理问题的方式。

首先解释类和对象,看一个具体的场景。

你想找一个女朋友,这个时候你不知道女朋友到底叫什么名字,但是你总有一套自己的标准吧。

比如你要找一个长发,戴眼镜,穿jk超短裙,肤白貌美的女朋友。这些标准就是在描述一个类,或者说是一个模板。

体现在程序中,就是一个class,这个class有头发、是否戴眼镜、裙子种类,肤色等静态特征,即属性。

你还要求,这个女朋友对你好,每天可以亲亲抱抱举高高,这个体现在class中就是动态行为,也就是方法。

以上就是类的概念,那对象是什么呢?

对象就是哪天你真的找到了这样一个女朋友,这时候女朋友是真实存在的,可盐可甜的,比如有一个具体的名字叫王菊花。

所以,类是一个抽象的概念和模板,而对象是根据这个模板新建的一个真实的个体。

2.怎么创建一个类

根据上面的女朋友类,我们可以编写这样的class:

public class GirlFriend{
   //类的属性:
   private String name;
   private String hair;
   private boolean glasses;
   private String skirt;
   private String color;
   
   //类的构造方法
   public GirlFriend(String name,String hair,boolean glasses,String skirt,String color){
      this.name = name;
      this.hair = hair;
      this.glasses = glasses;
      this.skirt = skirt;
      this.color = color;
   }
   
   //类的其他方法
   public void setName(String name){
      this.name = name;
   }
   
   public String getName(){
      return this.name;
   }
   public void setHair(String hair){
      this.hair = hair;
   }
   
   public String getHair(){
      return this.hair;
   }
   public void setGlasses(boolean glasses){
      this.glasses = glasses;
   }
   
   public boolean getGlasses(){
      return this.glasses;
   }
   public void setSkirt(String skirt){
      this.skirt = skirt;
   }
   
   public String getSkirt(){
      return this.skirt;
   }
   public void setColor(String color){
      this.color = color;
   }
   
   public String getColor(){
      return this.color;
   }
}

类的属性,也叫成员变量,我们一般在属性上添加修饰符private,代表私有的,这个体现了封装。

然后呢,类的方法,上面写的都是get/set方法。

Java的get/set方法是用来获取或设置对象属性的方法,它们在Java中是一种编程习惯,满足封装性的要求。get/set方法提供了一种简便的方式来访问对象的属性,同时也提供了一种安全性的控制,可以在获取和设置属性的时候进行一些简单的检查。

可能你已经注意到了,上面有一个特殊的方法:

//类的构造方法
public GirlFriend(String name,String hair,boolean glasses,String skirt,String color){
      this.name = name;
      this.hair = hair;
      this.glasses = glasses;
      this.skirt = skirt;
      this.color = color;
}

类的构造方法是在创建一个类的对象时调用的一种特殊方法,它可以帮助我们对新创建的对象进行初始化。

比如假如我们有一个Person类,每个Person对象都有name和age属性,那么构造方法可以是这样的:

public Person(String name, int age){
  this.name = name;
  this.age = age;
}

这样,当我们需要新建一个Person对象时,我们可以指定name和age参数,它们将会被赋值给新创建对象的name和age属性。

GirlFriend构造方法也是一样的道理,构造方法默认是缺省的。

3.怎么实例化对象

实例化是指根据类的定义来创建一个具体的对象的过程,它是类的实体化操作,也就是说,通过实例化,程序可以为类的抽象定义创建具体的对象,从而使程序具有可操作性。

实例化GirlFriend类就是使用new关键字来创建一个GirlFriend类的具体实例,例如:

GirlFriend gf = new GirlFriend();

通过实例化,我们可以引用gf来访问GirlFriend类的方法和属性,从而使程序更具有可操作性。

但是,上面的代码会报错:

这是因为,在GirlFriend类中,我们显示定义了一个构造方法,却没有显示定义空构造方法。

如果你不写

public GirlFriend(String name,String hair,boolean glasses,String skirt,String color){
        this.name = name;
        this.hair = hair;
        this.glasses = glasses;
        this.skirt = skirt;
        this.color = color;
    }

反而不会报错,因为每个class会默认拥有一个空构造方法。

这边我们需要加上这个空构造。

public GirlFriend() {
    
}

就不报错了。

public class TestGirlFriend {
    public static void main(String[] args) {
        GirlFriend gf = new GirlFriend();
    }
}

4.单一职责原则

不知道你有没有发现,我们为了测试,是单独写了一个测试类的。

为什么我们不把main方法直接写在GirlFriend类中呢?

这是因为,我们要满足单一职责原则。

单一职责原则是指一个类应该只负责一项职责,这意味着一个类应该只有一个引起它变化的原因。具体来说,单一职责原则要求我们将类划分成若干个只负责一件事情的小类,而不是让一个类承担多个职责。这样做的好处在于,当一个类只负责一件事情时,它就变得非常简单,并且它的变化也会变得很小。

例如,如果一个类同时负责存储数据打印数据,那么当我们需要更改数据存储方式时,这个类就必须发生变化,而如果按照单一职责原则将这两个功能分开,那么就可以使变化的影响降到最低。

所以,对于GirlFriend类,我们就只是保存一些属性而已,那是你找对象的标准,而不应该把测试的方法也写在同一个类中。

一个类的职责不能太多,这样你的类才能够被复用。

单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的 可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职 责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多 个职责总是同时发生改变则可将它们封装在同一类中。

之所以会出现单一职责原则就是因为在软件设计时会出现以下类似场景:T负责两个不同的职责:职责 P1,职责 P2。当由 于职责 P1 需求发生改变而需要修改类 T 时,有可能会导致原本运行正常的职责P2 功能发生故障。也就是说职责 P1 和 P2 被耦合在了一起。 解决办法:遵守单一职责原则,将不同的职责封装到不同的类或模块中。分别建立两个类 T1、T2,使 T1 完成职责 P1 功 能,T2 完成职责 P2 功能。这样,当修改类 T1 时,不会使职责 P2 发生故障风险;同理,当修改 T2 时,也不会使职责 P1 发生故障风险。

单一职责原则,是整个面向对象的基础。

5.new关键字和内存分配

GirlFriend gf = new GirlFriend();

我们用new关键字可以创建对象,上面的代码其实是两个步骤。

GirlFriend gf;
gf = new GirlFriend();

第一步只是创建了一个局部变量gf,gf是存储在中的。 第二步是用new关键字结合GirlFriend空构造方法,在中开辟了一块内存空间,并把内存地址赋值给中的gf变量。

关于堆栈,其实就是两块不同的内存。

栈一般存储的是基本数据类型,以及局部变量。堆一般存储的是动态的对象。

在 Java 中,堆和栈是两个不同的内存区域,用于存储不同类型的数据。

堆(heap)是一个运行时内存区域,用于存储对象实例。所有对象实例都在堆上分配内存。堆内存是动态分配的,也就是说,程序在运行时可以随时申请或释放内存。

栈(stack)是一个高速缓存区域,用于存储线程的局部变量、方法调用信息以及操作数。栈内存是静态分配的,也就是说,在程序运行之前就已经分配好了。

在 Java 中,所有的基本数据类型(如 int、double 等)和对象的引用(即指向对象实例的指针)都是在栈上分配内存的。而对象实例本身则存储在堆上。

举个例子,假设我们有一个 Dog 类,并在 main 方法中创建了一个 Dog 对象:

Dog dog = new Dog();

在这里,dog 是一个引用,它存储在栈上。而 new Dog() 创建的 Dog 对象实例则存储在堆上。

总之,堆用于存储对象实例,而栈用于存储基本数据类型和对象的引用。

6. 可以有多个引用

刚才的例子:

GirlFriend gf;
gf = new GirlFriend();

gf是变量,但是因为赋值的是一个实例对象,没错哈,new出来的对象叫做实例对象。

那么变量gf又有了一个新的名字,叫做引用。(其实本质还是一个变量哈)

gf就好比一把钥匙,实例对象好比是一间屋子,你有了钥匙就可以去实例对象中溜达溜达,塞进去一些东西,也可以拿出来一些东西。

比如,你可以调用里面的方法。

public class TestGirlFriend {
    public static void main(String[] args) {
        GirlFriend gf;
        gf = new GirlFriend();
        gf.setHair("长发");
        gf.setColor("肤白貌美");
        gf.setGlasses(true);
        gf.setName("小美");
        gf.setSkirt("jk");
    }
}

房子是一个,引用可以是多个,你只需要用“=”进行赋值操作即可。

GirlFriend gf2 = gf;
System.out.println(gf == gf2);

答案是true,因为gf保存的是GirlFriend对象在堆中的地址,那么你做的只不过是把这个地址传给了gf2,现在就相当于有两把钥匙,都指向了同一个对象。

7.课后作业

设计一个宠物类Pet,构造方法用于接收宠物的名字、类型及性别,实例化宠物后,可以用实例化的宠物对象来访问宠物的名字、类型及性别,并实现宠物的叫声功能,要求叫声不同类型的宠物不同,实现叫声时可以显示出宠物的名字和类型。

有任何不懂的地方,可以点击下方的“发消息”给我留言。

PS:从这一节开始,欢迎你使用任何你喜欢的IDE完成作业,比如eclipse,IDEA,如果不会使用工具,可以去B站搜索相关的视频进行学习哈。

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

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

相关文章

layer2 实现方式之状态通道

状态通道也算是一种比较热门的扩容方案,状态通道解决方案通过将链下交互和链上清算隔离开,能够在保障一定程度的非中心化和资产安全性的同时,实现速度更快、费用更低的交易。状态通道作为一种链下扩容方案,从一般到特殊分为通用状…

时光飞逝,博客两周年啦

原文链接:时光飞逝,博客两周年啦 博客自 2020年12月10日 运营以来,已经成功走过两年啦(差点成为两年半的博主)。 在这两年中,曾替无数网友解答了各种关于建站的疑难杂症,此处略过 30000 字。 …

linux系统动态库的连接

前言:在应用程序开发过程中,难免会用到第三方库,有的是开源的第三方库,有的是不开源的,还有的是自己写的库。上篇文章总结了应用程序调用静态库《linux中静态库编译与使用》,本文总结了几种在应用程序中快速…

八、esp8266建立基本网络服务器

1、网络服务器 (1)网络服务器有很多类型,它们功能十分丰富。通常承担网络服务器工作的设备都是运算能力比较强大的电脑。 (2)ESP8266虽然也能实现网络服务器的一些功能,但是毕竟它的运算能力是无法与那些昂贵的服务器电脑相比较,因此ESP826…

STM32的升级--ICP/ISP/IAP

ICP/ISP/IAP 区别 ICP(In-Circuit Programing): 通过J-Link/SWD等下载器烧写程序,上位机需要借助其他硬件的参与才能更新固件,可以更新MCU的所有存储区域; ISP(In-System Programing): 通过MCU出厂时固化的一个bootloader升级程序&#xff0…

第四节 空间参考类的属性说明

空间参考类:SpatialReference 说明 空间参考类是arcpy下面的一级类,用于定义空间参考的各类信息,主要是坐标信息。 空间参考Spatial Reference与坐标系最大的区别,在于空间参考除了定义坐标系以外,还要定义一系列地理…

Java BigDecimal总结

文章目录Java BigDecimal总结概述float 和 double的问题创建BigDecimal对象BigDecimal.valueOf()源码分析equals() 和 compareTo()BigDecimal设置精度和舍入模式舍入模式介绍BigDecimal转字符串DecimalFormat 格式化总结Java BigDecimal总结 概述 BigDecimal类在Java的java.m…

一个简单的数学问题

这个东西发提问没人看就发在这里了 一个球体的体积V_Sphere是容易求的: 则我们很容易求出半径为1的圆球的体积为. 众所周知方程【】在三维笛卡尔坐标系中的图像为一个半径为R的圆, 则R取1时这个方程的图像就成了一个半径为1的圆。 那么我们就能推出f(x…

飞行机器人专栏(九)-- 多传感器固定端口分配

目录 ​编辑 1 /dev/设备列表 2 ttyUSB*端口ID 3 端口别名rules动态绑定 4 launch文件配置 1 /dev/设备列表 lsusblsusb -t 2 ttyUSB*端口ID 查看/dev/ttyUSB* 设备端口ID :0403:6014 找到对应USB的设备ID,这里是 0403:…

测试新风向|视频 AI 转流程图初体验

前言: 😄作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:…

极狐GitLab include 语法减少 CI/CD Pipeline 代码冗余,提升构建效率

项目经理:我们有个 Java 的新项目要开始了,需要你帮忙设置调试一下 CI/CD Pipeline DevOps 工程师:好的,没问题 ONE WEEK LATER... 项目经理:新项目的 CI/CD Pipeline 咋样了啊,我看研发还是手动人肉编译…

基于Vue+SpringBoot的在线考试系统,支持多种题型,含数据库文件

spring-boot-online-exam 完整代码下载地址:基于VueSpringBoot的在线考试系统 快速体验 在安装了docker的机器上执行如下命令: 安装mysql: docker run --name exam-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDaA111111 -d mysql:5.7.15然后用doc/sql…

freeswitch的gateway实现出中继的主备方案

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 某些呼叫场景中,我们有2条出中继线路可选,2条出中继需要按照主备模式来配置,优先使用主中继呼叫,当主中继出现问题时,呼叫自动转移到备用中继呼叫。 本节中&a…

正大国际期货:恒指操作技巧之交易中五种绝佳的开仓思路分析

很多人总是亏损,其实最重要的原因之一是没有一个优势的概率系统,正大IxxxuanI经过了解之后,对目前市面上概率系统进行总结,现将以下几种优势的概率系统归纳罗列如下,有缘者定可举一反三,或可为你细化和改良…

Android中GRPC的使用-拦截器

在构建GRPC应用程序时,无论是客户端应用程序,还是服务端应用程序,在远程方法执行之前后之后,都可能需要执行一些通用逻辑。在GRPC中可以拦截RPC的执行,来满足特定的需求,如日志、认证、性能度量指标等&…

基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离

一、篇头 本文介绍Platform平台驱动框架,使用此框架,将可以用上DTS设备树文件,实现设备的静态枚举,实现设备与驱动的分离。 本文基于Amlogic T972 , Android 9.0, 内核版本 4.9.113 二、系列文章 第1篇&a…

【Docker基础篇】一文完成快速使用

Docker基础篇前言Docker是什么?Docker与传统虚拟机技术区别Docker作用、为什么用docker原理Docker常用命令案例展示redis各种软件安装打包到本地、上传到远程仓库打包到本地推送到远程仓库前言 所有的权威均来自与官方,如有疑问请参考官网文献。人非圣贤…

网络厂商 Aruba 2022 年业绩成倍增长的经验是什么

转眼,2022 年马上就要结束了。 在多重不确定的经济环境之下,网络厂商 Aruba 中国在 2022 年的业绩,与上一财年相比仍然实现了成倍的增长。今年初,CSDN 曾采访过 Aruba 中国区的管理者 Aruba 中国区总经理谢建国与 Aruba 北中国区大…

alpine的介绍与使用

目录 1. alpine 简介 2. 基于alpine构建jdk8镜像 2.1 Dockerfile 2.2 将构建目录上传到linux中 2.3 执行构建 3. 镜像瘦身 4. 上传阿里云镜像仓库 1. alpine 简介 Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl …

【车间调度】基于卷积神经网络的柔性作业车间调度问题的两阶段算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…