【Java SE】类和对象(上)

简介: 从本期开始,欢迎各位正式开始面向对象编程,Java 一门纯面向对象编程的语言,在它的世界里,一切皆为对象,面向对象和面向过程其实都是一种解决问题的思路,而面向对象主要是各个对象之间互相交互去完成一件事情。

1、面向对象的初识

1.1 面向对象和面向过程的区别

从本期开始,欢迎各位正式开始面向对象编程,Java 一门纯面向对象编程的语言,在它的世界里,一切皆为对象,面向对象和面向过程其实都是一种解决问题的思路,而面向对象主要是各个对象之间互相交互去完成一件事情。

如果之前学习过C语言的小伙伴可能就知道,什么东西都需要自己造,要链表没有,要排序没有,要啥啥没有,而Java中你就不用担心这些,都给你准备好了,但是为了提高代码水平,后续我还是会带大家实现Java数据结构的。

如果说拿洗衣服这件事情来说:

面向过程的思路去解决的话可能就是,拿盆,放衣服,洗衣粉,接水,开始手搓,倒掉水,再接水,再次清洗,在倒掉水,接着拧干,洗衣服完毕。这就是面向过程。

面向对象的思路去解决的话可能就是,把衣服扔进洗衣机,倒入洗衣粉,按下开始按钮,至于洗衣机如何洗我们不必关心,只关心最后把衣服洗完了。这就是面向对象。

本质上他们只是解决问题的方法不同而已,我们不要存在偏见,各有各的应用场景!

2、类的定义和使用

2.1 什么是类?

就拿冰箱举例吧,一个冰箱,有外观,有品牌,有尺寸大小,还有它的功能,比如杀菌,保鲜,冷藏等等

可以简单理解成冰箱的属性是:外观,品牌,大小....,功能是:杀菌,保险,冷藏....

这些就可以理解成是一个类,类是用来对一个实体(对象)进行描述的,我们把上述对冰箱的描述可以称为对冰箱这个对象进行抽象,然后就可以采用Java来进行描述,当我们用类描述了一个对象,计算机就可以进行识别了,如何定义一个类呢?我们接着往下看:

2.2 类的定义

假设我们这里要定义一个学生类,我们需要先简单把这个对象给抽象出来,比如学生可以有:姓名,年龄,分数,课程(假设就一门),接着我们这个学生还有什么行为也可以抽象出来:比如说某某学生正在学习某某课程,或者某某学生正在睡觉,这些行为也可以抽象出来,然后就可以去定义一个类了:

public class Student {
    //成员变量【属性】
    public String name; //姓名
    public int age; //年龄
    public float score; //分数
    public String subject; //课程
    //成员方法【行为】
    public void studySubject() {
        System.out.println(name + "正在学习" + subject);
    }
}

class 为定义类的关键字,后面跟着的是类型名:Student(统一采用大驼峰),class前面的是修饰符,我们目前用public,后续会讲到的,{ } 为类的主题,像上面代码注释中写的,类包含类的成员,和成员方法,可以有参无参,有返回值无返回值,都行,但是,此处的成员方法目前我们统一不带 static 关键字,后续也会讲,目前只是先初步学习。

以上就是我们简单的定义了一个学生类,这里有几点要注意:

  • 我们建议一个文件中只定义一个类
  • 如果那个类中有 main 方法,一般使用 public 修饰(等学到修饰符就明白了)
  • public 修饰的类,类名必须跟文件名相同!
  • 如果要修改public修饰类的类名,请修改文件名,编译器会自动帮你更换

类的定义中,只允许存在以下:

成员变量,构造方法,代码块,成员方法,内部类

3、类的实例化

3.1 什么是实例化

到现在我们只是简单的认识了一下类和定义,那如何使用这个类呢?这就需要实例化,之前的学习中,我们定义一个变量 int a = 10;其实用的是 Java 中内置类型定义的,而当我们定义了一个类之后,就可以理解成是定义了一个新的类型,也就是自定义了一个类型。

实例化本质就是用类去创建一个对象的过程,被称为类的实例化,再 Java 中我们使用 new 关键字配合类名来实例化对象,之前数组也见到过,经常说 new 一个对象,没毛病,就是这个道理,同理 new 出来的对象都是在堆上开辟空间的!

3.2 使用类实例化对象:

如何使用它呢?就拿我们上面定义的一个学生类来举例:

public static void main(String[] args) {
        Student student = new Student();
        student.name = "张三";
        student.age = 20;
        student.score = 59.9f;
        student.subject = "Linux";
    }

简单理解这里我们通过一个 Student 类来定义一个 student 变量而这个变量的类型是引用类型,引用了一个对象,这个对象是由 Student类 实例化出来的,所以这个引用里存的就是 new 出来对象的地址,同时我们通过 . 来调用对象里面的变量或者方法

我们可以使用 java.lang.System 类的方法 identityHashCode() 可以返回对象的哈希码,在一定程度上反应真实的对象内存地址。

System.out.println(System.identityHashCode(student));

那么这里我们就简单来画个图,理解下在内存中的布局:

当然我们也可以通过引用 . 去调用这个对象里面的方法,方法是在被调用的时候建立栈帧,所以是在JVM栈上开辟空间的,那我们就来通过上面的 student 来调用下对象里面的方法吧:

这里我们只是创建了一个对象,当然一个类可以创建多个实例,也可以不用给每个成员变量都赋值,比如:

public static void main(String[] args) {
        Student student1 = new Student();
        student1.name = "张三";
        student1.subject = "Linux";
        Student student2 = new Student();
        student2.name = "李四";
        student2.subject = "Java";
        student1.studySubject();
        student2.studySubject();
    }

注意:

  • new 关键字用于创建一个对象的实例
  • 使用 . 可以来访问对象中的属性和方法
  • 同一个类可以创建多个实例
  • 每次 new 一个对象,都会新开辟空间

3.3 类和对象的简单说明

1. 类可以把它想象成一个模型,它是对一个实体的描述

2. 类是一种自定义的类型,可以用来定义变量

3. 一个类可以实例化出多个对象,实例化出的对象占实际的物理空间

相关文章
|
1天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
46 8
|
1月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
65 1
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
125 4
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
70 2
|
1月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
26 0
|
1天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
11 3
|
1天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
10 2
|
1天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。