Java中类与对象的初认识(上)

本文介绍了Java中面向对象的概念,对比了Java与C语言的区别。文章详细讲解了如何认识类与对象,如何正确实例化一个对象,并重点讨论了this引用的使用和理解,通过示例代码说明了this引用在解决命名冲突中的作用。
摘要由CSDN通过智能技术生成

  先导:

  或许在我们学习Java的过程中,肯定有过一个问题。为什么我们在写代码的过程中,我们的代码几乎涵盖在class之中,并且class还有public、static等一系列关键字进行修饰。对于一开始学习了一段时间C语言,并对于C语言有了一定认识的编程者,肯定有着些许疑问。那么本文,就将聚焦于以下问题,希望能给有疑惑的你们带来帮助。

  1.如何认识类与对象?

  2.如何正确的实例化一个对象?

  3.this引用(重点内容,建议仔细理解)

  (臭不要脸环节)如果看了这篇文章,能否给作者一个赞呢?如果给作者一个免费的关注那就再好不过啦~

 


现在本文正式开始。

1. 类和对象

  1.1 Java是面对对象的一门编程语言

  如果大家有看过我之前撰写C语言实现通讯录,C语言实现三子棋、扫雷等等对于初学者有难度,并且称得上是中大规模的代码讲解,不难发现C语言是一门面对过程的编程语言。当我们想用C语言去解决问题时,我们总是会站在解决问题的流程角度,或者问题本身的流程上去思考问题。我们拿下棋来举例。

生成棋盘;

玩家下棋;

判断输赢;

电脑下棋;

判断输赢;

......

  虽然这个流程可能并不严谨,但是不难发现我们在用C语言实现去解决“下棋”这一问题的时候,的确就是这么做的。

  但是Java却不是这样的。Java跟C语言最为本质上的区别,笔者认为便是编程的底层思维不同。Java是一门面对对象的语言,使用Java语言,编程者不关心整件事情的流程,只关心这个事情或者问题中有几个对象,通过对于对象间的交互来解决问题或者是推动事件,而具体如何交互,交互的具体细节,我们不这么关心,我们依然拿下棋来举例。

对象:棋盘,棋子,玩家,电脑

  你会惊人的发现,我只抽象在下棋这件事情中出现的对象(这里我要提一嘴,每个人的抽象能力不同,有的人能抽象出多个对象,有的人少,这是个人能力问题,没有优劣之分,根据具体问题来抽象出合数数量的对象永远是最优解),而玩家落子这个事情就是玩家和棋盘,棋子之间的交互,判断输赢是棋子和棋盘之间的交互。至于如何实现这些细节,Java不是很关心。

  当然,在你没有系统学习类与对象的思想之前,自然不可能使用类与对象的方法来进行编程,所以对于类与对象没有感觉是正常的,通过这篇文章,在加上对于Java不断地深入认识,我想你会彻底理解类与对象,最后彻底面对对象。

  1.2 简单认识类 简单认识对象

  既然我们一直把类和对象放在一起说,那么他们两肯定是有着千丝万缕的联系的,在这里我们用生活中的例子来帮助大家理解。

 例如我用笔记本电脑来举例,你会发现无论是联想拯救者y9000p、机械革命蛟龙16、苹果MacBook等等等等都是笔记本电脑,但是你会明显的感觉到y9000p无法代表所有的笔记本电脑,它是笔记本电脑这个大类里的一个具体对象。

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥)。

  既然我们对于类,有了一个初步的认识了,那么,我们可以自己动手试试创建一个类,那么我们就以“学生”类来举例吧!

  

  我在IDEA里自主定义了一个类,通过这个类,我们可以推导出类在定义时的语法格式。

class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}

  通过这个语法格式,我们就能自主定义一个类了~

  这里跟大家说一下在定义类的时候需要注意的事项

1. 一般一个文件当中只定义一个类
2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
3. public修饰的类必须要和文件名相同

  虽然我们已经自主创建了一个学生类了,但是我们通过代码解决问题是通过对象的交互来完成的,所以就得掌握如何实例化一个对象!

  2. 类的实例化

  

class Student{
    String name;
    String sex;
    int classRoom;
    public void eat(){
        System.out.println(this.name+"正在吃饭~");
    }

    public static void main(String[] args) {
        Student student1 = new Student(); //我很重要
        student1.name = "lisi";
        student1.sex = "Male";
        student1.eat();

    }
}

  你会发现我们有一行极其关键的代码,就是含有“new”关键字的那一行,因为只有这么写,IDEA知道了在类里面有一个具体的对象student1。通过new关键字来创建对象,这个动作我们称作“类的实例化”,这个还挺形象的。

  当然,我们在类的实例化过程中,也有一些注意事项~

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

  3. this引用

  细心的同学可能发现了,刚刚在写代码的时候,在eat这个成员方法里有一个从未见过的关键字“this”,关于这个引用,我们可得好好说说。

  this引用类型指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

  什么意思呢?我们先以我们自己创建的学生类举一个例子。程序首先运行main方法,知道了我实例化了一个Student类的对象student1,然后对于他的成员属性进行了赋值,最后调用了成员方法eat。然后程序跳转到类中eat方法。因为是student1调用的eat方法,所以这里的this引用指向的就是student1!!!,其内部存储的地址也是student1的地址!!!

  各位在理解的时候一定注意,this是引用类型!!!

  但是通过这个代码,其实并不能很好的阐述this引用的作用,毕竟这里不用this引用也可以达到一模一样的结果,所以,我们再来看一串代码。

  

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

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

    public void printDate() {
        System.out.println(year + "/" + month + "/" + day);
    }

    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);
        
        d1.printDate();
        d2.printDate();
    }
}

    以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。

  然后当你运行miain方法的时候你会发现参数根本没有传上去,打印出来的结果并不是你要的。

 可怜的6个0...

  所以这一段代码一定一定是出了问题的,问题就在setDay这个成员方法中。很容易就发现的是,这个代码中的形参和成员变量的名字一模一样,在IDEA的视角看来,有以下几种选项。

  成员变量给成员变量赋值?

参数给参数赋值?

参数给成员变量赋值?

成员变量是参数?

  所以这么多选项,IDEA也不知道你什么意思,索性摆烂,完全不管,所以成员变量没有被赋值,打印出来的仅仅是他们自身的默认值罢了。

  而我们的this引用就能完美解决这个问题,我们来修改一下这个代码。

  

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(year + "/" + month + "/" + day);
    }

    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);
        
        d1.printDate();
        d2.printDate();
    }
}

  

   我在setDay方法中增加了this引用,那么结合我们前面的分析,this引用指向的是调用这个成员方法的对象,那么IDEA就是不是知道了,我要把形参的值赋给成员变量。这样是不是就不会出现值传不上去的尴尬事件了。

  3.1 this引用的深度理解(作为你耐心看到这里的附赠品)

  那既然你都看到这里了,我就在额外讲讲this引用的深度内容。

  我们知道,this代表了当前对象的引用,但是,当有多个对象调用同一个成员方法或者是成员变量,IDEA怎么做到精准赋值,精准调用呢?

  我们进入Debug模式,细细查看,就知道了这其中的缘由。

 

    首先我们实例化了d1,d2两个变量,然后我们可以看到他们的地址是Date@498 Date@500 然后,继续调试程序,我们发现当运行到setDay方法的时候,this引用存储到d1的地址,同时,将this引用作为参数传到了setDay方法中!!!所以,setDay方法能够实现精准赋值。

  那么到这里我们Java中类与对象的初认识的上半部分就结束了,下一篇文章我们会聚焦于更为难以理解的内容,大家做好准备!

  (再一次臭不要脸环节)如果看完了这篇文章,能否给作者一个赞呢?如果给作者一个免费的关注那就再好不过啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值