JAVASE之类和对象(1)

路虽远,行则将至;事虽难,做则必成。

主页:趋早——Step
专栏:JAVASE
gitte:https://gitee.com/good-thg

在这里插入图片描述
引言:
这篇文章我们只介绍前半部分,下一篇文章会介绍剩下的部分。

一、面向对象

1、什么是面向对象

面向对象是一种编程范式,它将程序组织成对象的集合,每个对象都有自己的状态和行为。在面向对象的编程中,程序通过定义对象的属性和方法来描述问题的解决方案。对象可以通过与其他对象进行交互来实现特定的功能。面向对象的编程主要包括封装、继承和多态三个特性,通过这些特性可以使程序更加模块化、可维护和可复用。
我们学习的Java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来设计程序,更符合人们对事物的认知,对于大型程序的设计、扩展及维护都非常友好。

2、面向对象与面向过程

我们都知道曹操称象的故事吧!我们分别用面向对象和面向过程来讲述一下这个过程:
(1)面向过程:我们要准备一艘可以装的下大象的船,接着我们将大象赶到船上,然后乘坐另一艘小船,在水位处划一条线,再把大象从船上赶下来,我们继续在同一条船上搬石头,一块,两块…,直到船的水位下降到到我们之前划的线上,然后我们准备一个称,将船上的石头卸下来分批放到称上,并且记录每一批石头的重量,最后将所有数据全部相加,这时候就可以计算出大象的重量了。
(2)面向对象:把大象赶到船上(…),在船上放上石头(…),在称上放石头(…),得到大象重量。
通过这个故事,我们知道了面向过程是把事情分成一步一步的,然后按照步骤一步一步的做出来,而面向对象是给对象相应的方法,最后得出结果。以面向对象的方式来处理,就不用关心过程了,是通过对象之间的交互来完成的。

二、类定义和使用

1、认识类

类是用来对一个实体进行描述的,主要关注该实体具有哪些属性,哪些功能,描述完成以后计算机就可以识别出结果了。

2、类的定义格式

在这里插入图片描述

注意事项:
1、类名采用大驼峰定义;
2、成员前写法统一为public。

3、定义一个学生类

public class Student {
     // 成员变量
    public String name;
    public int age;
    // 成员方法
    public void Exam(){
        
    }
}

三、类的实例化

1、什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是Java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上面定义的Student类。有了这些自定义类型之后,就可以使用这些类来定义实例。
用类类型创建对象的过程,称为类的实例化,在Java中采用new关键字,配合类名来实例化对象。

class Student {
    public String name;
    public int age;

    public void Exam(){
        System.out.println("考试......");
    }
}
public class Test {
    public static void main(String[] args) {
        // 通过 new 实例化对象
        Student student = new Student();
        student.name = "Tom";
        student.age = 12;
    }
}

注意事项:

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

2、类和对象的说明

(1)类只是一个模型一样的东西,用来对一个实体进行描述,限定了有哪些成员;
(2)类是一种自定义的类型,可以用来定义变量;
(3)一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。

四、this引用

1、为什么要有this引用

在这里,我们定义一个Date类来进行演示:

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


    // 设置日期
    public void setDate(int y, int m, int d){
        year = y;
        month = m;
        day = d;
    }

    // 打印日期
    public void printDate(){
        System.out.println(year + "年" + month + "月" + day + "日");
    }
    
}

这个时候,我们该如何打印他们呢?看下面代码:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
但是,如果我们不想这样一个一个进行赋值,而是一次性的赋值,该怎么办呢?
我们在上面的代码中,已经定义了setDate,所以,我们可以调用setDate来进行赋值。代码如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
通过以上的两种方法,就可以进行赋值和打印了,然而,这跟this引用有什么关系呢?我们继续往下学习。
我们想想,现在我们的setDate是这样的:
在这里插入图片描述
假如说,我们把setDate改成下面这样:
在这里插入图片描述
在这个时候,到底是谁给谁赋值,到底设置的是哪个对象呢?
我们运行代码试试:
在这里插入图片描述
这是什么原因呢?
这是因为局部变量优先,是形参自己改自己赋值了,没有赋值到成员变量当中。
在这个时候,我们的this就派上用处了,他可以让他赋值到成员变量当中。我们看下一部分:

2、什么是this引用

我们将this加入到我们的setDate中:
在这里插入图片描述
我们将main方法中写成这样:
在这里插入图片描述
代码运行结果如下:
在这里插入图片描述
这个时候,我们有问题了:成员函数执行的时候,他是怎么知到打印的是哪个对象,设置的是哪个对象?
这就是this的作用,我们认为:

this引用指向当前对象

通俗来讲,谁调用setDate,谁就是当前对象。
这时候,我们就可以知道什么是this引用了

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

3、this引用的特性

(1)this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;

(2)this只能在“成员方法”中使用;

(3)在“成员方法”中,this只能引用当前对象,不能引用其他对象;

(4)this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的引用传递给该成员方法,this负责来接收。

接下来,我们把完整代码展示出来:

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


    // 设置日期
    public void setDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    // 打印日期
    public void printDate() {
        System.out.println(this.year + "年" + this.month + "月" + this.day + "日");
    }

    public static void main(String[] args) {
        Date date = new Date();
        // 赋值
        date.setDate(2024, 5, 24);
        // 打印
        date.printDate();

        Date date1 = new Date();
        date1.setDate(2023, 5, 24);
        date1.printDate();
    }

}

五、对象的构造和初始化

1、如何初始化对象

我们来看下面这个代码:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
这是因为没有初始化报错,但是我们来看下面的代码:
在这里插入图片描述
运行一下:
在这里插入图片描述我们发现,每次对象创建好之后,要调用setStudent才能设置具体姓名和年龄,这是很麻烦的,但是我们到底该如何初始化呢?我们继续学习:

2、默认初始化

我们同样来看下面的代码:
在这里插入图片描述
在这个代码中,我们初始化了吗?没有,但是他会报错吗?我们看运行结果:
在这里插入图片描述
没有,这是为什么呢?
哇,好多为什么,那就让我们继续回答这一个一个的问题吧!
在这里,就是因为发生了默认初始化,所以才不会报错。我们看到的只是程序层面简单的一条语句,但是,在JVM层面就需要做好多事情,下面简单介绍:
(1)检测对象对应的类是否加载了,如果没有加载则加载;
(2)为对象分配内存空间;
(3)处理并发问题;
(4)初始化所分配的空间
就是对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

在这里插入图片描述

在这里,我们暂时知道这是默认初始化就好,至于为什么,我们可以后期学习。

3、就地初始化

就地初始化就是在声明成员变量时,就直接给出了初始值。
我们看代码:
在这里插入图片描述
这样运行会是什么结果呢?我们运行试试:
在这里插入图片描述
这就是我们的就地初始化,需要注意的是:代码编译完成后,编译器会将所有给初始化的这些语句添加到各个构造函数中。

4、构造方法

在我们学习了以上两种初始化方法,我们再来学习另一种初始化方法,叫做构造方法。

(1)概念

构造方法(也称构造器)是一个特殊的成员方法,这个方法没有返回值,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的声明周期内只调用一次。
在这里插入图片描述

现在问题来了,我们该怎么调用该构造方法呢?我们看下面的代码并且运行:
在这里插入图片描述

运行结果如下:
在这里插入图片描述
这是什么原因呢?我们将main方法改成如下这样:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
我们再来调用带两个参数的构造方法:
将main方法写为这样:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
所以我们认为:当构造方法调用完成之后,对象实际上才产生了。
其实我们还需要知道,当没有提供任何构造方法的时候,编译器会默认提供一个不带参数的构造方法,但是当我们有构造方法提供的时候,编译器就不会提供了。

(2)特性

<1> 名字必须与类名相同
<2> 没有返回值类型,设置为void也不行
<3> 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
<4> 构造方法可以重载
<5> 如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
<6> 在构造方法中,可以通过this调用其他构造方法来简化代码。

在这里插入图片描述
运行结构如下:
在这里插入图片描述
我们还要注意一点,this不能形成环。看下面代码:
在这里插入图片描述

<7> 绝大多数情况下使用public来修饰,特殊场景下会被private修饰。

好的,JAVASE第一部分到此就结束了,让我们期待下一篇吧!

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值