Java类和对象(1)

news2024/12/25 9:16:03

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


一、简单描述类和对象

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

二、类的定义

类是我们自定义的类型,在定义类时要用到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(); //这样编译会报错,必须写一个无参的构造方法
    }
}

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

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

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

相关文章

C++day6作业

1.思维导图 2.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在&am…

后台管理系统解决方案-中大型-Vben Admin

后台管理系统解决方案-中大型-Vben Admin 官网 Vben Admin 在线演示 Vben Admin 为什么选择它 github现有20K星,并且它有个可视化生成表单,我很喜欢 快速开始 # 拉取代码 git clone https://github.com/vbenjs/vue-vben-admin-doc# 安装依赖 yarn#…

天津WEB前端培训哪家好?Web机构推荐!

05年以后,互联网已经进入了web2.0时代,同时也标志着网站的前端由此发生了翻天覆地的变化,现在市场上对WEB前端开发工程师岗位有着很大的需求,学习web前端开发的方式有很多种,对于初学者来说,选择自学还是培…

使用篇(一):Ai绘图-Stable Diffusion WebUI

1.介绍 1.1 概述 Stable Diffusion Web UI是一个基于Stable diffusion AI模型的AI绘画软件。它是一个多功能的AI绘画软件,支持以下几个功能: 用户可以输入一堆关键词或一句话来生成图片。 它使用了图像加噪去噪过程中的生成模型—— Duffusion&#xff…

与set和map相关的OJ题练习

一、两个数组的交集 题目链接: 349. 两个数组的交集 - 力扣(LeetCode) 题目描述: 给两个数组,求在数组里面共同出现的部分,就是求两个数组的交集,返回顺序不做要求 解题思路: …

视频剪辑:制作视频画中画效果,背景图片的添加方法

随着社交媒体的兴起,视频制作越来越受到人们的关注。在视频制作过程中,除了主要的画面,背景图片往往能够增加视频的层次感和视觉效果。今天,我们就来探讨一下如何使用云炫AI智剪制作视频画中画效果,并添加背景图片。 在…

Java自学第6课:电商项目(2)

1 创建工具类并连接数据库 在工程src右键单击new,新建util包 再创建DBUtil类 数据库交互需要有数据库支持的包,这是官方给出的类库。 先声明1个代码块 // 静态代码块 只加载1次static{try {Class.forName("com.mysql.jdbc.Driver");} catch (…

基于springboot实现高校党务平台管理系统【项目源码】

基于springboot实现高校党务平台管理系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群&#x…

可持久化01Trie

例题: 解释: 首先这里要求连续异或,所以存储前缀异或和数组。首先的话,我们只考虑前r个版本的Trie,所以以root[r]为根节点的Trie就是1到r位置数。但是,还有一个l左端点,所以我们对于每一个节点…

python开发过程中注意编码规范~

文章目录 一、 代码编排二、 文档编排三、 空格的使用四、 注释五、 文档描述六、 命名规范总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。七 编码建议关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、…

解析虚拟文件系统的调用

Linux 可以支持多达数十种不同的文件系统。它们的实现各不相同,因此 Linux 内核向用户空间提供了虚拟文件系统这个统一的接口,来对文件系统进行操作。它提供了常见的文件系统对象模型,例如 inode、directory entry、mount 等,以及…

【Git】如何安装git,项目中使用git上传到远程仓库,使用git中对多人使用出现的版本问题的解决

前言: 一,Git的介绍,安装,与SVN的对比 1.1Git的介绍 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控…

c语言练习10周(11~15)

将b串中的所有字母字符连接在a串之后并输出&#xff0c;a,b串最多30个字符。 题干将b串中的所有字母字符连接在a串之后并输出&#xff0c;a,b串最多30个字符。输入样例abcdef 1A2D3C4F5GG输出样例abcdefADCFGG #include<stdio.h> int main() {char a[30], b[30];int i0…

20 VPN详解

1、连接数据中心 1.第一种方式是走公网&#xff0c;但是公网太不安全 2.第二种方式是专线&#xff0c;但是比较贵 3.VPN连接2、vpn的概念 全名Virtual Private Network&#xff0c;虚拟专用网&#xff0c;就是利用开放的公众网络&#xff0c;建立专用数据传输通道&#xff0c…

无人机航迹规划:六种最新智能优化算法(DBO、LO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、六种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为…

《荒野大镖客》游戏emp.dll丢失的修复方法,快速解决找不到emp.dll问题

《荒野大镖客》是一款备受玩家喜爱的开放世界冒险游戏&#xff0c;然而&#xff0c;有些玩家在游戏中可能会遇到emp.dll文件丢失的问题。emp.dll文件丢失是一个比较常见的问题&#xff0c;它会导致电脑系统出现各种异常情况&#xff0c;比如程序无法正常运行、弹出错误提示等。…

电脑上使用的待办事项便签工具选择哪一款?

电脑是日常办公中必不可少的工具&#xff0c;每一个人每天都要面对纷纷总总的工作待办任务&#xff0c;倘若能当日常工作待办逐一罗列好&#xff0c;提前制定好相关的工作计划后&#xff0c;就可以让各项工作有据可循&#xff0c;在电脑上有哪些可以记录待办事项的工具能实时起…

H5横屏适配方案

横屏模式一般使用场景比较少&#xff0c;特殊情况除外&#xff0c;一般用于游戏、操作性比较大的网页会采用横屏 整体代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" conte…

零基础入门Python基础知识全面梳理!从零开始成为编程高手

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、python程序的组成二、核心的数字类型1.整型 int &#xff08;0、负自然数、正自然数&#xff09;2.浮点数 float &#xff08;带有小数部分的数&#xff0c;小数…

app自动化测试(Android)--显式等待机制

WebDriverWait类解析 WebDriverWait 用法代码 Python 版本 WebDriverWait(driver,timeout,poll_frequency0.5,ignored_exceptionsNone)参数解析&#xff1a; driver&#xff1a;WebDriver 实例对象 timeout: 最长等待时间&#xff0c;单位秒 poll_frequency: 检测的间隔步…