Java 类和对象详解(上 )

 

个人主页: 鲤鱼王打挺-CSDN博客

Java专栏:https://blog.csdn.net/2401_83779763/category_12801101.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12801101&sharerefer=PC&sharesource=2401_83779763&sharefrom=from_link

🏫前言: 

类与对象的学习是一个碎片化的过程,知识是很碎片的拼凑,所以今天小编整理了类和对象的详细知识,通过是什么,怎么做,慢慢走进类与对象,希望给你带来帮助!

面向对象 和 我们过去的 面向过程有什么区别呢?

可以这么说,把大象塞进冰箱里分为几步?

  1.打开冰箱

  2.把大象塞进去

  3.关上冰箱门

至于我怎么把大象塞进冰箱里的,我并不关心,因为我不面向过程。同样的,在面向对象时,我们并不关心过程,只需要把过程交给"对象"去做。面向对象程序设计的主要步骤是:定义类->用类创建对象。别急,下面我们来深入讲讲。

目录

🏫前言: 

💯一. 类和对象的概念

⭐️1.什么是一个类?

⭐️2.一个类里有什么?

⭐️3.什么是对象?

💯二.类的实例化

⭐️1.什么是实例化?

⭐️2.如何实例化 ?

💯三.构造方法(构造器)

⭐️1.什么是构造方法

⭐️2. 初始化

⭐️3.this关键字

3.1 为什么要有this引用?

3.2 什么是this引用

3.3 this引用的特性

⭐️4.构造器的使用

4.1

4.2

4.3

4.4 

 格式:

4.5

💯四.public修饰符

 💯五.封装

⭐️1. 访问限定符 

⭐️2. 包 

2.1 什么是包

 2.2 怎么创建一个包

2.3 如何导入包

2.4 default 

🏫六.小结


 

💯一. 类和对象的概念

⭐️1.什么是一个类?

类是对某一具体事物进行抽象的概念,构建一个描述事物主要特征,行为的框架。

通俗点说,类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。

如下图,我们打开idea敲代码要创建的就是一个类。

 

⭐️2.一个类里有什么?

一个Java 类中通常由成员变量(字段),成员方法,构造方法组成(其余的如 代码块,我们下文慢慢揭开)。类名一般用大驼峰命名。

注意:成员变量和成员方法不能称为类变量,类方法。

成员方法一般使用小驼峰命名!

一般一个文件当中只有一个类。

如下图:成员变量 一般由修饰符 变量类型 变量名组成,可以赋予初始值,我们称为就地初始化

如果没有初始化,也会有默认值,如int类型默认为 0 ,boolean 类型默认为 false, String类型默认为 null。

 

 

⭐️3.什么是对象?

当我们 构造完一个类,在此基础上,我们可以创建对象,通过对象可以对成员变量进行初始化,也可以调用成员方法。

💯二.类的实例化

⭐️1.什么是实例化?

通过new 关键字, 配合类名 就可以实例化对象。即用类类型(实际上类就相当于是我们直接定义的一个类型,int,char则是计算机定义的类型)创建对象的过程称为实例化。 

class Person {
    //成员变量
    String name;
    String gender;
    int age;
    public String toString() {
        return "name= " + name  +
                ", gender= " + gender +
                ", age= " + age ;
    }

}

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "taotao";
        p.gender = "男";
        p.age = 18;
        System.out.println(p.toString());
    }
}

 

⭐️2.如何实例化 ?

上图中,我们用new 关键字创建了一个对象 p 。

然后使用 . 来访问对象中的属性和方法。(对象.成员变量 / 对象.成员方法)实际上可以理解为c语言上的指针,实例化的对象会占用物理空间。可以这样巧记:对象都扎堆扎堆的。

同一个类可以创建多个实例。

 

💯三.构造方法(构造器)

⭐️1.什么是构造方法

我们先浅谈一下构造方法,再慢慢引入!

1.构造方法(也称为构造器)是一个特殊的成员方法它用于对象实例化,名字必须与类名相同注意Java大小写敏感!在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。

2.构造器没有返回值,也没有返回类型(void类型也不可以)。

3.构造器可以进行方法的重载,常见的如在一个类中有一个无参构造器和一个有参构造器。

4.构造器一般使用public修饰符

5.构造方法不是必须的。

6.构造方法只能通过new 或 this 调用

⭐️2. 初始化

在Java中,对象成员(即成员变量)的默认初始值取决于其数据类型。以下是常见数据类型及其默认初始值:

  1. 基本数据类型:

    • byte:0
    • short:0
    • int:0
    • long:0L
    • float:0.0f
    • double:0.0
    • char:'\u0000'(空字符)
    • boolean:false
  2. 引用数据类型(如对象、数组等):

    • 默认值为null

这些都不重要,我们来思考一个问题:为什么局部变量没有初始化会报错,而成员变量没有初始化不会? 

 

答案就是:成员变量会由计算机赋予默认值。

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

1. 检测对象对应的类是否加载了,如果没有加载则加载

2. 为对象分配内存空间

3. 处理并发安全问题比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

4. 初始化所分配的空间即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。

5. 设置对象头信息

6. 调用构造方法,给对象中各个成员赋值。

初始化分为默认初始化,还有上文讲到的就地初始化,以及下文即将讲到的通过构造方法初始化。 

⭐️3.this关键字

3.1 为什么要有this引用?

问题一: 

调用一个成员方法setDay

class Date {
    public int year;
    public int month;
    public int day;
    public void setDay(int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }
    public String Print(){
        return year+"年"+month+"月"+day+"日";
    }
}

public class Main {
    public static void main(String[] args) {
        Date d1 = new Date();
        d1.setDay(2024,10,17);
        System.out.println(d1.Print());
        System.out.println("=============");
        Date d2 = new Date();
        d2.setDay(1999,10,1);
        System.out.println(d2.Print());
    }
}

  

 若形参改成这样

public void setDay(int year, int month, int day){
        year = year;
        month = month;
        day = day;
    }

 

那么我们怎么判断谁给谁赋值呢?其实这是有迹可循的,我们可以发现,这样的代码编译器并不会报错,其实这是一个自己给自己赋值的过程。成员变量可以与局部变量有相同的名字,但是赋值时,局部变量优先!也正是这"争强好胜"导致了代码逻辑有问题! 

 那么怎么避免,或者说怎么解决形参与成员变量同名的情况呢,毕竟这难以避免。 答案呼之欲出,就是this关键字。

问题二: 

每个方法只有一个,该方法是怎么知道给哪个对象的成员进行赋值呢?

其实,每个方法都有一个隐藏的引用参数this!哈哈很神奇吧。 this的类型是一个 类 类型!

public void setDay(Date this,int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public String Print(Date this){
        return this.year+"年"+this.month+"月"+this.day+"日";
    }

 

通过调试我们也可以发现this后面的值与d2后面的值一样(因为小编把断点打在d2了),说明它俩就是同一个东西。 就像我们学的方程,把鸡的只数设为x,其实x就是鸡的只数。

3.2 什么是this引用

虽然有时候并不影响代码,在我们学习了this之后,调用成员变量时最好都加上this,提高代码的可读性。

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

1.通过this 来访问当前对象的成员变量 this.day

2.通过this 来访问 当前对象的成员方法 this.Print()

3.下文:通过this来调用当前对象其他的构造方法 this() 

3.3 this引用的特性

1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

2. this只能在"成员方法"中使用(下文会提到)

3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

4. this是“成员方法” 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收

⭐️4.构造器的使用

现在我们加入情景慢慢了解:

构造器的格式直接拉到下文代码!

4.1

不是说构造器是类的一部分吗?为什么我们不定义构造器也能正常运行?

其实在进行编译时,系统会自动增加一个无参数,空的构造方法。也就是一个无参构造器。

 

4.2

当我们定义了构造器后,系统还会自动增加无参构造器吗?

不会,所以如果我们只定义了一个有参构造器时,在main方法中调用无参构造器就会报错!

俗话说救穷不救急······

从下图可以发现我们new 的构造器就是一个无参构造器!所以说构造器是类的一部分!! 

 

4.3

普通成员方法中 this 可以引用构造方法吗?

不可以!! 但是可以引用其他成员方法,以及下文要讲的,构造方法才能互相调用!

 

 

4.4 

每个构造器都可以互相调用吗?

不可以!!!构造方法之间的调用不能闭环,如下图。

 

如下图,增加无参构造器,同时调用两参构造器,结果如下 

 

这应该是显而易见的,总不能左脚踩右脚起飞吧? 

 注意:千万不要写成这样哦!

这个问题就是,直接传递给有参构造器的是你的三个成员变量,在 Java 中,调用构造方法时,必须首先调用父类构造方法,而且在调用构造方法之前,不能使用当前对象的实例变量。但是你这里调用了this,他就不会隐式的去使用super调用父类的无参构造器去。那么是无法直接使用成员变量的,你需要自己创建三个值,传给你的有参构造器。

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。 

 格式:

public class Person {
    //成员变量
    private String name;
    private String gender;
    private int age;

    //构造方法 没有形参
    public Person(){
    }

    //重载构造方法 三个形参
    public Person(String name,String gender,int age){
        System.out.println("这是第二个构造方法");
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    //重载构造方法 同样形参不同位置
    public Person(String name,int age,String gender){
        this(name,gender,age);//必须在第一行
        System.out.println("这是第三个构造方法");
    }
}

4.5

与类同名的不一定就是构造方法。 比如在构造方法前加入变量类型就会变成一个成员方法,大家动手试试!

看到这里大家应该眼睛也疲劳了,看看小编新换的idea背景吧! 不知道怎么换的可以搜一下教程

💯四.public修饰符

下图中为什么成员变量前面还有一个private?为什么类前面还有一个public?

我们知道面向对象具有 隐蔽性!这里就很好的体现了,举个例子:银行只提供给你的账户余额和 取款的功能,它不会告诉你用户存下的身份证,密码等等。它只提供对外开放的内容。

这时我们就会用private来让成员变量不能被创建的对象直接使用。

private就是访问限定符。public,protected ,default都是访问修饰符。后续慢慢详解。

public:可以理解为一个人的外貌特征,谁都可以看得到

default: 对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了(也是什么都不写时的默认权限)

private:只有自己知道,其他人都不知道

protected:主要是用在继承中

而我们class前的public则可以表示可以自由使用,所以我们上文提到的构造方法一般使用public修饰符。 main方法使用的也是public 类型。

上图中发现name无法被对象调用,那我们要怎么使用它呢?

我们可以定义一个public 方法如下: 

那有同学 就说了这一个一个写也太麻烦了吧,这隐蔽性不要也罢,别急编译器为我们提供了自动生成的功能!如下:在类内按右键

 

可以看到能生成getter和setter方法,也可以生成构造器(Constructor)。按住shift键可以多选。 

 💯五.封装

有了前文对private和public的简单介绍,我们可以很清楚的了解封装。

对象有四个特征:隐蔽性,抽象性,继承性,多态性。封装就是使用private修饰符,使一个成员变量或成员方法等私密化。前文我们可知,我们并不关心过程,所以我们的封装是很有必要的。 

⭐️1. 访问限定符 

 public详细看上文。 

 

⭐️2. 包 

2.1 什么是包

包可以理解为一个文件夹,我们进入编译器时就可以对包进行命名,不过初学时我们一般略过它,直接命名class。而编译器自带一个包src,我们直接命名的class就在src中。

为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。

包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一 个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在 不同的包中即可。

 

 2.2 怎么创建一个包

包的命名一般是域名的倒置,如下: 

 

 

 

不同包的类名可以重复 

2.3 如何导入包

我们使用scanner方法时,使用import 加包的名称再加上包中的类,就可以调用包中类的方法。我们也可以按住ctrl加方法名进入源码: 

同样的 我们可以用import调用自定义包。

 

但是此时如果此时自定义包中的类名与当前类名相同就会出现报错,

所以使用时尽量不出现同名类。

 导入分为静态导入和非静态导入,后面我们会再深挖。

2.4 default 

 default不能这么用的哦,它既不是放在类前,也不能放在变量前,当类名或变量名前没有修饰符时,就默认为default,而类也只能为默认或public型。

 

下图可以看到同一包中可以直接调用Person类 

 

下图可以看到不同包中就不可以直接调用Person类  ,需要导入Person所在的包。

 

🏫六.小结

 由于时间问题,本期关于类和对象的讲解就到这里,我们下期会讲讲static,代码块完善对类的认识,以及深入探讨继承和多态。制作不易,希望可以点赞关注支持一下小编!万分感谢!

本章相关知识点有摘自教材:《Java程序设计教程》 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github下载文件的两种方式(非git形式)

1.以下面的图为例 ,可以直接点击右上方的绿色Code按键,在弹出的列表中选择Download Zip选项,即可下载。 2.如果下载的是单独的某一个文件,则可以按照下图的格式点击下图所示的那个下载的图标即可。

研发线上事故风险解读之缓存篇

专业在线打字练习平台-巧手打字通,只输出有价值的知识。 一 前言 本文继续基于《线上事故案例集》,进一步深入梳理线上事故缓存使用方面的问题点,重点关注缓存在使用和优化过程中可能出现的问题,旨在为读者提供具有实践指导意义的…

ThinkPHP5bootstrapMySQL开发学习平台(包括后台管理功能、PC端网页、移动端网页)手把手运行源码

一、项目预览(全部源码链接在最下面) 功能及页面持续优化中...... 二、本地运行方式 1、下载源码包进行解压(源码在最下面) 2、下载phpstudy_pro,并运行Apache&MySQL 3、打开phpstudy_pro按照根目录,复制粘贴解压好的源码包&…

【时时三省】(C语言基础)函数介绍strcmp

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 假如有一个这样的代码 这个代码这样写对不对呢 它是不对的 因为p是一个地址 里面可能是0x5546643 q也是一个地址 所以她们没法这样比较 这个时候就可以用到我们的 strcmp 他就说用来比较字…

微软十月补丁星期二发现了 118 个漏洞

微软将在2024 年 10 月补丁星期二解决 118 个漏洞,并且有证据表明发布的 5 个漏洞被野蛮利用和/或公开披露,尽管微软尚未将其中任何一个漏洞评定为严重漏洞。 在这五个漏洞中,微软列出了两个已被利用的漏洞,这两个漏洞现在都已列…

如何实现安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯

在工业自动化中,实现不同品牌、不同型号设备之间的通讯是确保生产流程顺畅、高效运行的关键。本文详细介绍了安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯的具体方法。 一.软硬件需求 1.一台安川MP3300CPU301,其IP地址是192.…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

考研C语言程序设计_编程题相关(持续更新)

目录 零、说明一、程序设计经典编程题(C语言实现)T1 求1~100的奇数T2 求n!T3 求1!2!3!...10!T4 在一个有序数组中查找具体的某个数字n(二分查找)T5 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚T6 模拟用户登录(三次机会)T7 输入三个数 并从大到小输出T8…

【Ubuntu】在Ubuntu上安装IDEA

【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统&#xff0c;但是还得是要写代码&#xff0c;这样就不可避免地用到IDEA&#xff0c;接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的&#xff0c;直接打开IDEA的下载页面&#xff0c;点击下…

精密仪器制造企业如何保障安全高效的跨网文件交换?

在数字化时代&#xff0c;精密仪器制造企业面临着日益增长的跨网文件交换需求。这些企业通常拥有多个隔离的网络环境&#xff0c;如内网、外网、测试网等&#xff0c;以确保数据安全和合规性。然而&#xff0c;如何在保障数据安全的同时&#xff0c;实现文件的快速、稳定传输&a…

前端学习-css的元素显示模式(十五)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 什么是元素显示模式 块元素 常见的块元素 块元素的特点 注意 行内元素 行内元素的特点 注意 行内块元素 行内块元素的特点 元素显示模式的转换 语法格…

黑马程序员-redis项目实践笔记1

目录 一、 基于Session实现登录 发送验证码 验证用户输入验证码 校验登录状态 Redis代替Session登录 发送验证码修改 验证用户输入验证码 登录拦截器的优化 二、 商铺查询缓存 缓存更新策略 数据库和缓存不一致解决方案 缓存更新策略的最佳实践方案 实现商铺缓…

【UML】一个UML学习的还不错的几个帖子

https://segmentfault.com/a/1190000042775634 寂然解读设计模式 - UML类图&类的六大关系-阿里云开发者社区

学习threejs,网格深度材质MeshDepthMaterial

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️网格深度材质MeshDepthMate…

【数据结构与算法】栈和队列

文章目录 一.栈1.1定义 顺序栈和链式栈1.2基本操作1.2.1表示1.2.2初始化1.2.3清空1.2.4销毁1.2.5入栈1.2.6出栈1.2.7取栈顶 1.3共享栈1.3.1定义1.3.2进栈出栈 二.队列2.1定义 顺序队列和链式队列循环队列2.2基本操作2.2.1初始化2.2.2判空2.2.3求队列长度2.2.4取队头元素2.2.5销…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

我谈Sobel算子与高斯一阶微分的关系

现在算力提升了&#xff0c;最常用的一阶差分边缘检测算子已经不是Sobel算子了&#xff0c;而是高斯一阶微分。 高斯一阶微分 顾名思义&#xff0c;高斯函数的一阶导数。 Derivative of Gaussian 1D 一维直接扩展到二维。 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面…

【python爬虫】携程旅行景点游客数据分析与可视化

一.选题背景 随着旅游业的快速发展&#xff0c;越来越多的人选择通过互联网平台预订旅行产品&#xff0c;其中携程网作为国内领先的在线旅行服务提供商&#xff0c;拥有大量的旅游产品和用户数据。利用爬虫技术可以获取携程网上各个景点的游客数据&#xff0c;包括游客数量、游…

3D Slicer 教程二 ---- 数据集

上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …