• 第四章《类与对象》第1节:类的定义与对象的创建


    类和对象是Java语言中两个非常重要的概念。类与对象的关系是:对象是类的实例,类是对象的模板,也就是说,对象是以类为模板创建出来的。

    4.1.1类的定义

    计算机最初被发明出来是为了帮助人们完成数学计算的。但随着时代的发展,计算机已不仅仅用于单纯的数学计算,它在各行各业都有相当广泛而深入应用。就拿一个最常见的应用领域--信息管理来举例:目前我国基本上已经实现了用计算机软件来管理公民档案信息。公民档案信息其实就是人的信息。那么如何用计算机来记录一个人的信息呢?大家都知道:一个人有很多基本信息,比如他的姓名、年龄、性别、身高、体重等等。仅用Java语言提供的8种基础数据类型变量虽然也能记录和表示出人的一些基本信息,比如用int型的变量age来表示人的年龄,用char型的变量sex来表示人的性别等等,但任何一个变量都仅能表示出人的某个单项信息,无法全面的表示出一个人的整体情况。更进一步说,程序员无法用这些简单的变量表示出“人”这个概念。因此,想要全方位的表示出一个人的所有信息,就需要一种更为复杂的数据类型。但是Java语言中并没有提供这样的数据类型,这就需要程序员自己动手定义出一种全新的、复杂的数据类型来记录人的所有基本信息。想要定义出某种类型的数据,需要用到关键字class,其格式如下:

    class 名称{

        数据类型1 名称1;

        数据类型2 名称2;

        ...

        数据类型n 名称n;

    }

    很多读者可能会问:class关键字不是用来定义类的吗?确实如此,其实“类”的最基本含义就是某种数据类型,更确切的说是一种比基础数据类型更为复杂的数据类型,这种数据类型专门用来表示某一类特定的事物。

    就以上文提到例子来说,如果希望定义出一种类型的数据来表示“人”,可以用如下代码实现:

    1. class Person {
    2.     String name;//姓名
    3.     char sex;//性别
    4.     int age;//年龄
    5. }

    以上代码所定义的Person类就是一种复杂的数据类型,这种复杂的数据类型在专业被称为“引用数据类型”。可以看到,在Person类中包含了3项数据,分别是String类型的name,它表示人的姓名,char类型的sex,它表示人的性别,还有int类型的age,它表示人的年龄。这些数据共同存在于Person类中,从而全方位的表示出了人的各项信息。专业上,把定义在类当中的各项数据称为“属性”,因此,定义在类中的name、sex和age都是Person类的属性。属性的作用就是定义和描述某一类事物所具有的特征。Person类不仅仅定义出了一种新的数据类型来记录人的各项信息,从更深层次意义上来讲,它用代码的形式在程序中清晰而准确的表示出了“人”这个概念。

    通过这种方式,开发人员就可以在程序中定义各种类来表示世间万物并记录它们的数据信息。比如,开发者需要在程序中表示出“汽车”这个概念,并且还要记录它的品牌和价格这两项数据信息,就可以定义一个Car类,并且在类中定义出表示品牌和价格的属性。同样,如果需要表示电话,就定义一个Phone类,并在类中定义出相关属性。

    有的读者可能会问:现在已经学会了定义类,但是定义类的代码应当写在哪里呢?其实早在第1章中就介绍了创建类的方法。只需要单击工程名下面的源程序文件夹src,然后在IDEA的File菜单中选择new选项,并在拉伸出的子菜单中选择Java Class菜单项即可新建一个类。按照命名规范,要把类名的首字母设置为大写。新建好的类会出现在一个新的源程序文件中,并且会在类名称的前面自动添加一个public关键字以表示这个类是可以被公开访问的。新建好的类仅有一个空的框架,程序员需要自己把各个属性写入类的内部。

    还有的读者可能会问:人并不应该只有姓名、性别和年龄这3项属性,还应该有身高、体重等其他很多属性,这些属性为什么没有被定义在类中呢?其实,任何一类事物都有很多属性,但程序员没有必要把所有的属性都定义到类中,以上代码只是举例说明如何定义属性。在实际开发过程中,程序业务需要用到哪些属性,就把它定义到类中。而与程序业务无关的属性可以不用定义。以视力这个属性来说,如果程序员开发的是一个《居民体检信息管理系统》,并且系统中需要记录人的视力情况,那么Person类中就应该定义视力这个属性,而如果开发的是一个《居民户籍信息管理系统》,并且系统中不需要记录人的视力信息,那么视力这个属性就完全没有必要定义在Person类中。

    此处还需要提示各位读者:类中所定义的属性不仅仅可以是基础数据类型的,也可以是引用数据类型的。比如Person类中的name就是引用数据类型的属性,它是String类型的。String也是一个类,它表示字符串。String类来自于Java基础类库,它是由Java官方所定义的。

    4.1.2 对象的创建

    至此,各位读者已经掌握了如何通过定义类来表示出复杂数据类型。如果希望在程序中使用Person类型的数据来记录一个人的信息该怎样操作呢?很多读者仿照声明变量的格式,会写出这样的代码:

    Person p;

    这种写法从语法上来讲是正确的,但首先需要强调:Person类型的数据p从专业上讲并不应该被称为“变量”,而是被称为“对象”。与声明基础数据类型的变量不同,这行代码在被执行后,只是声明了p的存在,虚拟机并没有在内存中为p分配存储空间,也就是说,此时p还没有真正成为一个对象。如果想让虚拟机为p分配相应的内存空间,就要像初始化数组一样用new关键字来完成初始化操作,代码如下:

    p = new Person();

    只有用new关键字完成了初始化操作,虚拟机才为p这个对象分配内存空间,此时p才真正成为了一个对象。当然,声明p的存在和对其进行初始化操作也可以在同一条语句中完成,代码如下:

    Person p = new Person();

    初始化操作不仅仅为对象分配了存储空间,并且还为对象的各个属性设置了默认值。那么,对象属性的默认值是多少呢?其实它们的默认值与数组元素的默认值是一样的,也就是说,如果是数字类的属性,比如int型的age属性,其默认值都是0,而char型的属性,它的默认值是编码为0的那个字符,boolean型的属性,其默认值是false。属性并非全部都是基础数据类型,例如前面定义的Person类,它的name属性就是String类型的,这就是一个引用数据类型的属性。对于任何一种引用类型的属性而言,其默认值为null,在Java语言中null表示空对象。

    其实,程序员也可以在定义类的时候为各个属性设置自己希望的默认值,例如:

    1. class Person {
    2.     String name = “张三”;//姓名,默认值为“张三”
    3.     char sex = ’男’;//性别,默认值为’男’
    4.     int age = 10;//年龄,默认值为10
    5. }

    以上代码在定义类的同时由程序员为各个属性设置了默认值。在程序中访问对象的属性,需要用以下格式实现:

    对象名.属性

    下面的【例04_01】演示了如何创建一个Person类的对象并访问它的各项属性:

    【例04_01 对象的创建和属性的访问】

    Person.java

    1. public class Person {
    2.     String name;//姓名
    3.     char sex;//性别
    4.     int age;//年龄
    5. }

    Exam04_01.java

    1. public class Exam04_01 {
    2.     public static void main(String[] args) {
    3.         Person p = new Person();//创建Person类对象p
    4.         //为对象设置属性值
    5.         p.name = "李小华";
    6.         p.sex = '女';
    7.         p.age = 20;       
    8.         System.out.println("姓名:"+ p.name);
    9.         System.out.println("性别:"+ p.sex);
    10.         System.out.println("年龄:"+ p.age);
    11.     }
    12. }

    需要提醒各位读者:从本章开始,很多案例都不只有一个类。例如当前的【例04_01】就包含Person和Exam04_01两个类。所以要想成功运行本案例,需要从《范例4-1》中把这两个类的源文件全部复制粘贴到工程的src文件夹下。

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

  • 相关阅读:
    2024深圳杯(东北三省)A题多个火箭残骸的准确定位原创论文分享
    计算机毕业设计 基于SpringBoot家政服务平台的设计与实现 Java实战项目 附源码+文档+视频讲解
    嵌入式-原码、补码,反码的存储
    @ConfigurationProperties注解的使用
    R可视化:生存分析森林图
    大数据基础问题:在Hive中如何实现全增量统一的UDTF、内置函数、聚合、Join等计算引擎常见算子?
    Linux下PostgreSQL安装部署详细步骤
    T293037 [传智杯 #5 练习赛] 白色旅人
    记录本地部署Stable-diffusion所依赖的repositories和一些插件
    专利申请流程,专利类型怎么确定
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128011618