JavaSE语法之六:类和对象(超全!!!)

文章目录

    • 一、面向对象的初步认识
      • 1. 什么是面向对象
      • 2. 面向对象与面向过程
    • 二、类和对象
    • 三、类的定义和使用
    • 四、类的实例化
    • 五、this引用
    • 六、对象的构成及初始化
      • 1. 如何初始化对象
      • 2. 构造方法
      • 3. 默认初始化
      • 4. 就地初始化

一、面向对象的初步认识

1. 什么是面向对象

Java中一切皆对象!
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP)。一切皆对象,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事。
– 面试官问你OOP是啥,要知道是面向对象。

2. 面向对象与面向过程

比如:买手机
面向过程:关注买手机的过程

上网查配置 ——> 打开购物平台 ——> 选参数 ——> 选手机 ——> 下单 ——> 填地址 ——> 付款 ——> 取快递 ——> 使用

面向对象:不关注买手机的过程,只关注对象,通过对象之间的交互来完成

①给秘书说要买手机
②秘书帮我买手机:查参数……
③我使用
在 我、秘书、手机 三个实体对象之间相互协作完成。

要是拿到一个对象,必须先类!
类返回对象的过程——实例化

二、类和对象

类: Java中通过 “类” 来描述事物,类主要是由 “属性” 和 “行为” 构成。
如:洗衣机

类:洗衣机
属性:品牌、型号、产品重量、外观尺寸、颜色……
行为:洗衣、烘干、定时……

对象: 某个事物的具体存在

【类和对象的关系】

  • 类:属性和行为的集合,是一个抽象的概念

  • 对象:是该类事物的具体体现,是一种具体存在

  • 举例:

    • 手机(类)
    • 张三的手机(对象)

三、类的定义和使用

【如何定义一个类】
就是把一系列相关事物共同属性和行为抽取出来的过程(抽象)

  1. 类: class为定义类的关键字;
  2. 成员变量: 事物的属性,写在类中,方法外;
  3. 成员方法: 事物的行为,写在类中。
// 创建洗衣机类
class WashMachine{
		//定义成员变量
	public String brand; //品牌
	public String type; // 型号
	public String color; // 颜色

		//定义成员方法
	public void washClothes(){ // 洗衣服
		System.out.println("洗衣功能");
	}
	public void dryClothes(){ // 脱水
		System.out.println("脱水功能");
}
	public void setTime(){ // 定时
		System.out.println("定时功能");
}
}

【注意】

  • 类名注意采用大驼峰定义;
  • 成员变量前写法统一为 public;
  • 成员方法不带static。

四、类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型。用 “类” 类型创建对象的过程,成为类的实例化。

  1. 用new关键字创建一个对象的实例;
  2. .来访问对象中的属性和方法;
  3. 一个类可以创建多个对象。

如:接上述洗衣机代码

public class Test {
	public static void main(String[] args) {
		WashMachine w1 = new WashMachine(); //类的实例化
        w1.brand = "美的"; //访问属性
        System.out.println(w1.brand); 
        w1.washClothes(); //访问方法
}
}

【输出结果】
在这里插入图片描述

【注意】

  1. 当一个引用,赋值为 null 的时候,代表这个引用不指向任何对象 ,报空指针异常!
		WashMachine w = null;
        w.brand = "haha";
        System.out.println(w.brand); //不指向任何对象,此时会报空指针异常
  1. 引用也不能指向引用,引用要指向对象。
		 WashMachine w1 = new WashMachine();
        WashMachine w2 = new WashMachine();
        w1 = w2; //错误,这个代表w1这个引用 指向了 w2这个引用指向的对象,此时,w1和w2所指向一个地址。
  1. 一个引用也不能指向多个对象
		WashMachine wm1 = new WashMachine();
        wm1 = new WashMachine();
        wm1 = new WashMachine();
        wm1 = new WashMachine(); //最后wm1只是指向了一个对象,就是最后一个

五、this引用

1. 概述
这个. 表示本类对象的引用,本质是一个对象。

2. 特性
每一个普通方法都有一个this,谁调用该方法,this就指向谁。

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;
  2. this只能在“成员方法”中使用;
  3. 在“成员方法”中,this只能引用当前对象,不能再引用其他对象;
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,再成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this来接收u。

3. 用法
①this访问成员变量(this.data;);

	public void srtDate(int year,int month,int day) {
	//加上this 来表示给当前的对象的属性赋值。
		this.year = year;
		this.month = month;
		this.day = day;
}

②this访问成员方法(this.func());

  public int year;
    public int month;
    public int day;
    this.show(); //访问成员方法
    public void setDate(int year, int month, int day) {
    	this.show(); //访问成员方法
        this.year = year; //为当前对象的year赋值,前面的是当前对象,后面的是局部变量。
        this.month = month;
        this.day = day;
    }

③this访问构造方法(this(…))。

   public int year;
    public int month;
    public int day;

//构造方法
    public DateUtil() {
		//this访问构造方法
        this(1999,9,9);
        System.out.println("不带参数的构造方法!");
    }

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

this不能调用静态的 成员方法 和 属性。

4. 总结
局部变量和成员变量重名(如:age),则 this.age为局部变量。
以后要习惯使用this。

六、对象的构成及初始化

1. 如何初始化对象

我们知道,在Java方法内部定义一个局部变量时,必须要初始化,否则编译失败。

		public static void main(String[] args) {
			int a;
			System.out.println(a);
	}
// Error:(26, 28) java: 可能尚未初始化变量a

如果要让上述代码通过编译,只需给定a一个初始值即可。但如果是对象,

	public static void main(String[] args) {
		Date d = new Date();
		d.printDate();
		d.setDate(2021,6,9);
		d.printDate();
}
// 代码可以正常通过编译

需要调用之前写的setDate方法才能将具体的日期设置到对象中,通过上述例子,我们发现两个问题:
①每次对象创建好后调用setDaye方法设置具体的日期,比较麻烦,那对象该如何初始化?
②局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

2. 构造方法

【概述】
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
Dog d = new Dog(); 这里是实例化对象,此时会调用对象的构造方法。

当我们调用完构造方法,对象就生成了!! 生成对象分两步:
①为对象分配内存;
②调用合适的构造方法。

	public class Date {
	//成员变量
		public int year;
		public int month;
		public int day;

	public void setDay(int year, int month, int day){ 
		this.year = year;
		this.month = month;
		this.day = day;
	}
	//成员方法
	public void printDate(){
		System.out.println(this.year + "/" + this.month + "/" + this.day);
	}
	
	//构造方法
	public Date() { 
  		System.out.println("不带参数的构造方法")
	}
	
	public static void main(String[] args) {
		// 构造三个日期类型的对象 d1 d2 d3
		Date 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();
	}
}

//此时输出
不带参数的构造方法
2020/9/15
不带参数的构造方法
2020/9/16
不带参数的构造方法
2020/9/17

可以实例化对象给构造方法传参,此时不用调用上述的setDate方法:

	//要手动加入不带参数的构造方法,不管写了啥构造方法,此时Java都不会提供不带参数的构造方法了
	public Date() {}
	public Date(int year, int month, int day){
		this.year = year;
		this.month = month;
		this.day = day;
		System.out.println("带有3个参数的构造方法");
	}
	
	public static void main(String[] args) {
		Date d = new Date(2021,6,9); 
		d.printDate(); 
	}

//输出
带有3个参数的构造方法
2021-6-9

【特性】
①名字必须与类名相同
没有返回值类型,设置void也不行;
③创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次);
④构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。
⑤如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的;其中注意,一旦用户定义,编译器则不再自动生成默认的构造方法。
⑥构造方法中,可以通过this调用其他构造方法来简化代码。

    public int year;
    public int month;
    public int day;

//构造方法
    public DateUtil() {
        this(1999,9,9);
        System.out.println("不带参数的构造方法!");
    }

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

注意:
上述无参方法中的this(1999,9,9);就是调用当前对象的其他构造方法。此语句 ① 必须放在第一行;② 只能在构造方法内部才能使用。③ 不能成环。(就是不能两个及以上的构造方法使用this(…),这样会在其内部踢皮球了。)

⑦绝大多数情况下使用 public 来修饰,特殊场景下会被private修饰(后续将单例模式时会遇到)。

3. 默认初始化

在上文提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

在调用构造方法给对象赋值之前,系统内部会自动默认初始化。
在这里插入图片描述
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:

Date d = new Date(2021,6,9);

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

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

  2. 为对象分配内存空间;

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

  4. 初始化所分配的空间
    即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
    在这里插入图片描述

  5. 设置对象头信息(关于对象内存模型后面会介绍);

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

4. 就地初始化

在声明成员变量时,就直接给出了初始值。

	public class Date {
	  //定义初始值
		public int year = 1900;
		public int month = 1;
		public int day = 1;
		
		public Date(){
	}

注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

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

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

相关文章

实验02:RIP配置

1.实验目的: 了解路由选择协议(Routing Protocol)的基本原理及分类;掌握RIP协议的基本原理;实现RIP协议;掌握路由器配置及路由表查看的基本命令。 2.实验内容: 建立拓扑结构;配置…

【已解决】ModuleNotFoundError: No module named ‘taming‘

问题描述 Traceback (most recent call last) <ipython-input-14-2683ccd40dcb> in <module> 16 from omegaconf import OmegaConf 17 from PIL import Image ---> 18 from taming.models import cond_transformer, vqgan 19 import taming.modu…

美团、阿里、快手、百度 | NLP暑期算法实习复盘

面试锦囊之面经分享系列&#xff0c;持续更新中 后台回复『面试』加入讨论组交流噢 背景 211CS本港三DS硕&#xff0c;硕士research的方向是NLP&#xff0c;目标是找任何方向的算法实习。 本科做开发为主没有算法经验&#xff0c;没有top比赛&#xff0c;没有过算法实习&…

KUKA机器人如何在程序中编辑等待时间?

KUKA机器人如何在程序中编辑等待时间&#xff1f; 如下图所示&#xff0c;如何实现在P1点和P2点之间等待设定的时间&#xff1f; 如下图所示&#xff0c;可以直接输入wait sec 2&#xff08;等待2秒&#xff09;&#xff0c; 如下图所示&#xff0c;再次选中该程序后&#…

网络基础——路由协议及ensp操作

目录 一、路由器及路由表 1.路由协议&#xff1a; 2.路由器转发原理&#xff1a; 3.路由表&#xff1a; 二、静态路由优缺点及特殊静态路由默认路由 1.静态路由的优缺点&#xff1a; 2.下一跳地址 3.默认路由 三、静态路由配置 四、补充备胎 平均负载 五、补充&…

微软Microsoft二面面试题分享通过总结(不是标准答案分享

误打误撞 我写的shitty代码 当年面试算法开发岗竟然通过了 Background 先说下背景&#xff0c;软件工程本科毕业之后&#xff0c;当年8月到北欧读两年制硕士。面试发生在当年的11月&#xff0c;微软哥本哈根&#xff0c;location在丹麦的哥本哈根lingby&#xff08;是不是这么…

伦敦银和纽约银该pick谁?

伦敦银和纽约银不仅是全球最重要的两个白银市场&#xff0c;更是两种截然不同的交易模式&#xff0c;前者是指在伦敦市场上以美元/盎司计价的现货白银&#xff0c;后者是指在纽约商品交易所交易、以美元/盎司计价的白银期货。 如果大家需要在这两种白银投资方式中作出取舍&…

常见的设计模式以及实现方法总结

目录 代码中使用的设计模式总结 前言常见的23种设计模式Singleton模式&#xff08;单例模式&#xff09;理论Spring中创建的Bean Prototype模式&#xff08;原型模式&#xff09;理论Spring中创建的Bean Builder模式&#xff08;构造器模式&#xff09;理论Builder实现了构造器…

JVM之堆学习

一、Java虚拟机内存结构图 二、堆的介绍 1. 前面学习的程序计数器&#xff0c;虚拟机栈和本地方法栈都是线程私有的&#xff0c;堆是线程共享的&#xff1b; 2. 通过 new 关键字&#xff0c;创建的对象都会使用堆内存&#xff0c;其特点是&#xff1a; 它是线程共享的&#x…

Landsat7_C2_ST数据集2019年1月-2022年12月

简介&#xff1a; Landsat7_C2_ST数据集是经大气校正后的地表温度数据&#xff0c;属于Collection2的二级数据产品&#xff0c;以开尔文为单位测量地球表面温度&#xff0c;是全球能量平衡研究和水文模拟中的重要地球物理参数。地表温度数据还有助于监测作物和植被健康状况&am…

单片机——通信协议(FPGA+c语言应用之spi协议解析篇)

引言 串行外设接口(SPI)是微控制器和外围IC&#xff08;如传感器、ADC、DAC、移位寄存器、SRAM等&#xff09;之间使用最广泛的接口之一。本文先简要说明SPI接口&#xff0c;然后介绍ADI公司支持SPI的模拟开关与多路转换器&#xff0c;以及它们如何帮助减少系统电路板设计中的数…

宏景eHR SQL注入漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR app_check_in/get_org_tree.jsp接口处存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞…

JVM的五大分区

1.方法区 方法区主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 2.虚拟机栈 虚拟机栈也就是我们平时说的栈内存&#xff0c;它是为java方法服务的。每个方法在执行的 时候都会创建一个栈帧&#xff0c;用于存…

SpringCloud面试题及答案(最新50道大厂版,持续更新)

在Java开发中&#xff0c;Spring Cloud作为微服务架构的关键组成部分&#xff0c;为了帮助广大Java技术爱好者和专业开发人员深入理解Spring Cloud&#xff0c;本文《SpringCloud面试题及答案&#xff08;最新50道大厂版&#xff0c;持续更新&#xff09;》提供了最前沿、最实用…

C#比较两个list集合类的差异

C#中List中自带的差集计算方法 List 继承了Enumerable &#xff0c;Enumerable 中有一个Except方法 它有两个实现&#xff1a; 第一个实现是通过使用默认的相等比较器对值进行比较&#xff0c;生成两个序列的差集。 第二个实现是通过使用指定的 IEqualityComparer 对值进行…

一分钟带你了解电容

电容器中的电容究竟是怎么定义的&#xff1f; 一个电容器&#xff0c;如果带1库的电量时两级间的电势差是1伏&#xff0c;这个电容器的电容就是1法拉&#xff0c;即&#xff1a;CQ/U 。但电容的大小不是由Q&#xff08;带电量&#xff09;或U&#xff08;电压&#xff09;决定…

[C错题本]转义字符/指针与首元素/运算

\a响铃 \b退格 \f换页 \r回车 \t水平制表 \v垂直制表 \单引号 \"双引号 \\反斜杠 \0dd八进制&#xff08;0-7&#xff09; \xdd(0-f)注意x一定不能大写 而且十六进制千万不能写\0xint main() {char s[]"ABCD", *p;for (p s 1; p < s 4; p)printf("%s…

简记修复改etc下profile失败的补救措施

现象 下午配置环境变量一个小小的失误&#xff0c;把etc文件夹下的profile改崩了&#xff0c;导致很多基本命令都用不了&#xff0c;服务器出现了下面这种情况。 [rootxxxx ~]# vi /etc/profile -bash: vi: command not found [rootxxxxx~]# vi -bash: vi: command not found…

今天我们深刻认识一下 Java虚拟机的程序计数器

1、为什么需要程序计数器 为了保证程序(在操作系统中理解为进程)能够连续地执行下去&#xff0c;CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用&#xff0c;所以通常又称为指令计数器。在程序开始执行前&#xff0c;必须将它的起始地址&#xff0c…

「Azure架构风格」Azure云不同的 架构风格

架构风格是一系列具有某些共同特征的架构。例如&#xff0c;n层是一种常见的体系结构样式。最近&#xff0c;微服务体系结构开始受到青睐。架构风格不需要使用特定的技术&#xff0c;但是有些技术非常适合特定的架构。例如&#xff0c;容器自然适合于微服务。 我们已经确定了一…