JavaSE类和对象(重点:this引用、构造方法)

目录

一、类的定义方式以及实例化

1.面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在Java的世界里一切皆为对象。

2.类的定义和使用

 1.在java中定义类时需要用到class关键字

 3.类的实例化

4.类实例化的使用

 二、this引用

 例子1:this能区分调用方法的对象。

 例子2:this区分局部变量和引用对象。

例子3:建议给对象都加上this.

三、对象的构造及初始化

1.初始化对象

1.通过引用赋值来初始化

2.就地初始化:定义成员变量的同时初始化。(一般不用)

2.构造方法

(1) 不带参数的构造方法

1.这个构造方法是如何被调用的???

 

2.那为什么之前没有写构造方法的时候,也能正常执行show方法呢???

(2) 带参数的构造方法

1.构造方法可以有多个 且 构造方法之间构成重载关系

2.一旦自己写了构造函数,编译器不会自动提供了

3.构造函数快捷键生成

4.使用this()在构造方法内,调用其他构造方法

this()这个语法只能出现在构造方法当中

只能出现在当前构造方法的第一行!!!

注意:不能自己调用自己!!!

(4)this引用的小总结


一、类的定义方式以及实例化

1.面向对象

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在Java的世界里一切皆为对象。

        举个例子:洗衣服

面向过程:人 - 把洗衣粉倒进盆里 - 打开水龙头 - 放衣服 - 搓衣服 - 清水洗 - 再放洗衣粉 - 搓衣服 - 清水洗 - 扭干衣服

面向对象: 人 - 洗衣粉 - 洗衣机

至于洗衣机是左旋转几圈还是右旋转几圈,不在乎洗的过程。

2.类的定义和使用

类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干 啥) ,描述完成后计算机就可以识别了
定义了一个类,相当于在计算机中定义了一种新的类型

 1.java中定义类时需要用到class关键字

class WashMachine{
//属性
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public String color; // 颜色//方法
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}

 3.类的实例化

实例化 :用 定义的类 创建对象,就是类的实例化
 用new关键字实例化对象(同一个类可以实例化多个对象)

以下代码:

PetDog petDog1 = new PetDog();

同理PetDog petDog2 = new PetDog();就是在实例化对象

类相当于是一个模型,用这个模型可以造出很多个对象。所以可以实例化多个对象。

class PetDog{//狗的属性public String name;//名字public String color;//颜色//狗的行为public void barks(){System.out.println(name + ":旺旺旺~~~");}public void wag(){System.out.println(name + ":摇尾巴~~~");}
}
public class Test2 {public static void main(String[] args) {//实例化 :定义了一个类,相当于在计算机中定义了一种新的类型//用 定义的类 创建对象,就是类的实例化//用new关键字实例化对象(同一个类可以实例化多个对象)PetDog petDog1 = new PetDog();petDog1.color = "红色";petDog1.name  = "feifei";//访问实例化对象的属性System.out.println(petDog1.name);System.out.println(petDog1.color);//调用实例化对象的行为petDog1.barks();petDog1.wag();System.out.println("============================");PetDog petDog2 = new PetDog();petDog2.color = "白色";petDog2.name = "huahua";//访问实例化对象的属性System.out.println(petDog2.name);System.out.println(petDog2.color);//调用实例化对象的行为petDog2.barks();petDog2.wag();//        System.out.println(petDog1);//对象的地址
//        System.out.println(petDog2);}
}

4.类实例化的使用

给对象赋值

打印实例化对象的属性,以及 .方法 来调用方法

 结果:

 二、this引用

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

作用:

1.能区分调用方法的对象。date调用的,就对date操作;date2调用的,就对date2操作。
2.区分局部变量和引用对象。避免形参名与对象名相同时,局部变量自己赋值。

 例子1:this能区分调用方法的对象。

方法只有1个,现在有两个实例化对象date和date2,那么在调用这个方法的时候,我们怎么确定
这个方法是给date赋值,还是在给date2赋值?
date.setDate(1999,1,1);//调用setDate方法,传参 1999,1,1
date2.setDate(2000,2,2);//调用setDate方法,传参 2000,2,2
虽然在调用的时候,有写date或者date2,但是进入方法以后,谁知道谁是谁呢?其实,这个方法有个隐藏的函数,Date.this

public class Date {
//属性public int year;//public int year = 2023;//一般不写值,写了相当于默认值public int month;public int day;
//方法public void setDate(int y,int m,int d){year = y;month = m;day = d;}
}  public void print(){System.out.println("year:"+year+" month:"+month+" day:"+day);
}public static void main(String[] args) {Date date = new Date();//实例化一个datedate.setDate(1999,1,1);//调用setDate方法,传参 1999,1,1// 然后进入该方法,y,m,d根据方法里的内容赋值Date date2 = new Date();//又实例化一个date2date2.setDate(2000,2,2);//调用setDate方法,传参 2000,2,2date.print();date2.print();}
}

 例子2:this区分局部变量和引用对象。

给当 传入的形参名,与被赋值的对象名不同时,加不加this,没有任何影响,打印出来时正常的。 相同时,例如:此时形参名year和对象名 year相同,此时赋值,受局部变量优先的影响,形参(year)自己给自己赋值, 这样打印的结果就不是正常的

得到的结果:

public class Date {
//属性public int year;//public int year = 2023;//一般不写值,写了相当于默认值public int month;public int day;
//方法public void setDate(int year,int month,int day){year = year;month = month;day = day;public void print(){System.out.println("year:"+year+" month:"+month+" day:"+day);
}public static void main(String[] args) {Date date = new Date();//实例化一个datedate.setDate(1999,1,1);//调用setDate方法,传参 1999,1,1// 然后进入该方法,y,m,d根据方法里的内容赋值Date date2 = new Date();//又实例化一个date2date2.setDate(2000,2,2);//调用setDate方法,传参 2000,2,2date.print();date2.print();}
}

例子3:建议给对象都加上this.

又得到了预期的结果

所以建议以后写,都加上this,避免这些容易犯的错误

 

public class Date {
//属性public int year;//public int year = 2023;//一般不写值,写了相当于默认值public int month;public int day;
//方法
public void setDate(Date this,int year,int month,int day){this.year = year;this.month = month;this.day = day;
} public void print(){System.out.println("year:"+year+" month:"+month+" day:"+day);
}public static void main(String[] args) {Date date = new Date();//实例化一个datedate.setDate(1999,1,1);//调用setDate方法,传参 1999,1,1// 然后进入该方法,y,m,d根据方法里的内容赋值Date date2 = new Date();//又实例化一个date2date2.setDate(2000,2,2);//调用setDate方法,传参 2000,2,2date.print();date2.print();}
}

三、对象的构造及初始化

1.初始化对象

1.通过引用赋值来初始化

在定义属性的时候一般不赋值,也就是不初始化。

与局部变量不同,局部变量在使用前必须初始化,否则会报错。
而成员变量没有初始化时,有一个默认值。比如int - 0,float - 0.0f,double - 0.0,boolean - false,char - '\u0000'
引用类型例如String - null

2.就地初始化:定义成员变量的同时初始化。(一般不用)

就地初始化:有特殊的业务需求,比如任何一次对象的实例化之后,都期望这个对象叫张三
或者年龄都是9

class Student{public String name ;//没有初始化,默认为nullpublic int age ;//没有初始化,默认为0 
//public String name = "张三";
//public int age = 9;public void eat() {System.out.println(this.name+"吃饭!");}public void show(){//this.eat();//可以在成员方法里,调用另一个成员方法System.out.println("姓名:"+this.name+" 年龄:"+this.age);}
}public class Test {public static void main(String[] args) {/*** 实例化对象*/Student student = new Student();//同过对象的引用来初始化student.name = "zhangsan";student.age = 10;student.show();System.out.println("====================");Student student2 = new Student();student2.name = "lisi";student2.age = 15;student2.show();}
}

2.构造方法

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

构造方法:(非常特殊!!)

1.没有返回值

2.方法名必须和类名一样

特性
1. 名字必须与类名相同
2. 没有返回值类型,设置为 void 也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
4. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )
这是当前类

 这是类里写的构造方法

(1) 不带参数的构造方法

class Student{public String name ;//没有初始化,默认为null// 就地初始化:定义成员变量的同时初始化。public String name = "张三"public int age ;//没有初始化,默认为0 //public int age = 9public void eat() {System.out.println(this.name+"吃饭!");}public void show(){//this.eat();//可以在成员方法里,调用另一个成员方法System.out.println("姓名:"+this.name+" 年龄:"+this.age);}//构造方法public Student(){this.name = "鼠标";this.age = 9;System.out.println("构造方法Student()");}
}
public class Test {public static void main(String[] args) {Student student = new Student();student.show();}}

1.这个构造方法是如何被调用的???

运行代码时,发现调用show()方法之前,先调用了构造方法Student()

        在new Student()这先调用了构造方法public Student,然后在这个构造方法里赋值了,打印了 ”构造方法Student()“这个内容。然后调用了student.show,将属性打印出来 姓名:鼠标 年龄:9

2.那为什么之前没有写构造方法的时候,也能正常执行show方法呢???

        因为,当我们没有写任何一个构造方法的时候,Java会自动提供一个不带参数的构造方法。就是这个样子

    public Student(){}

(2) 带参数的构造方法

1.构造方法可以有多个 且 构造方法之间构成重载关系

class Student{public String name ;//没有初始化,默认为null// 就地初始化:定义成员变量的同时初始化。public String name = "张三"public int age ;//没有初始化,默认为0 //public int age = 9public void eat() {System.out.println(this.name+"吃饭!");}public void show(){//this.eat();//可以在成员方法里,调用另一个成员方法System.out.println("姓名:"+this.name+" 年龄:"+this.age);}/*** 构造方法*///不带参数的构造方法public Student(){this.name = "鼠标";this.age = 9;System.out.println("不带参数的构造方法Student()");}//带参数的构造方法public Student(String name,int age){this.name = name;this.age = age;System.out.println("带参数的构造方法Student(String,int)");}
}
public class Test {public static void main(String[] args) {Student student = new Student();student.show();System.out.println("==================");Student student2 = new Student("小明",19);student2.show();}}

运行结果

可以发现:

1.构造方法可以有多个

2.构造方法之间构成重载关系

2.一旦自己写了构造函数,编译器不会自动提供了

假如此时把不带参数的构造方法删掉,就会报错了

class Student{public String name ;//没有初始化,默认为null// 就地初始化:定义成员变量的同时初始化。public String name = "张三"public int age ;//没有初始化,默认为0 //public int age = 9public void eat() {System.out.println(this.name+"吃饭!");}public void show(){//this.eat();//可以在成员方法里,调用另一个成员方法System.out.println("姓名:"+this.name+" 年龄:"+this.age);}/*** 构造方法*///带参数的构造方法public Student(String name,int age){this.name = name;this.age = age;System.out.println("带参数的构造方法Student(String,int)");}
}
public class Test {public static void main(String[] args) {Student student = new Student();student.show();System.out.println("==================");Student student2 = new Student("小明",19);student2.show();}}

 不是说,编译器会自动提供不带参数的构造方法吗??这里为什么又会报错呢??

        原因很简单,当一个构造函数都没有的情况下,才会默认自动提供一个不带参数的

构造方法。目前没有不带参数的构造方法,但是有一个带参数的构造方法,就不会提供了。

以自己编写的这个带参数的构造方法为主,此时,new Student()实例化一个新的对象,里面没有带参数,而自己写的那个是带参数的,所以就报错了。

3.构造函数快捷键生成

如果有太多构造函数需要编写,IDEA有一个快捷键,一键生成。

快捷键 alt+insert ,或者 鼠标右键

4.使用this()在构造方法内,调用其他构造方法

this()这个语法只能出现在构造方法当中

只能出现在当前构造方法的第一行!!!

注意:不能自己调用自己!!!

 

成功调用

只能出现在构造方法的第一行!!!

下面这个就错了!! 

(4)this引用的小总结

1.this.成员变量 
2.this.成员方法
3.this()在构造方法里调用其他构造方法

注意!!this代表当前对象的引用,而不是当前对象。

因为实例化对象的重要两步是:

1.为对象分配内存

2.调用合适的构造方法

而在调用构造方法的时候,this还在其中使用,所以是对当前对象的印象!!!

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

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

相关文章

Open3D点云数据处理(十七):体素滤波之体素中心下采样

文章目录 1 体素下采样原理1.1 体素下采样分类1.2 下采样结果对比2 体素中心下采样代码实现2.1 代码行实现2.2 函数封装 my_voxel_center_down_sample()专栏目录:Open3D点云数据处理(Python) 1 体素下采样原理 点云体素下采样(Voxel Downsampling)是一种将点云数据进行降…

Java API指南:掌握常用工具类与字符串操作

文章目录 1. API简介2. Java API的使用2.1 创建和使用Java API工具类2.2 使用String类进行字符串操作 结语 导语: Java作为一门功能强大的编程语言,其成功之处不仅在于语法结构的简洁明了,更因为其丰富的API(Application Programm…

中药配方煎药-亿发智能中药汤剂煎煮系统,智慧中药房的数字化升级

随着中药的普及,在治病、养生等方面都发挥这积极作用,但中药煎煮过程繁琐,如果有所差错将会影响药品的药性。为了满足当今用户对中药的需求,增强生产效率和业务水平,亿发中药煎配智能管理系统应运而生,为用…

【JMeter】JMeter添加插件

目录 一、前言 二、插件管理器 三、推荐插件 1.Custom Thread Groups (1)Ultmate Thread Group (2)Stepping Thread Group 2.3 Basic Graph 资料获取方法 一、前言 ​ 在我们的工作中,我们可以利用一些插件来帮…

github gitlab 多用户多平台切换

一、背景 我需要用账号1 来登录并管理github 账号 我需要用账号2 来登录并管理gitlab 账号 二、设置账号 邮箱 设置账号1用户名与邮箱 git config --global user.name "miaojiang" git config --global user.email "187133163.com" 三、生成本地密钥…

MyBatis小记_three

目录 注解开发 环境搭建 1.创建Maven工程 2.创建实体类 3.提供接口,并提供增删改查的方法 4.编写SqlMapConfig.xml 主配置文件 5.采用注解的方式,来进行增删改查 6.测试 7.测试保存用户的方法 8.测试更新用户 9.测试删除一个用户 10.根据id查…

中小企业如何低成本实施MES管理系统

中小企业在市场竞争中需要有高效的管理体系来支持其运营和发展。中小企业MES管理系统是一种先进的管理系统,可以提升工厂智能化水平,提高生产效率,是中小企业必须采取的有效管理工具。然而,由于资金和技术的限制,中小企…

【C#常用操作】

excel相关操作 using Excel Microsoft.Office.Interop.Excel;public Excel.Application app; public Excel.Workbooks wbs; public Excel.Workbook wb; public Excel.Worksheets wss; public Excel.Worksheet ws;/// <summary> /// 取得打开excel句柄 /// </summary…

【SpringBoot系列】- 四大核心之actuator(程序监控器)

【SpringBoot系列】- 四大核心之actuator(程序监控器) 文章目录 【SpringBoot系列】- 四大核心之actuator(程序监控器)一、概述二、Spring Boot Actuator应用2.1 在项目POM文件中导入Actuator2.2 application配置2.3 配置详解2.3.1 Sensor 类 endpoints2.3.2 Actuator 类 endpo…

反转链表(JS)

反转链表 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&…

MySQL初探

Background 通过阅读小林coding&#xff0c;大致了解了mysql数据库的种种特点&#xff0c;与之前学的数据库实现大体思路相同&#xff0c;感觉学习不能停留在理论层面&#xff0c;要调研生产级别的中间件实现。 一条代码运行在mysql上的流程 1. 连接的过程需要先经过 TCP 三次…

php://filter绕过死亡exit

文章目录 php://filter绕过死亡exit前言[EIS 2019]EzPOP绕过exit 参考 php://filter绕过死亡exit 前言 最近写了一道反序列化的题&#xff0c;其中有一个需要通过php://filter去绕过死亡exit()的小trick&#xff0c;这里通过一道题目来讲解 [EIS 2019]EzPOP 题目源码&#…

C语言每日一题:9.《数据结构》链表的中间节点+链表的倒数第k个节点。

第一题&#xff1a; 题目链接&#xff1a; >思路一&#xff1a; 1.第一遍遍历链表&#xff0c;直到找到尾结束第一次遍历&#xff0c;遍历的过程中记录链表长度。定义长度为k。 2.确定中间是第几个节点&#xff0c;计算是k/21根据题目要求。 3.再一次去遍历我们的数组&…

实战!聊聊工作中使用了哪些设计模式

实战&#xff01;聊聊工作中使用了哪些设计模式 策略模式 业务场景 假设有这样的业务场景&#xff0c;大数据系统把文件推送过来&#xff0c;根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码&#xff1a; if(type"A"){//按照A格式解析}else if(t…

Electron逆向调试

复杂程序处理方式&#xff1a; 复杂方式通过 调用窗口 添加命令行参数 启动允许调用&#xff0c;就可以实现调试发布环境的electron程序。 断点调试分析程序的走向&#xff0c;程序基本上会有混淆代码处理&#xff0c; 需要调整代码格式&#xff0c;处理程序。

建木-自动化部署-dockerfile文件书写-自动化部署jar包完成docker运行镜像-dockerfile书写介绍

阿丹&#xff1a; 在自动化部署的时候jar包要如何进行部署。就需要通过使用书写dockerfile文件来进行触发的时候执行docker指令来完成镜像的部署以及运行。 什么是dockerFile dockerfile是自定义镜像的一套规则dockerfie由多条指令构成&#xff0c;Dockerfile中的每一条指令都…

基于 Docker 的深度学习环境:Windows 篇

本篇文章&#xff0c;我们聊聊如何在 Windows 环境下使用 Docker 作为深度学习环境&#xff0c;以及快速运行 SDXL 1.0 正式版&#xff0c;可能是目前网上比较简单的 Docker、WSL2 配置教程啦。 写在前面 早些时候&#xff0c;写过一篇《基于 Docker 的深度学习环境&#xff…

spring注解驱动开发(一)

Spring常用注解&#xff08;绝对经典&#xff09; 1、需要导入的spring框架的依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.12.RELEASE</version></dependenc…

Spring源码(二)Spring底层架构核心概念解析

1、BeanDefinition BeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Bean是否是懒加载initM…

Hbase基础概念

HBase 一、HBase的数据模型1.HBase数据存储结构2.HBase存储概念3.HBase基本架构 二、HBase Shell1.DDL(Data Definition Language)1.namespace2.table 2.DML&#xff08;Data Manipulation Language&#xff09;1.写入数据2.读取数据3.删除数据 三、HBase组成架构1. Master架构…