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

news/2024/9/24 10:16:53/

目录

小引 

1. this

this引用

this的特性

this的使用 

2. 对象的构造及初始化

如何初始化对象

构造方法

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

方式一

方式二

方式三

直接初始化 


小引 

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

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

java">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();}
}

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

我们继续向下看 

java">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 引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该 引用去访问
java"> 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方法内部中定义一个局部变量的时候,一定要初始化。否则会报错 

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

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

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

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

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

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

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

java">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就是构造方法 

构造方法

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

语法结构:

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

}

java">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. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法) 

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

java">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去访问成员变量,并进行赋值 

java">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();}
}

方式二

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

java">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(...) 就是调用对应参数的构造方法

java">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();}
}

直接初始化

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

http://www.ppmy.cn/news/1444845.html

相关文章

Day28:ElasticSearch入门、Spring整合ES、开发社区搜索功能

ElasticSearch入门 Elasticsearch简介 一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索(非结构化的也可以)。搜索速度快,可以提供实时的搜索服务。便于水平扩展(集群式部署),每秒可以处…

Android 12系统源码_窗口动画(一) ActivityOptions实现窗口打开动画的流程

一、通过ActivityOptions获取Activity对应的打开动画 1、我们可以通过ActivityOptions类,实现打开Activity的时候有对应的缩放动画。 private void startActivity(View view) {int width view.getMeasuredWidth();int height view.getMeasuredHeight();Log.d(TAG…

人工 VS AGV无人搬运机器人,AGV赋能中国智能制造

agv 机器人作为智能制造的重要抓手,正在渗透到各个传统行业,成为我国制造业转型升级的焦点。未来,智能AGV将不仅仅是简单的把货物搬运到指定的位置,而是要把5G技术、大数据、物联网、云计算等贯穿于产品的设计中,让智能…

AI智能名片商城小程序:引领企业迈向第三增长极

随着数字化浪潮的席卷,私域流量的重要性逐渐凸显,为企业增长提供了全新的动力。在这一背景下,AI智能名片商城系统崭露头角,以其独特的优势,引领企业迈向第三增长极。 私域流量的兴起,为企业打开了一扇新的销…

SpringCloud系列(21)--更换Ribbon的负载均衡模式

前言:在上一篇文章中我们介绍了关于Ribbon的知识点已经如果去应用Ribbon,而本章节内容则是关于如何去切换Ribbon的负载均衡模式。 以下是上篇文章的部分内容,可以再看下熟悉下,方便后续理解 Ribbon工作架构图 Ribbon的负载均衡模式…

搭建智能客服机器人设计流程

一、检索型机器人FAQ-Bot 在客服处理的问题中70%都是简单的问答业务,只要找到QA知识库中与用户当前问句语义最相近的标准问句,取出答案给用户就可以了。FAQ-Bot就是处理这类问题的。在没有使用深度学习算法之前,通常采用检索NLP技术处理。 …

Arcgis Pro 制图基础操作流程

为什么推荐用Arcgis Pro 出图? 1、相比Arcmap 10.X,Pro的制图功能更强大,制图更便捷 2、相比PS,Arcgis Pro中的数据自带坐标,无需校正,表达更准确 3、自带底图,方便又美观 01 — 与Arcmap …

程序包 org.junit 不存在解决方案

问题描述 git 拉取其它同事维护的应用,构建报错:项目默认的单元测试类 ExampleUnitTest 涉及到 junit 的类都找不到。查看 build.gradle 配置的依赖项,缺失了 org.junit 的依赖。 问题解决 因为是在无法联网环境下开发,为避免从…