当前位置: 首页 > article >正文

JAVA篇之类和对象

目录

一. 面向对象

1.1 面向对象和面向过程

二. 类的定义和使用

2.1 什么是类

2.2 类的定义格式

 三. 类的实例化

四. this引用 

4.1 this引用的作用

 五. 构造方法

5.1 构造方法重载

5.2 通过this调用其他构造方法

 5.3 默认初始化

结语


一. 面向对象

Java 是一门面向对象的编程语言 (Object Oriented Program ,简称OOP),面向对象编程的核心思想是将数据(属性)和操作数据的方法封装成一个整体,即对象。对象之间通过信息传递来相互协作,从而实现特定的功能。

1.1 面向对象和面向过程

面向过程注重解决问题的步骤和操作,面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

举例说明:将大象装进冰箱

(1) 面向过程

第一步:打开冰箱

第二步:将大象塞进冰箱

第三步:关上冰箱

那么以上三个步骤就是就是把大象塞进冰箱的过程,我们注重这一件事的过程,那么这种解决问题的方法我们就叫做面向过程。

(2) 面向对象

那么此时只有人、大象、冰箱三个对象,将大象装进冰箱的整个过程是:人、大象、冰箱三个对象之间交互完成的,我们不需要关心大象是如何被装进冰箱的,那么这种不关注过程,通过对象之间的交互完成的解决问题的方式我们叫做面向对象。

注意面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

二. 类的定义和使用

什么是类呢?我们一起来简单认识一下

2.1 什么是类

类就是用来对一个对象进行描述的,主要描述该对象有哪些属性,哪些功能等

例如:学生

属性:年龄、姓名、性别......

行为:上学、吃饭、考试......

 那么我们知道了类的作用,那么该如何定义类呢?

2.2 类的定义格式

在JAVA中定义类的时候需要用到class关键字,语法格式如下:

class ClassName {    //ClassName表示类的名称

        field;       //表示成员变量(属性)

        method;      //表示行为或者成员方法
}

 那么我们来创建一个上述提到的学生类:

public class Student {
    public String name;//学生姓名
    public int age ;//学生年龄
    public int score ;//学生成绩

    public void eat()
    {
        System.out.println("正在吃饭......");
    }

    public void exam()
    {
        System.out.println("正在考试......");
    }
    
}

那么一个简单的学生类就创建好了,里面描述了学生的属性和行为。

定义类的注意事项:

1. 类型采用大驼峰定义

2.成员前写法统一为public ,后面会介绍其他的访问修饰限定符

 三. 类的实例化

通过上述描述我们知道 类 只是用来对一个实体进行描述的,通过实例化才能够创造出对象,那么在JAVA中我们该如何实例化出一个对象呢?这时候就要用到new这个关键字来进行实例化

以上述的学生类示范:

​
​
public class Student {
    public String name;//学生姓名
    public int age ;//学生年龄
    public int score ;//学生成绩

    public void eat()
    {
        System.out.println(name+"正在吃饭......");
    }

    public void exam()
    {
        System.out.println(name+"正在考试......");
    }
    
    public static void main(String[] args) {
        Student student1=new Student();
        student1.name="张三";
        student1.age=10;
        student1.score=99;
        student1.eat();
        student1.exam();
    }
}

​

​

 类实例化的注意事项:

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

四. this引用 

接下来我们看看这个日期类的代码和运行结果,让我们带着问题来探索this的用法。

​
​
public class Day {
    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 printDay(){
        System.out.println(year + "/" + month + "/" + day);
    }

    public static void main(String[] args) {
        Day d1 = new Day();
        Day d2 = new Day();
        Day d3 = new Day();
        d1.setDay(2020,9,15);
        d2.setDay(2020,9,16);
        d3.setDay(2020,9,17);
        d1.printDay();
        d2.printDay();
        d3.printDay();
    }
}

​

​

 通过运行结果可以看见,我们明明利用setDay方法d1、d2、d3都进行的赋值,那么打印出来的结果为什么还是0/0/0呢?

第一个问题:形参名与成员变量名相同时,形参究竟是给成员变量赋值呢还是形参自己对自己赋值呢?

第二个问题:此时我们的d1、d2、d3都在调用printDay方法,该方法是如何知道打印的是哪个对象的数据呢?

那么带着这两个问题,我们一起来探索一下this的用法。

4.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引用的year、month、day就是当前类的成员变量, 此时的赋值操作就是形参对成员变量进行赋值。
问题二:
public void printDay(){
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }

 printDay方法通过this引用就能够知道打印的是当前对象的数据。

 总结:
        1. 当形参名和成员变量名字相同时,通过this引用表示该变量是当前类的成员变量

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

 五. 构造方法

构造方法是一个特殊的成员方法,方法名必须与类名相同,构造方法可以直接给成员变量进行初始化

public class Day {
    public int year;
    public int month;
    public int day;
    
    public Day(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 static void main(String[] args) {
        Day d1=new Day(2024,10,10);
        d1.printDay();
    }
}

 注意事项:

1. 名字必须与类名相同
2. 没有返回值类型,设置为 void 也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
4. 如果不写构造方法,编译器会主动添加一个不带参数的构造方法
public class Day {
    public int year;
    public int month;
    public int day;

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

 那么如果我们自己写了一个构造方法,那么编译器就不会自动生成构造方法,正所谓救急不救穷。

5.1 构造方法重载

我们可以定义多个不同参数的构造方法,这样就实现了构造方法的重载,方便用于多种情况

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

    public Day()
    {
        
    }
    
    public Day(int year,int month,int day)
    {
        this.year=year;
        this.month=month;
        this.day=day;
    }
    
    public void printDay(){
        System.out.println(year + "/" + month + "/" +day);
    }
}

5.2 通过this调用其他构造方法

. 构造方法中,可以通过 this 调用其他构造方法来简化代码
public class Day {
    public int year;
    public int month;
    public int day;

    public Day()
    {
        this(2020,10,31);
    }

    public Day(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 static void main(String[] args) {
        Day d1=new Day();
        d1.printDay();
    }
}

注意事项:

1. this(...)必须是构造方法中第一条语句

2. 构造方法之间不能互相调用形成环

 5.3 默认初始化

在使用局部变量之前是必须进行初始化的,否则会进行报错。但是使用成员变量时,可以不进行初始化,当我们实例化一个对象后,对象空间被申请好之后,对象中包含的成员其实已经设置好了初始值。

结语

以上就是部分类和对象的内容,希望大家看完本篇后能够理解类和对象的概念,在此小新感谢大家的观看!!!

 


http://www.kler.cn/a/403889.html

相关文章:

  • C++桥接模式在使用时需要注意什么
  • 【Swift】字符串和字符
  • Spring Cloud Stream实现数据流处理
  • 宏景HCM uploadLogo.do接口存在任意文件上传漏洞
  • 【Visual Studio系列教程】如何在 VS 上编程?
  • NAT网络地址转换——Easy IP
  • 使用 LSTM(长短期记忆网络) 模型对时间序列数据(航空旅客人数数据集)进行预测
  • vue2.0新建项目
  • 无人机侦察打击方案(3)
  • 亚马逊云服务器(AWS):功能、优势与使用指南
  • 【YOLOv8】安卓端部署-1-项目介绍
  • 【C++】数据上传的方式。持久化的方式。通过 JSON,序列化与反序列化。
  • Vue2 Class Component 使用指南:提升组件开发的可维护性
  • 嵌入式linux中QT信号与槽基本操作与实现
  • CSS一些练习过程
  • 深度学习:ResNet每一层的输出形状
  • vue3项目执行npm install下载依赖报错问题排查方法
  • [WPF] RichTextBox如何显示省略号?
  • 学习ASP.NET Core的身份认证(基于Cookie的身份认证1)
  • Comfy UI 工作流(三)高清修复 - 低显存放大
  • 实验室管理效率提升:Spring Boot技术的力量
  • MySQL高可用方案之PXC(Percona XtraDB Cluster)
  • 13 go语言(golang) - 函数
  • Excel常用技巧分享
  • Android 网络请求(二)OKHttp网络通信
  • 公安、监管等政务部门实现数字化转型的解决方案