Java类和对象(1)

🐵本篇文章将会开始对类和对象的第一部分讲解


一、简单描述类和对象

对象可以理解为一个实体,在现实生活中,比如在创建一个建筑之前,要先有一个蓝图,这个蓝图用来描述这个建筑的各种属性;此时蓝图就是类,建筑就是对象,简单来说类是用来描述对象的

二、类的定义

类是我们自定义的类型,在定义类时要用到class关键字

class 类名 {

}

类中的内容由成员变量(或属性)和成员方法组成,在方法外、类内定义的变量称为成员变量(在方法内定义的变量是局部变量),下面定义一个日期类:

class Date {
    public int year;
    public int month;
    public int day;
    
    public void fun() {
        System.out.println("2023");
    }
}

注:此处成员变量均由public修饰,此处的成员方法不加static,这些后面会详细解释

之前说过一个文件只能有一个被public修饰的类,不要轻易去改这个类的名字,如要修改,见下图

这样修改被public修饰类的名字的前提是在该文件中只有一个类

三、 类的实例化

对象是一个实体,在产生实体之前,要先用类来描述这个实体,通过类创建对象的过程叫作类的实例化,在Java中采用new关键字配合类名来实例化对象

public static void main(String[] args) {
    Date d1 = new Date(); //通过new来实例化一个对象,Date是类名,d1是对象的引用

    d1.year = 2024; //通过.来访问对象的属性和方法
    d1.month = 1;
    d1.day = 1;
}

总结:使用new关键字创建对象,每创建一个对象,在内存中就会为对象开辟一块空间,在这块空间中存储的就是对象的属性,对象的属性是在类中定义的;通过.可以访问对象的属性和方法,而对象的引用指向这块内存空间,其类型就是我们创建的类(我们自定义的类型)

四、 类和对象的注意事项

1. 引用不能指向引用,引用只能指向对象

Dog dog1 = new Dog(); //Dog是一个类
Dog dog2 = new Dog();
dog1 = dog2; //这里让dog1指向dog2所指向的对象

创建完两个对象后,在堆区分别开辟了两块内存空间,dog1和dog2是对象的引用且分别指向这两块空间,执行完dog1 = dog2;这条语句后dog1和dog2都指向dog2指向的对象,而原来被dog1指向的对象的内存空间会被JVM回收

2. 一个引用只能指向一个对象

Dog dog3 = new Dog();
dog3 = new Dog();
dog3 = new Dog(); //dog3指向的是这个对象,前面两个对象没有被任何引用指向时会被JVM回收

3. 当对象的引用等于null时,意味着该引用不指向任何对象,并不是指向null对象

Dog dog4 = null;

五、练习:交换两个数的值

class Value {
    public int val;
}
public class Test {
    public static void main(String[] args) {
        //创建两个对象
        Value x = new Value();
        Value y = new Value();
        
        //对对象的属性进行赋值
        x.val = 10;
        y.val = 20;
        
        //交换
        swap(x, y);

        //打印
        System.out.println(x.val);
        System.out.println(y.val);
    }
    public static void swap(Value x1, Value y1) {
        int tmp = x1.val;
        x1.val = y1.val;
        y1.val = tmp;
    }
}

六、this引用

6.1 this讲解

this是指向当前对象的引用,举个例子:

class Date {
    public int year;
    public int month;
    public int day;

    public void setDate(int year, int month, int day) {
        this.year = year; //这里的this指向的就是d这个引用所指向的对象
        this.month = month;
        this.day = day;
    }
}
public class Test {
    public static void main(String[] args) {
        Date d = new Date();
        d.setDate(2023, 11, 11);
    }
}

上述代码中如果不加this,那么在setDate这个方法中就不能完成对成员变量赋值的目的,因为方法中的year、month、day都被认为是形参(名字和形参相同),形参是局部变量,局部变量优先;

this从何而来:实际上,每一个成员方法的第一个参数就是this引用,编译器会自动将调用这个方法的对象传给this,简而言之,谁调用这个方法谁就是this,上述代码中this和d都指向同一个对象

6.2 this注意事项

1. this只能在成员方法中使用

2. this.成员变量===>访问成员变量

3. this.成员方法===>访问当前类的成员方法

public void setDate(Date this, int year, int month, int day) {
    this.year = year;
    this.month = month;
    this.day = day;
    this.printDate();
}
public void printDate() {
    System.out.println(year+" "+month+" "+day);
}

4. this()===>调用当前类的构造方法 (接下来会讲)

5. this不能出现在静态方法内部(后面会讲)

七、 对象的构造和初始化

7.1 默认初始化

class Date {
    public int year;
    public int month;
    public int day;
}

成员变量在没有初始化时被使用,编译也会顺利通过,这是因为成员变量被定义后会被默认初始化为零值,上述代码的成员变量都被默认为0,boolean型变量被默认为false,char型变量被默认为'\u0000',引用型变量被默认为null

7.2 就地初始化

class Date {
    public int year = 2024;
    public int month = 1;
    public int day = 1;
}

就地初始化就是在声明成员变量时就赋初始值

7.3 构造方法

构造方法一般是用来初始化对象的,构造方法定义在类中,它也是一种成员方法,构造方法的方法名必须和当前类的名字相同,且没有返回值(注意:并不是返回值类型为void,而是在构造方法中没有返回值这一概念)

在使用new创建完对象后,编译器就会调用构造方法,如果我们自己没有写构造方法,那编译器也会去调用不带参数的默认的构造方法,默认的构造方法如下:

class Date {
    public int year;

    //默认的构造方法,该构造方法不会显示在编译器上但也可以自己写
    public Date() {
    
    }
}

也可以自己写构造方法,-构造方法可以写多个,那么当有多个构造方法时,实例化对象会调用合适的构造方法

class Value {
    public int val;
    
    public Value(int x) { //调用这个方法
        this.val = x;
    }
    public Value() {
        this.val = 20;
    }

}
public class Test {
    public static void main(String[] args) {
        //只传一个参数,那就会调用有一个形参的构造方法
        Value v = new Value(20);
    }
}

通过this()来调用当前类的构造方法,注意this这条语句必须放在成员方法的第一句

class Value {
    public int val;

    public Value(int x) { //x = 20;
        this(); //必须放在第一句,否则编译会报错
        this.val = x;
        System.out.println(this.val);
    }
    public Value() {
        System.out.println("调用了这个构造方法");
    }
}

当我们写了构造方法后,编译器不会再调用默认的构造方法,该构造方法也需要我们自己去写

class Value {
    public int val;

    public Value(int x) {
        this.val = x;
        System.out.println(this.val);
    }
}

public class Test {
    public static void main(String[] args) {
        Value v = new Value(20);
        Value v1 = new Value(); //这样编译会报错,必须写一个无参的构造方法
    }
}

🙉那么本篇文章到此结束,接下会继续对类和对象的相关知识进行讲解

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

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

相关文章

如何手动获取spring/springboot中的IOC容器(全局上下文对象)?

IDE:IntelliJ IDEA 2022.2.3 x64 操作系统:win10 x64 位 家庭版 JDK: 1.8 文章目录 前言一、如何手动获取spring容器[ApplicationContext]?方式①:在启动类中获取spring容器方式②:自定义工具类实现ServletContextList…

临界资源,临界区,通信的干扰问题(互斥),信号量(本质,上下文切换问题,原子性,自身的安全性,操作)

目录 引入 概念 临界资源 临界区 干扰存在原因 互斥 信号量 引入 举例 概念 介绍 表示可用资源数 表示等待进程数 申请信号量 信号量的本质 全局变量? 共享内存? 不安全问题 -- 上下文切换 原子性 信号量自身的安全性 原子操作的意义 操作 引入 通信…

Cesium 相机设置

1.setView 直接跳转到目的地 // 设置相机位置 const position Cesium.Cartesian3.fromDegrees(113, 31, 20000); // setView通过定义相机目的地(方向),直接跳转到目的地 viewer.camera.setView({ destination: position, // 位置设置 orientation: { //…

适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频

一、ADAU1977WBCPZ 集成诊断功能的四通道ADC,音频 24 b 192k IC,SPI 40LFCSP ADAU1977集成4个高性能模数转换器(ADC),其直接耦合输入具有10 V rms性能。该ADC采用多位Σ-Δ架构,其连续时间前端能够实现低EMI性能。它可以直接连接…

专业135总分400+西安交通大学信息与通信工程学院909/815考研经验分享

今年初试发挥不错,400,专业课135,将近一年复习一路走来,感慨很多,希望以下经历可以给后来的同学提供一些参考。 初试备考经验 公共课:三门公共课,政治,英语,数学。在备考…

GaN HEMT 电容的分析建模,包括寄生元件

标题:Analytical Modeling of Capacitances for GaN HEMTs, Including Parasitic Components 来源:IEEE TRANSACTIONS ON ELECTRON DEVICES(14年) 摘要:本文提出了一种基于表面势的终端电荷和电容模型,包…

直接插入排序与希尔排序

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

4.移位计算,乘除法运算

目录 一. 移位计算 (1)算数移位 (2)逻辑移位 (3)循环移位 二. 乘法运算 (1)原码的乘法运算 (2)补码的乘法运算 三. 除法运算 (1&#xf…

SpringDataJpa(二)

三、Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring D…

Python爬虫-获取汽车之家车家号

前言 本文是该专栏的第9篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly9jaGVqaWFoYW8uYXV0b2hvbWUuY29tLmNuL0F1dGhvcnMjcHZhcmVhaWQ9MjgwODEwNA== 需求:获取汽车之家车家号数据 笔者将在正文中介绍详细的思路以及采集方法,废话不多说,跟着笔者直接往…

GPT-4V:AI在教育领域的应用

OpenAI于9月25日发布了最新的GPT-4V模型,为ChatGPT引入了语音和图像功能,为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验,用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…

React 其他常用Hooks

1. useImperativeHandle 在react中父组件可以通过forwardRef将ref转发到子组件;子组件拿到父组件创建的ref,绑定到自己的某个元素; forwardRef的做法本身没有什么问题,但是我们是将子组件的DOM直接暴露给了父组件,某下…

设计模式之组合模式-创建层次化的对象结构

目录 概述概念主要角色应用场景 组合模式的实现类图NS图基本代码组合模式的精髓意外收获(❀❀) 应用示例-公司组织架构管理需求结构图代码 组合模式的优缺点优点缺点 总结 概述 概念 组合模式是一种结构型设计模式,它允许将对象组合成树形结…

虚幻5.1 常见的效果关闭方式

常见的虚幻效果关闭方式 1.Bloom ProjectSettings->Rendering->Default Settings->Bloom PostProcessVolume->Lens->Bloom 2.Ambient Occlusion/Screen Space Ambient Occlusion(SSAO) ProjectSettings->Rendering->Default Settings->Ambient Occl…

服务器部署 Nacos 获取不到配置浏览器可以访问

服务器部署 Nacos 获取不到配置浏览器可以访问 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳&#xff0c…

基于springboot vue mysql的在线拍卖系统 全套代码 全套文档

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 代码下载链接:https://pan.baidu.com/s/104LjKF7kvhYeooSBk9h65g?pwd8fk4 提取码:8fk4 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技…

【每日一题】318. 最大单词长度乘积-2023.11.6

题目: 318. 最大单词长度乘积 给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。 示例 1: 输入&#xff1…

模拟ASP.NET Core MVC设计与实现

前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说:“我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你能不能按照《200行代码,7个对象——让你了解ASP.…

第26期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…