Java中的基本操作单元 - 类和对象

简介: Java中的基本操作单元 - 类和对象

一、概念浅析

说到类和对象,这都是两个比较抽象的词,如果用在程序中,那就更不知道是什么意思了。其实大家可以先不联系程序,我们在对一大堆东西分类的时候自然是有一个标准的,符合某些特征的分到一类,符合另外一些特征的分到另外一类。在每个类别中,每一样东西都有相同的特征,但是又有所差别,每一样东西就好比一个一个的对象,是一个切切实实的东西,而分类的类别就好似是一个标准或者描述,会更抽象一些。

1. 类的概念

在编程中,我们通常会借助程序去实现很多应用系统,来满足日常生活中的需要,如网络购物、人力资源管理等等。如果使用面向对象来开发,首先需要做的就是明确这个应用系统当中有哪些角色,这些角色都能够使用哪些功能,每种角色都有哪些自己的特征。

我们以一个教学管理系统为例,主要的功能就是进行排课,记录学生和教师的基本信息,记录和统计学生的学习成绩等。那这其中主要就涉及学生、教师、管理员三种角色,当有一批学生入学时,我们要将学生的信息录入系统,这就好像我们一直在填的各种表格,每个学生需要采集的信息都是固定的,不同的是信息的内容。

这就好比我们定义了一个学生类,我们想要收集的学生信息就是对这个类别的描述,学生有学号、有院系、有其他的基本信息,这也是学生的固有特征,于是我们可以用如下的代码描述:

// 用于描述学生的类
public class Student{
    String sno;// 学号
    String name;// 姓名
    String college;// 学院
    String major;// 专业
    ...
}

2. 什么是对象

理解了程序中类的概念和表示方式后,对象就比较好理解了。简单来说对象就是按照类的标准创建出来的一个具体可以操作的东西,也就是一个个具体的学生。每个学生都具备相同的特征,但是可以有不同的姓名、学院、专业等自己的信息。在程序运行时的体现就是内存中开辟了对应的空间,想要创建一个新的对象使用如下的代码:

public class Test{
    public static void main(String[] args){
        // 变量类型 变量名称 = new 类的构造器();
        Student student = new Student();
        // 大写的Student就是我们要使用的学生类型,名称必须完全一致
        // 小写的student就是由学生类创建出来的对象的名称
        // 也是我们操作对象时直接使用的名称
        // new是用来创建对象的关键字,需要调用相应的构造器
        // 有关于构造器的用法会在后续文章详细说明,初学可以记忆为:类名();
    }
}

3. 类和对象的关系

从上面的例子中我们已经可以看到,类相当于是一个模板或是像工厂的图纸,对象则相当于按照这个标准和模具创造出来的个体,每一个对象都具备相同的特征。

在程序中的体现就是,使用class关键字定义一个类结构,然后在这个结构中对整个类进行描述,都具备哪些属性,都可以产生行为,但是只有具体的对象可以具备具体的属性值和产生具体的行为(有关于静态的声明将在另外的文章中单独说明)。

二、类

我们应该如何描述和定义一个类呢?我们最开始写的HelloWorld不也是一个类嘛?为什么没这么多乱七八糟的概念?下面我们就来进一步解析。

从客观世界的角度出发,比如小明上了大学,这就是一个具体的学生,他有学号、姓名、对应的学院、专业等等,这都是他个人的基本信息,除此之外,他还可以进行多种活动,比如选课、考试、修改自己的部分信息等等。

那么我们从程序的角度出发,应该如何定义一个类呢?这取决于我们的需要,对于一个教学管理系统来说,我们关心的只是和学生学习相关的信息,学生能够选课、考试等等。对于一个后勤管理系统来说,我们关心的则是学生的饭卡消费情况,出入宿舍的时间,学生能够充值、消费、刷卡等等。所以如何定义和描述一个类,取决于我们的应用系统需要,或者是题目的要求。

1. 属性

属性指的就是所描述的类当前的状态,也就是他自己的一些信息,直接在类下进行定义,和正常声明一个变量的格式相同,可以不指定初始值。

2. 行为

行为指的就是当前这个类所创建出的对象都能进行什么样的行为,在程序上的表现就是方法,可以被具体的对象来进行调用,在方法体中用代码实现具体的功能。

// 用于描述学生的类
public class Student{
    // 学生类的属性
    String sno;// 学号
    String name;// 姓名
    String college;// 学院
    String major;// 专业
    ...
    // 学生类的行为
    public void study(){
        // 去学习
        System.out.println("去上课");
    }
    public void exam(){
        // 去考试
        System.out.println("去考试");
    }
}

3. 可执行类

在通常情况下,我们定义的一个类由四大部分构成:属性、行为、构造器以及其他继承Object的方法。也就是说都不存在可以直接执行的main方法,而只是为了定义一个我们想要使用的类,那么怎么样才能调用到,把我们的类用起来呢?就是通过那些具备main方法的类,如最初我们使用的HelloWorld,这就是一个最简形式的可执行类。

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello World!");
    }
}

当然,我们也可以直接在类中添加main方法来测试运行,但是一般不会这样做,因为会有一些权限的问题不能够测试完整,通常的办法是新建一个单独的测试类,来进行调用测试。

// 调用时需要将两个类放在同一目录下(同一包中)
public class Test{
    public static void main(String[] args){
        // 创建一个学生对象
        Student student = new Student();
        // 为对象的属性赋值
        student.sno = "1130050152";
        student.name = "小明";
        student.college = "数学科学学院";
        student.major = "信息与计算科学";
        // 显示对象的属性值
        System.out.println("该学生的名字是:" + student.name);
        // 通过对象调用方法,发生行为
        student.study();
        student.exam();
    }
}

三、对象

通过上面我们已经知道对象的概念,以及如何使用创建和使用一个对象。接下来我们再来明确一下类和对象,对象和对象之间的关系。

1. 对象是类的实例

创建对象的过程也可以被称之为实例化,对象也可以被叫做类的实例。这个概念也很好理解,在类中只是定义了一系列的描述信息,真正去执行需要靠具体的对象,以一个类为基准,可以创建出很多对象。

2. 对象和对象之间的关系

对象与对象之间存在共同点,除了使用静态声明的属性外,是不会互相影响的,这是一个很重要的特点。当我们使用不同的对象去调用方法和输出属性信息时,虽然类当中的结构完全一致,但是由于对象所处的状态(属性值)可能不同,那么方法执行的结果也会不同。

// 用于描述学生的类
public class Student{
    // 学生类的属性
    String sno;// 学号
    String name;// 姓名
    double balance;// 余额
    ...
    // 学生类的行为
    public void recharge(double money){
        // 对学生卡充值
        balance += money;
        System.out.println("当前余额为" + balance);
    }
    public void getBalance(){
        // 显示卡内余额
        System.out.println("当前余额为" + balance);
    }
}
// 测试类:将两个类放在同一目录下(同一包中)
public class Test{
    public static void main(String[] args){
        // 创建第一个学生对象
        Student student1 = new Student();
        // 为对象的属性赋值
        student1.balance = 23.70;
        // 调用方法
        student1.getBalance();
        student1.recharge(100.0);
        // 创建第二个学生对象
        Student student2 = new Student();
        // 为对象的属性赋值
        student2.balance = 15.60;
        // 调用方法
        student2.getBalance();
        student2.recharge(50.0);
    }
}

程序执行完毕后可以再次输出查看两个对象的属性值,不会互相影响。


目录
相关文章
|
5天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
|
25天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
22天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
43 17
|
14天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
18天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
67 4
|
29天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
19天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
40 2
|
23天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
27天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
27天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
下一篇
无影云桌面