JAVA系列 小白入门参考资料 类和对象(2)

news2024/11/25 6:46:37

目录

小引 

1. this

this引用

this的特性

this的使用 

2. 对象的构造及初始化

如何初始化对象

构造方法

利用构造方法初始化对象的三种方式

方式一

方式二

方式三

直接初始化 


小引 

上一篇文章我们讨论到 如果创立类和对象,并且如何实例化对象和怎样去调用成员方法和成员变量。JAVA系列 小白入门参考资料 类和对象(1)

下面我们再写一些代码来回顾一下

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

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

    public  void printDay(){
        System.out.println(year + "年" + month + "月" + day + "日");
    }
}


public class blog {
    public static void main(String[] args) {
        Date date = new Date();

        //调用方法 且传参进行初始化
        date.setDay(2024,4,29);
        date.printDay();
        System.out.println("===========================");

        //也可以使用成员变量直接赋值
//        date.year = 2024;
//        date.month = 4;
//        date.day = 29;
//        date.printDay();

        
        Date date1 = new Date();
        date1.setDay(2023,3,30);
        date1.printDay();

    }
}

到这里我们就不禁有些疑问,我们有两个对象,但只有一个方法。

我们继续向下看 

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

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

    public  void printDay(){
        System.out.println(year + "年" + month + "月" + day + "日");
    }
}

public class blog {
    public static void main(String[] args) {
        //调用方法 且传参进行初始化
        Date date = new Date();
        date.setDay(2024,4,29);
        date.printDay();
        System.out.println("===========================");

        //也可以使用成员变量直接赋值
//        date.year = 2024;
//        date.month = 4;
//        date.day = 29;
//        date.printDay();


        Date date1 = new Date();
        date1.setDay(2023,3,30);
        date1.printDay();
    }
}

当我把代码变成这种形式时

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

好像计算机也“蒙圈”了

这时我们就需要其他方法来帮助我们,那就是this关键字 


1. this

this引用

this 引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该 引用去访问
 public void setDay(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }

 当我们把关键代码修改成上面时,结果是什么样呢?

 我们可以看到代码又可以正常运行了

通俗的来说,哪个 对象引用  调用this,这个this就是其对象引用(简称为“替身”)。

this的特性

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

this的使用 

this. 成员变量 

this. 成员方法  

this() 

this()调用的是类中的构造方法,这里先提一下,下面讲构造方法时会解释 


2. 对象的构造及初始化

如何初始化对象

在之前的学习中我们知道了,在Java方法内部中定义一个局部变量的时候,一定要初始化。否则会报错 

public class NewTest {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}

我们只要把关键代码改为  int a = 10; 就可以正常运行了!

学到这里我们可能就有些疑问?

1. 在之前的代码中成员变量也没有初始化,但为什么没有报错?

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

因为程序会自动默认给成员变量初始化,引用数据类型的初始值 是 NULL,基本数据类型的初始值是0 

class Dog{
    String name;
    int age;
    String color;

    public Dog(){
    }

    public void print(){
        System.out.println(this.name + "  " + this.age + "  " + this.color);
    }
}

public class NewTest {
    public static void main(String[] args) {
       Dog dog = new Dog();
       dog.print();
    }
}

2.  无论我们是调用方法还是给成员变量赋值,都要去自己重新传一次参或按相应的成员变量一个一个去赋值,好像有点麻烦,有没有什么办法可以直接一次就把成员变量给赋值?

public class blog {
    public static void main(String[] args) {
        //调用方法 且传参进行初始化
        Date date = new Date();
        date.setDay(2024,4,29);
        date.printDay();
        System.out.println("===========================");

        //也可以使用成员变量直接赋值
//        date.year = 2024;
//        date.month = 4;
//        date.day = 29;
//        date.printDay();


        Date date1 = new Date();
        date1.setDay(2023,3,30);
        date1.printDay();
    }
}

答案是有的,Ta就是构造方法 

构造方法

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

语法结构:

访问修饰符  类名 (形参列表){

}

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

    //构造方法
    public Date(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    
    public void setDay(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public  void printDay(){
        System.out.println(year + "年" + month + "月" + day + "日");
    }
}

public class blog {
    public static void main(String[] args) {
        //调用方法 且传参进行初始化
        Date date = new Date(2024,4,29);
        date.printDay();

        System.out.println("===========================");

        Date date1 = new Date(2023,3,30);
        date1.printDay();
    }
}

这里我们利用的是构造方法来初始化,而前面的代码我们是利用 setDay方法 来初始化的 

构造方法特性:

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

下面的代码中 构造方法就实现了方法的重载 

class Date{
    //成员属性
    int year;
    int month;
    int day;
    
    //构造方法
    public Date(int year) {
        this.year = year;
    }

    //构造方法的重载
    public Date(int year, int month) {
        this.year = year;
        this.month = month;
    }

    //构造方法的重载
    public Date(int yeat, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }

}

                  上述三个构造方法:名字相同,参数列表不同,因此构成了方法重载。 

5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

注意:一旦用户定义,编译器则不再生成。 

 6. 构造方法中,可以通过this调用其他构造方法来简化代码 

利用构造方法初始化对象的三种方式

方式一

使用无参构造方法,利用this去访问成员变量,并进行赋值 

class Dog{
    String name;
    int age;
    String color;

   //方式一
    public Dog(){
        this.name = "小飞";
        this.age = 10;
        this.color = "粉色";
    }

    public void print(){
        System.out.println(this.name + "  " + this.age + "  " + this.color);
    }
}

public class NewTest {
    public static void main(String[] args) {
        //方式一
        Dog dog = new Dog();
        dog.print();
    }
}

方式二

使用含参数的构造方法,并在创建对象时进行传参,初始化

class Dog{
    String name;
    int age;
    String color;

    //方式二
    public Dog(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public void print(){
        System.out.println(this.name + "  " + this.age + "  " + this.color);
    }
}

public class NewTest {
    public static void main(String[] args) {
       //方式二
        Dog dog1 = new Dog("小飞飞",10,"浅粉色");
        dog1.print();
    }
}

方式三

先通过 new对象() 调用无参构造方法,再通过  无参构造方法  中的  this(...)语句把其中的参数传给  带参数的构造方法 ,再进行初始化 

这里就是前面提到 this() 的知识

this() 就是调用无参的构造方法

this(...) 就是调用对应参数的构造方法

class Dog{
    String name;
    int age;
    String color;

    //方式三
    public Dog(){
        this("小飞飞飞",10,"浅浅粉色");
    }


    public Dog(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }
    

    public void print(){
        System.out.println(this.name + "  " + this.age + "  " + this.color);
    }
}

public class NewTest {
    public static void main(String[] args) {
        
        //方式三
        Dog dog = new Dog();
        dog.print();

    }
}

直接初始化

在声明成员变量时,就直接给出了初始值。
class Dog{
    String name = "小狗狗";
    int age = 10;
    String color = "米白色";
}

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

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

相关文章

Vue+Element UI el-progress进度条内显示自定义数字及文字

需求 进度条内展示 具体的数字值&#xff0c;进度条外展示 百分比数值 数据 data() {return {reNum: 3214,rePer:40,warmPer: 40,warmNum:2132,}}因为样式要求&#xff0c;显示的百分数也是自己写的哈 &#xff0c;没有用进度条自带的 代码 <div class"pick"&g…

Java学习3:程序流程控制

Java程序流程控制 1.执行顺序 顺序结构分支顺序 if,switch 循环结构 for ,while ,do-while 2.if分支 三种形式 if(条件表达式){} else if(){} else{}3.switch分支 string week "周一"; switch(week){case "周一":stem.out.println("周一&qu…

六西格玛黑带考试:一场心灵与智慧的较量

终于踏过了六西格玛黑带考试这座大山&#xff0c;心中的激动与释然如波涛汹涌。这场考试&#xff0c;不仅仅是对我知识的检验&#xff0c;更是对我毅力与决心的考验。 备考的日子里&#xff0c;我仿佛进入了一个全新的世界。从统计学的深邃到流程优化的细致&#xff0c;每一个…

C++入门第二节

点赞关注不迷路&#xff01;&#xff0c;本节涉及c入门关键字、命名空间、输入输出... 1. C关键字 C总计63个关键字&#xff0c;C语言32个关键字 asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenam…

在STM32上实现嵌入式人工智能应用

引言 随着微控制器的计算能力不断增强&#xff0c;人工智能&#xff08;AI&#xff09;开始在嵌入式系统中扮演越来越重要的角色。STM32微控制器由于其高性能和低功耗的特性&#xff0c;非常适合部署轻量级AI模型。 本文将探讨如何在STM32平台上实现深度学习应用&#xff0c;…

【活动】AIGC 技术的发展现状与未来趋势

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 AIGC 技术的发展现状与未来趋势引言AIGC技术的发展现状文本生成图像生成音频生成…

Git中单独的功能特性分支是什么含义

在Git中&#xff0c;一个"功能特性分支"&#xff08;通常简称为“特性分支”&#xff09;是指从主开发分支&#xff08;比如main或master&#xff09;独立出来的分支&#xff0c;专门用于开发一个新功能、修复一个bug&#xff0c;或者进行实验性的尝试。使用特性分支…

【Python BUG】connect: permission denied.

问题描述 解决方案 本质是权限问题 sudo密码即可

​基于Python的在线自主评测系统(django)​

基于Python的在线自主评测系统(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 学生功能模块的实现 学生注册的实现 学生登录界面首页 在线考试界面 考试成绩查看界面 教师功能模块的实现 新建…

用什么模型算法可以预测足球胜平负

预测足球胜平负的模型算法有很多种&#xff0c;每种算法都有其特点和适用场景。以下是一些常见的模型算法&#xff1a; Elo预测法&#xff1a; 这是一种通过研究主客场球队在比赛前的积分情况来预测胜负的方法。Elo预测法通过计算两队之间的积分差&#xff0c;根据特定的公式&…

工业互联网通讯协议—欧姆龙(Fins tcp)

一、场景 近期公司要对欧姆龙CP系列设备的数据采集&#xff0c;于是就研究了下欧姆龙的Fins Tcp协议。 二、Fins Tcp 组成字节说明固定头446494E53 FINS对应的ASCII码的十六进制长度4后面剩余指令的长度命令4 握手固定为&#xff1a;00000000 读写固定为&#xff1a;0000000…

http 协议的状态码有哪些?含义是什么?

http 协议的状态码有哪些&#xff1f;含义是什么&#xff1f; 一、http 协议的状态码类别二、常见的http 协议状态码及其含义 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; http 协议是互联网上应用最为广泛的协议之一&#xff0c;而http …

力扣HOT100 - 22. 括号生成

解题思路&#xff1a; class Solution {List<String> res new ArrayList<>();public List<String> generateParenthesis(int n) {if (n < 0) return res;getParenthesis("", n, n);return res;}private void getParenthesis(String str, int …

基于FPGA的数字信号处理(2)--什么是定点数?

在实际的工程应用中&#xff0c;往往会进行大量的数学运算。运算时除了会用到整数&#xff0c;很多时候也会用到小数。而我们知道在数字电路底层&#xff0c;只有「高电平1」和「低电平0」的存在&#xff0c;那么仅凭 0和1 该如何表示小数呢&#xff1f; 数字电路中&#xff0…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.3--Cortex-A7寄存器介绍

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

C#应用程序实现多屏显示

前言 随着业务发展&#xff0c;应用程序在一些特定场景下&#xff0c;只在一个显示器上展示信息已经不能满足用户需求。我们如何把主屏运行程序中多个窗体移动到各个扩展屏幕位置显示呢&#xff1f;C# 是通过什么方式来实现的&#xff0c;下面介绍 C# 使用 Screen 类的方式来实…

maven多模块创建-安装配置

1、前提 许久没有写文章了&#xff0c;荒废了2年多的时间&#xff0c;在整理的时候&#xff0c;发现Maven还差一篇安装配置的文章&#xff0c;现在开始提笔完善它&#xff0c;参考&#xff1a;https://blog.csdn.net/m0_72803119/article/details/134634164。 —写于2024年4月…

使用量排名前50的GPTs趋势和特征

Chatgpt的gpt商店已经有几千gpts了。目前哪些gpts比较受欢迎呢&#xff1f;有哪些趋势和投资呢? 根据whatplugin.ai&#xff08;截止日期为2024年3月&#xff09;&#xff0c;使用量最多的50个gpts数据分析结果如下&#xff1a; GPTs类型的分布情况如下&#xff1a; 图像生成…

智慧能源数据监控平台

随着科技的飞速发展&#xff0c;能源管理已逐渐从传统的粗放型向精细化、智能化转变。在这个转型过程中&#xff0c;HiWoo Cloud平台的智慧能源数据监控平台以其独特的技术优势和创新理念&#xff0c;正引领着能源管理的新潮流。 一、智慧能源数据监控平台的概念 智慧能源数据…

记录一次大数据量接口优化过程

问题描述 记录一次大数据量接口优化过程。最近在优化一个大数据量的接口&#xff0c;是提供给安卓端APP调用的&#xff0c;因为安卓端没做分批次获取&#xff0c;接口的数据量也比较大&#xff0c;因为加载速度超过一两分钟&#xff0c;所以导致接口超时的异常&#xff0c;要让…