• Java类和对象


    Hello小伙伴们,C语言的更新暂时告一段落,从今天开始,小编会给大家分享自己的Java的学习过程,快来和小编一起学习吧!

    大家一定有所耳闻,在Java中一切皆对象,那么今天小编就和大家介绍何为类和对象?


    1. 面向对象的初步认知

    1.1 什么是面向对象

    Java 是一门纯面向对象的语言 (Object Oriented Program ,简称 OOP) ,在面向对象的世界里,一切皆为对象。 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

    1.2 面向对象与面向过程

    假设:

    下图中男孩(boy)女孩(girl)类(class),而具体的每个人为该类的对象(object)

    下图中汽车类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。


    Java中的对象

    现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。

    拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。

    对比现实对象和软件对象,它们之间十分相似。

    软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。

    在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

    Java 中的类

    类可以看成是创建 Java 对象的模板。

    通过上图创建一个简单的类来理解下 Java 中类的定义:

    1. public class Dog {
    2. String breed;
    3. int size;
    4. String colour;
    5. int age;
    6. void eat() {
    7. }
    8. void run() {
    9. }
    10. void sleep(){
    11. }
    12. void name(){
    13. }
    14. }

    一个类可以包含以下类型变量:

    • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
    • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
    • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

    一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法,接下来我们学习如何定义类和使用。

     2.类定义和使用

    2.1 简单认识类

    类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干啥) ,描述完成后计算机就可以识别了:

    比如:洗衣机,它是一个品牌,在 Java 中可以将其看成是一个类别。
    属性:产品品牌,型号,产品重量,外观尺寸,颜色 ...
    功能:洗衣,烘干、定时 ....

    2.2 类的定义格式

    那么我们该如何定义一个类呢,往下看

    在Java中定义类时需要用到class关键字,具体语法如下

    1. // 创建类
    2. class ClassName{
    3. field; // 字段(属性) 或者 成员变量
    4. method; // 行为 或者 成员方法
    5. }
    class 定义类的关键字, ClassName 为类的名字, {} 中为类的主体。

    类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法:
    1. class WashMachine{
    2. public String brand; // 品牌
    3. public String type; // 型号
    4. public double weight; // 重量
    5. public double length; // 长
    6. public double width; // 宽
    7. public double height; // 高
    8. public String color; // 颜色
    9. public void washClothes(){ // 洗衣服
    10. System.out.println("洗衣功能");
    11. }
    12. public void dryClothes(){ // 脱水
    13. System.out.println("脱水功能");
    14. }
    15. public void setTime(){ // 定时
    16. System.out.println("定时功能");
    17. }
    18. }

    3.类的实例化

     3.1 什么是实例化

    定义了一个类,就相当于在计算机中定义了一种新的类型 ,与 int double 类似,只不过 int double java 语言自 带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog 类和 Student 类。它们都是类 ( 一种新定 义的类型) 有了这些自定义的类型之后,就可以使用这些类来定义实例 ( 或者称为对象 )
    用类类型创建对象的过程,称为类的实例化 ,在 java 中采用 new 关键字,配合类名来实例化对象,举个例子:
    1. class Dog {
    2. public String name;
    3. public String color;
    4. public void fun1() {
    5. System.out.println("汪汪汪!");
    6. }
    7. public void fun2() {
    8. System.out.println("摇尾巴!");
    9. }
    10. }
    11. public class Test_4 {
    12. public static void main(String[] args) {
    13. Dog dog = new Dog();
    14. dog.name = "旺财";
    15. dog.color = "黄色";
    16. System.out.println(dog.name);
    17. System.out.println(dog.color);
    18. dog.fun1();
    19. dog.fun2();
    20. }
    21. }

    输出结果:

     

    注意事项

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

     3.2类和对象的说明

    1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .
    2. 类是一种自定义的类型 ,可以用来定义变量 .
    3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
    4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

    4.this引用

    4.1 为什么要用this引用

    我们先来举个例子:

    1. class DateUtil {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public void setDate(int y, int m, int d) {
    6. year = y;
    7. month = m;
    8. day = d;
    9. }
    10. public void show() {
    11. System.out.println("年:" + year + "月:" + month + "日:" + day);
    12. }
    13. }
    14. public class Test_2 {
    15. public static void main(String[] args) {
    16. DateUtil dateUtil = new DateUtil();
    17. dateUtil.setDate(2022, 11, 4);
    18. dateUtil.show();
    19. }
    20. }

    这段代码我们可以看到一个DateUtil类下有多个成员变量和方法,通过一个新的对象去调用这些成员和方法,但是如果这里我们将SetDate中改写成如下代码:

    1. public void setDate(int y, int m, int d) {
    2. year = year;
    3. month = month;
    4. day = day;
    5. }

    结果:

    我们可以看到,这样并不能给类里的成员变量实例化,是因为这里形参名和成员变量名相同,相当于形参给形参赋值,并没有达到预期的效果,那么在这里this的作用就出来了,我们只需要在这些成员变量前面加个this就好了,这样就能赋值并输出了,那么问题来了,什么事this引用呢???

    4.2 什么是this引用

    this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

    1. public void setDate(int year, int month, int day) {
    2. this.year = year;
    3. this.month = month;
    4. this.day = day;
    5. }

    这里的this表示给当前的对象赋值;

    4.3 this引用的特性

    • 1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

    • 2. this只能在"成员方法"中使用

    • 3. "成员方法"中,this只能引用当前对象,不能再引用其他对象

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

     5. 对象的构造及初始化

    5.1 如何初始化对象

    通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败:
    1. public static void main(String[] args) {
    2. int a;
    3. System.out.println(a);
    4. }
    5. // Error:(26, 28) java: 可能尚未初始化变量a
    1. public static void main(String[] args) {
    2. Date d = new Date();
    3. d.printDate();
    4. d.setDate(2021,6,9);
    5. d.printDate();
    6. }
    7. // 代码可以正常通过编译
    需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:
    1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?
    2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

     5.2 构造方法

       5.2.1 概念

    构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次,举个例子:
    1. public Date(int year, int month, int day){
    2. this.year = year;
    3. this.month = month;
    4. this.day = day;
    5. System.out.println("Date(int,int,int)方法被调用了");
    6. }

    注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

       5.2.2 特性

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

    举个例子:

    1. class DateUtil {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public DateUtil() {
    6. System.out.println("调用了该方法");
    7. }
    8. public DateUtil(int year, int month, int day) {
    9. this.year = year;
    10. this.month = month;
    11. this.day = day;
    12. System.out.println("调用了3个参数的构造方法!");
    13. }
    14. /*public void setDate(int year, int month, int day) {
    15. this.year = year;
    16. this.month = month;
    17. this.day = day;
    18. }*/
    19. public void show() {
    20. System.out.println("年:" + year + "月:" + month + "日:" + day);
    21. }
    22. }
    23. public class Test_2 {
    24. public static void main(String[] args) {
    25. DateUtil dateUtil = new DateUtil(2022, 11, 11);
    26. dateUtil.show();
    27. }
    28. }

    这里我们通过构造方法直接给成员变量初始化,而并没有调用setDate这个方法,这就是构造方法!


    我们也可以通过this引用去调用构造方法:

    1. class DateUtil {
    2. public int year;
    3. public int month;
    4. public int day;
    5. public DateUtil() {
    6. this(2022,11,11);
    7. System.out.println("调用了该方法");
    8. }
    9. public DateUtil(int year, int month, int day) {
    10. this.year = year;
    11. this.month = month;
    12. this.day = day;
    13. System.out.println("调用了3个参数的构造方法!");
    14. }
    15. /*public void setDate(int year, int month, int day) {
    16. this.year = year;
    17. this.month = month;
    18. this.day = day;
    19. }*/
    20. public void show() {
    21. System.out.println("年:" + year + "月:" + month + "日:" + day);
    22. }
    23. }
    24. public class Test_2 {
    25. public static void main(String[] args) {
    26. DateUtil dateUtil = new DateUtil();
    27. dateUtil.show();
    28. }
    29. }

    这里可以发现,我们在主函数中的DateUtil()方法中并没有传参,而是通过构造方法,用this给成员变量初始化,这样输出也能达到预期的结果!

    注:当通过this去调用构造方法时,this要放在第一行,否则代码编译不通过

     

    5.3 默认初始化

    如果在类里的成员变量没有赋值,编译器默认会赋一个初始值:

    1. class DateUtil {
    2. public int year;
    3. public boolean month;
    4. public float day;
    5. public DateUtil() {
    6. System.out.println("调用了该方法");
    7. }
    8. public DateUtil(int year, boolean month, float day) {
    9. this.year = year;
    10. this.month = month;
    11. this.day = day;
    12. System.out.println("调用了3个参数的构造方法!");
    13. }
    14. /*public void setDate(int year, int month, int day) {
    15. this.year = year;
    16. this.month = month;
    17. this.day = day;
    18. }*/
    19. public void show() {
    20. System.out.println("年:" + year + "月:" + month + "日:" + day);
    21. }
    22. }
    23. public class Test_2 {
    24. public static void main(String[] args) {
    25. DateUtil dateUtil = new DateUtil();
    26. //dateUtil.show();
    27. System.out.println(dateUtil.year);
    28. System.out.println(dateUtil.month);
    29. System.out.println(dateUtil.day);
    30. }

    运行如下:


    这里有张表供大家参考:

     

     

     6.总结

    到这儿今天的主题就和大家介绍完了,小编也是刚刚学习java的小白,后续还会给大家分享Java的相关知识,一起学习,一起进步,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!

  • 相关阅读:
    VL53L5CX驱动开发(5)----运动阈值检测
    java集合类史上最细讲解 - HashTable,Properties篇
    CS231n课程笔记:Leture5 Convolutional Neural Networks
    基于springboot敬老院管理系统毕业设计-附源码261535
    Spring Cloud Gateway 搭建网关
    通过cri-o部署k8s集群环境
    智能计算之粒子群算法(PSO)介绍
    如何处理linux 自动执行的sh脚本
    基于单片机的八路抢答器(数码管版)(独立按键、四位共阳极数码管、指示灯)
    Unity Samples和帧动画的问题
  • 原文地址:https://blog.csdn.net/m0_63635730/article/details/127809398