【Java初阶(五)】类和对象

❣博主主页: 33的博客❣
▶文章专栏分类: Java从入门到精通◀
🚚我的代码仓库: 33的代码仓库🚚

目录

  • 1. 前言
  • 2.面向对象的认识
  • 3.类的认识
  • 4. 类的实例化
    • 4.1什么是实例化
    • 4.2类和对象的说明
  • 5.this引用
  • 6.对象初始化
    • 6.1 构造方法
  • 7.static关键字
  • 8.代码块
    • 8.1 普通代码块
    • 8.2构造代码块
    • 8.3 静态代码块
    • 8.4 代码块执行顺序
  • 9.总结

1. 前言

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好,那么何为对象?何为类呢?这篇文章博主将会详细进行讲解。

本章重点:

掌握类的定义方式以及对象的实例化,类的构造方法,类中的成员变量和成员方法的使用,对象的整个初始化过程。


2.面向对象的认识

在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。我们可以借助人洗衣服的例子来进行思考。
传统的方式:注重洗衣服的过程,少了一个环节都不行,如下:
在这里插入图片描述
现代洗衣服方式,如下:
在这里插入图片描述

总共有4个对象:人,衣服,洗衣液,洗衣机
整个过程:人,衣服,洗衣液,洗衣机之间交互完成,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,不需要关心洗衣机如何洗的衣服。


3.类的认识

类是用来对一个实体(对象)来进行描述的。主要描述对象的属性,哪些功能是干啥的。
类的定义格式如下:

class ClassName{  field;  // 字段(属性) 或者 成员变量method; // 行为 或者 成员方法     
}

属性:是用来描述类的,称之为类的成员属性或者类成员变量。
方法:主要说明类具有哪些功能,称为类的成员方法。
以洗衣机为例:

class WashMachine{public String brand;   // 品牌public String type;    // 型号public double weight;  // 重量public double length;  // 长public double width;  // 宽public double height;  // 高public String color;   // 颜色  public void washClothes(){   // 洗衣服int a;//局部变量,进入方法时创建,出方法时销毁System.out.println("洗衣功能");}  public void dryClothes(){    // 脱水System.out.println("脱水功能");}  public void setTime(){       // 定时System.out.println("定时功能");}}

4. 类的实例化

4.1什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型与int,double类似,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:WashMachine它是类(一种新定义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

//小狗的类
class PetDog {public String name;//名字
public String color;//颜色
// 狗的属性
public void barks() {System.out.println(name + ": 旺旺旺~");}// 狗的行为
public void wag() {System.out.println(name + ": 摇尾巴~");}}//实例化
public class Main{public static void main(String[] args) {PetDog dog = new PetDog();     //通过new实例化对象dogh.name = "阿黄";dogh.color = "黑黄";dogh.barks();dogh.wag();}}

输出结果:
阿黄:旺旺旺~
阿黄:摇尾巴~
在这里插入图片描述


4.2类和对象的说明

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
  2. 类是一种自定义的类型,可以用来定义变量.
  3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

5.this引用

先看一个日期的例子:
//日期类

public 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 void printDate(){System.out.println(year + "/" + month + "/" + day);}public static void main(String[] args) {// 构造三个日期类型的对象 d1 d2 d3Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();// 对d1,d2,d3的日期设置d1.setDay(2020,9,15);d2.setDay(2020,9,16);d3.setDay(2020,9,17);// 打印日期中的内容d1.printDate();d2.printDate();d3.printDate();}}

问题1
我传了3个日期到setDay里面,那么seDay如何知道设置哪一个对象呢?printDate又是如何知道要打印哪一个呢?
其实,this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。例如

ublic void setDay(Date this,int y, int m, int d){year = y;month = m;day = d;}public void printDate(Date this){System.out.println(year + "/" + month + "/" + day);}

在这里插入图片描述
问题2.
如果 形参名与成员变量名相同,那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?

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

实际上是局部变量赋给自己,并没赋值给成员变量,最后的输出结果就为0。如果要把形参的值赋给成员变量,该如何修改呢?这个时候就可以用this引用:this引用的是调用成员方法的对象。

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

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

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

6.对象初始化

通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败,但是在定义成员变量中,我们并没有初始化也没报错,为什么呢?那是因为对于一个成员变量来说,在没有初始化之前都有一个默认值,引用类型默认是null,其余简单类型默认为0,boolean类型是false。


6.1 构造方法

构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
构造方法特点:

1.名字与类名相同,没有返回值类型,设置为void也不行。
2.一般情况下使用public修饰。
3. 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次。
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。
5. 当我们没有写任何构造方法时,会默认存在一个无参构造方法,只要存在任何一种构造方法,编译器都不会再提供。

:为日期类实例化一个对象

Date  date=new  Date ();//实际上,没有写构造默认默认调用了无参构造方法
public Date ((int year, int month, int day){this.year = year;this.month = month;this.day = day;
}//带有参数的构造方法
Date  date=new  Date (2024,3,3);//调用有参的构造方法

可以通过this来调用其他构造方法

public Date (){this(2024,3,3)//必须写在第一条语句中!!
}
public Date ((int year, int month, int day){this.year = year;this.month = month;this.day = day;
}

7.static关键字

在学生类实例化三个对象s1、s2、s3,每个对象都有自己特有的名字、性别,年龄,学分绩点,班级等成员信息,这些信息就是对不同学生来进行描述的,如下所示:

class Student {public String name;public String sex;public int age;public double score;public   String classRoom;public Student(String name, String sex, int age, double score,String classRoom) {this.name = name;this.sex = sex;this.age = age;this.score = score;this.classRoom=classRoom;}
}
class Main{public static void main(String[] args) {Student s1 = new Student("Li leilei", "男", 18, 3.8,"112");Student s2 = new Student("Han MeiMei", "女", 19, 4.0,"112");Student s3 = new Student("Jim", "男", 18, 2.6,"112");}}

在这里插入图片描述
此时,3名同学都在一个班,只要有一份就行了,不需要在每个对象中都去表示那么该如何修改呢?其实只需要把classRoom变成以static修饰,那么这时这个成员变量就不属于这个对象了。

public   String classRoom;

这时候如果我们要调用classRoom这个变量,就不再需要new一个对象了,只需要用类名来进行访问。

 System.out.println(Student.classRoom);//合理System.out.println(Student.classRoom);//不合理

如果一个方法被static修饰,那么这个方法也不依赖任何对象。


8.代码块

使用{}定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:

  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块

8.1 普通代码块

普通代码块:定义在方法中的代码块。

 public class Main{public static void main(String[] args) {{ //直接使用{}定义,普通方法块int x = 10 ;System.out.println("x1 = " +x);}int x = 100 ;System.out.println("x2 = " +x);}}

8.2构造代码块

**构造块:**定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

public class Student{//实例成员变量private String name;private String gender;private  int age;private double score;public Student() {System.out.println("I am Student init()!");}    //实例代码块{this.name = "33";this.age = 12;this.sex = "girl";}    

8.3 静态代码块

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

 public class Student{private String name;private String gender;private int  age;private double score;private static String classRoom;//实例代码块{this.name = "33";this.age = 12;this.sex = "girl";}// 静态代码块
static {classRoom = "111";System.out.println("I am static init()!");}

注意

  • 静态代码块不管生成多少个对象,其只会执行一次
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
  • 实例代码块只有在创建对象时才会执行

8.4 代码块执行顺序

如果几种代码块同时出现在一个类中,执行顺序是怎样的呢?

public class Student {private String name;private String sex;private int  age;private static String classRoom;//实例代码块{this.sex = "girl";System.out.println("我是实例代码块");}// 静态代码块static {classRoom = "111";System.out.println("我是静态代码块");}public Student(String name,  int age) {this.name = name;this.age = age;System.out.println("我是构造方法");}  
}
public class Main {public static void main(String[] args) {Student student1=new Student("zhangsan",12);System.out.println("============");Student student2=new Student("lisi",14);       }
}

输出结果:
在这里插入图片描述
静态代码块最先执行,且执行一次,然后是实例代码块,最后是构造方法。


9.总结

本篇文章主要讲了对象和类的概率,类的定义方式以及对象的实例化,类的构造方法,类中的成员变量和成员方法的使用,对象的整个初始化过程,static关键字应用,代码块的讲解和各种代码块执行顺序,在接下来的文章中我会进一步深入。

下期预告:封装 继承 多态

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

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

相关文章

探索Python中的集成方法:Stacking

在机器学习领域,Stacking是一种高级的集成学习方法,它通过将多个基本模型的预测结果作为新的特征输入到一个元模型中,从而提高整体模型的性能和鲁棒性。本文将深入介绍Stacking的原理、实现方式以及如何在Python中应用。 什么是Stacking&…

算法-数据结构

算法-数据结构 金无足赤人无完人,在处理实际问题的时候我们可以使用到很多合适的数据结构,但目前还没有一个数据结构可以称的上完美。查询速度快的,插入的速度就会慢;插入速度和查询速度都快得,占用的空间就会多&…

PTAxt的考研路

xt是我院19级专业第一,但他认为保研并不能展示他全部的实力,所以他在22年初试一结束就加入了23考研的队伍中,并且他为了填补我院近些年来无北大研究生的空白,毅然决然决定扛起19级的大旗,在学校百年华诞之际献上他最诚…

Springboot项目之mybatis-plus多容器分布式部署id重复问题之源码解析

mybatis-plus 3.3.2 部署多个pod id冲突问题 配置: # 设置随机 mybatis-plus.global-config.worker-id: ${random.int(1,31)} mybatis-plus.global-config.datacenter-id: ${random.int(1,31)}源码解析:MybatisSqlSessionFactoryBean 重点&#xff1a…

mysql数据库查询

MYSQL数据库的搭建 今日目标: 1.搭建数据库 2.实现数据库的增删改查 00-回顾 #dos的常用指令 1. 切换盘符: 盘符名: 2. 切换上一级: cd ../ 3. 切换下一级: cd 目录名 4. 查看当前目录下的所有子目录和子文件: di…

光明源@智慧公厕赋能“厕所革命”主要体现在哪些方面?

当我们提及厕所,不再仅是简单的卫生设施,而是一种对生活品质的关怀与呵护。智慧公厕,作为厕所革命的引领者,以其独特的拟人魅力,彰显着人性化关怀的新风尚。今日,让我们一同探索,智慧公厕是如何…

数据库备份工具(实现数据定时覆盖)

数据库备份工具(实现数据定时覆盖) 永远热爱,永远执着! 工具介绍 自动化测试数据库更新调度程序 这段 Python 脚本自动化了每天定时从生产数据库更新测试数据库的过程。它利用了 schedule 库来安排并执行每天指定时间的更新任务…

在for循环加判断条件当条件都满足时,同时显现的解决方法

一、代码示例 function fu(s) {str ;ste ;console.log(s);let Things s;for (let i 0; i < Things.length; i) {if (Things[i].pid kk) {console.log(Things[i].pid);ste <div class"commodity_nei"><div class"zxc_pic"><div cl…

[CISCN2019 总决赛 Day2 Web1]Easyweb ----不会编程的崽

CISCN的题质量还是很高的。 又是这熟悉的登陆界面。爆破&#xff1f;sql&#xff1f;还是xxe等。先看源码 估摸着也是sql注入。但似乎不是常规注入。同时扫描后台的结果应该也出来了&#xff0c;发现robots.txt 有点懵&#xff0c;后边看了大佬的wp才知道&#xff0c;提示的是*…

车载测试工具 canoe如何使用

其实canoe的使用非常的简单&#xff0c;结合自己的工作项目多多操作就可以了

openssl 升级1.1.1.1k 到 3.0.13

下载 https://www.openssl.org/source/ tar -zxvf openssl-3.0.13.tar.gzcd openssl-3.0.13/./config enable-fips --prefix/usr/local --openssldir/usr/local/opensslmake && make install 将原有openssl备份 mv /usr/bin/openssl /usr/bin/openssl.bak mv /usr/i…

LeetCode Python - 73. 矩阵置零

目录 题目描述解法方法一&#xff1a;数组标记方法二&#xff1a;原地标记 运行结果方法一方法二 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;…

项目立项管理

目录 1.概述 2.项目建议与立项申请 3.项目可行性研究 3.1.内容 3.2.初步可行性研究 3.3.详细可行性研究 4.项目评估与决策 5.总结 1.概述 本文的目录结构参考了《信息系统项目管理师教程&#xff08;第四版&#xff09;》。 项目立项管理是一项全面评估准备投资工程的多…

Redis到底是多线程还是单线程?

Redis6.0之前&#xff1a;是单线程模式。 Redis6.0之后&#xff1a;Redis的IO线程是多线程&#xff0c;worker线程是单线程。 Redis6.0之前&#xff1a;单线程 Redis6.0之后&#xff1a;Redis的IO线程是多线程&#xff0c;worker线程是单线程。

适用于 Android 的 10 个优秀的数据恢复工具

在当今快节奏的数字时代&#xff0c;丢失 Android 设备中的重要数据可能是一场噩梦。无论是难忘的照片、重要的联系人还是重要的工作文档&#xff0c;您都需要一个可靠的恢复工具来恢复您的数据。值得庆幸的是&#xff0c;有许多高效的 Android 数据恢复工具可以帮助您恢复丢失…

【python】flask各种版本的项目,终端命令运行方式的实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

操作系统面经-多线程同步的四种方式

对于多线程程序来说&#xff0c;同步是指在一定的时间内只允许某一个线程来访问某个资源。而在此时间内&#xff0c;不允许其他的线程访问该资源。可以通过互斥锁&#xff08;Mutex&#xff09;、条件变量&#xff08;condition variable&#xff09;、读写锁&#xff08;reade…

XUbuntu22.04之跨平台日历工具(二百二十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

ChatGPT编程秘籍:轻松学习人工智能写作

ChatGPT无限次数:点击直达 html ChatGPT编程秘籍&#xff1a;轻松学习人工智能写作 引言 人工智能技术的发展给写作领域带来了革命性的变化&#xff0c;其中自然语言生成&#xff08;NLG&#xff09;技术的发展尤为引人注目。ChatGPT是一款基于大规模预训练模型的人工智能…

数据结构与算法-排序算法

1.顺序查找 def linear_search(iters, val):for i, v in enumerate(iters):if v val:return ireturn 2.二分查找 # 升序的二分查找 def binary_search(iters, val):left 0right len(iters)-1while left < right:mid (left right) // 2if iters[mid] val:return mid…