Java基础教程(7)-Java中的面向对象和类

简介: 【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。

面向对象编程

Java是一种面向对象的编程语言。面向对象编程,英文是Object-Oriented Programming,简称OOP

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

面向过程编程是自顶而下的编程模式;把问题分解成一个一个步骤,每个步骤用函数实现,依次调用即可
面向对象编程是将事务高度抽象化的编程模式; 将问题分解成一个一个步骤,对每个步骤进行相应的抽象,形成对象,通过不同对象之
间的调用,组合解决问题。在进行面向对象进行编程的时候,要把属性、行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现;

类和对象

面向对象编程的一个实质性的要素是抽象。人们通过抽象处理复杂性;

类是Java的核心和本质。它是Java语言的基础,因为类定义了对象的本性;

类就是对象的模板(template),而对象就是类的一个实例(instance)。既然一个对象就是一个类的实例,所以object和instance可以互换使用;

class定义了如何创建实例,因此,class本身就是一种数据类型:而instance是根据class创建的实例,可以创建多个instance,每个instance类型相同,但各自属性可能不相同;

创建类

使用关键字class来创建类;

定义在类中的变量被称为实例变量,这是因为类中的每个实例(也就是类的每个对象)都包含它自己对这些变量的拷贝。这样,一个对象的数据是独立的且是惟一的;

定义在类中的方法和实例变量被称为类的成员;在大多数类中,实例变量被定义在该类中的方法操作和存取。这样,方法决定该类中的数据如何使用

public class Box {
   
   
    //定义一个类
    int width;

    int height;

    public int getSquar(){
   
   
        return  width*height
    }
}
声明对象

当创建一个类时,也就创建了一种新的数据类型。就可以使用这种
类型来声明该种类型的对象。

获得一个类的对象需要两步:

  • 第一步,先声明该类类型的一个变量,这个变量没有定义一个对象。实际上,它只是一个能够引用对象的简单变量。
  • 第二步,该声明要创建一个对象的实际的物理拷贝,并把对于该对象的引用赋给该变量。通过使用new运算符实现的。new运算符为对象动态分配(即在运行时分配)内存空间,并返回对它的一个引用。然后这个引用被存储在该变量中。
  • 在Java中,所有的类对象都必须动态分配。

Box box = new Box();

类是一个逻辑构造,对象有物理的真实性(也就是对象占用内存空间)

当你将一个对象引用赋值给另一个对象引用时,你并没有创建该对象的一个拷贝,而是仅仅对引用的一个拷贝。

public class Box {
   
   
    //定义一个类
    int width = 10;

    int height = 1;

    private int wh = 100;

    public int getSquar(){
   
   
        return  width*height;
    }

    public void setWh(int wh) {
   
   
        this.wh = wh;
    }

    public int getWh() {
   
   
        return wh;
    }
}

public class DemoOOP {
   
   

    public static void main(String[] args) {
   
   
        Box box = new Box();
        Box box1 = box;
        box.height = 10;
        System.out.println(box1.height);

        box.setWh(102);
        System.out.println(box1.getWh());
        box1 = null;
        System.out.println(box.width);
    }

}

输出如下:
在这里插入图片描述

方法

构造函数(方法)

类的后面跟的圆括号指定了类的构造函数。构造函数(constructor)在对象创建时初始化。它与它的类同名,它的语法与方法类似;

构造函数定义当创建一个类的对象时将发生什么。构造函数是所有类的重要组成部分,并有许多重要的属性。大多数类在他们自己的内部显式地定义构造函数。如果一个类没有显式的定义它自己的构造函数,那么Java将自动地提供一个默认的构造函数。

构造函数的任务就是初始化一个对象的内部状态,以便使创建的实例变量能够完全初始化,可以被对象马上使用。

一般方法

方法一般的形式:

type name(parameter-list) { 
// body of method 
}
  • type指定了方法返回的数据类型。这可以是任何合法有效的类型,包括你创建的类的类型。如果该方法不返回任何值,则它的返回值type必须为void 。
  • 方法名由name指定。方法名可以是任何合法的标识符。除了不能使用java的保留字;
  • parameter-list (变量列表)是一系列类型和标识符对,用逗号分开,也叫形参。接收方法被调用时传递给方法的参数值(实参)。变量列表可以为空。
  • 对于不返回void类型的方法,使用下面格式的return语句,方法返回值到它的调用程序,其中,value是返回的值。:

    return value;

方法的参数:

方法可以包含0个或任意个参数。方法参数用于接收传递给方法的量值。调用方法时,必须严格按照参数的定义一一传递。

参数还可以使用可变参数;可变参数用 类型… 定义,可变参数相当于数组类型;可变参数可以保证无法传入 null ,因为传入0个参数时,接收到的实际值是一个空数组而不是 null

  public int getWidth(int... w){
   
   
        return  0;
    }

在方法内部,可以使用一个隐含的变量 this ,它始终指向当前例。因此,通过 this.field 就可以访问当前实例的字段。如果没有命名冲突,可以省略 this 。但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上 this

相关文章
|
9天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
14天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
54 4
|
13天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
14天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
32 2
|
17天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
17天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
11天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
21天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
8天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
28 9
|
11天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####