javaSE学习-4-类和对象

1. 面向对象的初步认知

1.1 什么是面向对象

面向对象编程(OOP)是一种程序设计范式,它将程序中的数据和操作数据的方法封装到对象中。在面向对象的世界里,一切都被视为对象,这些对象可以拥有数据(成员变量)和行为(方法)。Java 是一门纯粹的面向对象编程语言,几乎所有的代码都是以类和对象的形式存在的。

1.2 面向对象与面向过程

在面向对象编程的思想中,解决问题主要依靠对象之间的交互完成一项任务。

相较之下,面向过程编程更侧重于一系列步骤或操作,通过过程调用来完成任务。

面向对象的优势在于更好地组织和抽象复杂系统,使代码更易扩展、维护和理解。

设计一个简单的图形计算程序,计算不同形状的面积。样设计:

面向过程:

double calculateCircleArea(double radius) {return 3.14 * radius * radius;
}double calculateRectangleArea(double length, double width) {return length * width;
}void main() {double circleArea = calculateCircleArea(5.0);double rectangleArea = calculateRectangleArea(4.0, 6.0);// 进行其他操作...
}
```

定义了两个函数分别用于计算圆和矩形的面积。

在 `main` 函数中调用这些函数来进行计算。

面向对象:


class Circle {double radius;Circle(double radius) {this.radius = radius;}double calculateArea() {return 3.14 * radius * radius;}
}class Rectangle {double length;double width;Rectangle(double length, double width) {this.length = length;this.width = width;}double calculateArea() {return length * width;}
}void main() {Circle circle = new Circle(5.0);Rectangle rectangle = new Rectangle(4.0, 6.0);double circleArea = circle.calculateArea();double rectangleArea = rectangle.calculateArea();// 进行其他操作...
}

定义了两个类 `Circle` 和 `Rectangle`,每个类都有自己的属性和方法。

通过创建对象,调用对象的方法来进行计算。这种方式更加面向对象,将数据和相关操作封装在对象内部。

面向对象的设计使得代码更易扩展和维护,特别是在处理复杂系统时表现出更大的优势。

2. 类定义和使用

向对象程序设计(Object-Oriented Programming,OOP)关注的是对象,而对象通常是现实生活中的实体或概念的抽象。在面向对象的思想中,问题的解决主要通过对现实世界中的事物进行建模,将其抽象为程序中的对象。

2.1 简单认识类

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干嘛)

2.2 类的定义格式

在 Java 中,定义一个类需要使用 class 关键字,具体的语法如下所示:

// 创建类
class ClassName {// 字段(属性)或者成员变量type fieldName;// 行为或者成员方法returnType methodName(parameters) {// 方法体}// 其他字段和方法...
}

2.3 定义一个狗类

class Dogg {int age;String color;String name;public void bark() {System.out.println(name+"汪汪汪");}public void wag() {System.out.println(name+"摇尾巴");}
}

通过对象的引用.访问属性进行赋值

实例化对象

public static void main(String[] args) {Dogg dog1 = new Dogg();dog1.age = 9;dog1.name = "小白";dog1.color = "黑色";System.out.println(dog1.name);dog1.bark();dog1.wag();}

只要new 就会产生 新的对象, 只要是新的对象, 就是有新的内存

Dogg dog2 = new Dogg();

只需要通过对象的引用 去访问对象的成员变量即可或者是成员方法

可以通过new关键字 实例化多个对象

同一个类可以创建多个实例

dog1, dog都属于引用类型(存储的是对象的地址)

这里在啰嗦一下java中的数据类型

分为两种

  1. 基本数据类型(共八种)
  2. 引用类型 String 数组 类 接口

这里我提出两个问题

其一是: 引用可以指向 引用吗?

dog1 = dog2;

dog2这个引用指向了 dog1?

类似于

int[] arr1 = {1,2,3};int[] arr2;arr2 = arr1;

类似于复制粘贴

因此这句话有语病错误 引用是不能指向对象的 引用只能指向对象

这两个引用同时指向的是一个对象

dog1dog2都指向相同的对象

这是因为引用存储的是对象的地址,所以它们都引用了相同的对象。

另一个问题是 一个引用可不可以指向多个对象?

不可以 一个引用只能指向一个对象

只能存储一个对象的地址

还有一个问题是以下代码能否代表dog2这个引用指向null对象?

Dogg dog2 = null;

dog2这个引用 不执行任何对象

3. 类的实例化


3.1 什么是实例化

实例化是将一个类作为模板,创建该类的具体对象的过程。通过实例化,我们可以在内存中分配空间,并初始化该对象的属性。实例化的结果就是我们所说的对象或实例。

3.2 类和对象的说明

  1. 类是一个模型: 类是对一个实体进行描述的模型,它定义了这个实体的属性(成员变量)和行为(方法)。类就像是一个蓝图或设计图,规定了实体应该有哪些特征和功能。

  2. 类是一种自定义类型: 类是用户自定义的数据类型,可以用来定义变量。通过类,我们可以创建属于该类型的对象。

  3. 多个对象的实例化: 一个类可以实例化出多个对象。每个对象都是该类的一个实例,拥有相同的属性和方法,但是它们是相互独立的。例如:

    // 定义一个Person类 
    public class Person { String name; int age; } 
    // 实例化两个Person对象 Person person1 = new Person(); 
    Person person2 = new Person();

    这里,person1和person2都是Person类的实例,但它们是两个独立的对象。

  4. 类和对象的比喻: 比方说,可以将类比为建筑设计图,它规定了房子应该有哪些特征和结构,但并不是实际的房子。只有当我们使用设计图实例化出具体的房子对象时,才会占用实际的物理空间,存储房子的具体信息。

class MyValue {int value;
}public class Main4 {public static void swap(MyValue v1, MyValue v2) {int tmp = v1.value;v1.value = v2.value;v2.value = tmp;}public static void main(String[] args) {MyValue value1 = new MyValue();MyValue value2 = new MyValue();value1.value = 10;value2.value = 20;swap(value1, value2);System.out.println(value1.value);System.out.println(value2.value);}
}

基本类型是无法完成交换的, 只有引用类型才能完成交换

 4. this引用

4.1 为什么要有this引用:

在Java中,this是一个关键字,表示当前对象的引用。它主要用于解决类成员变量与方法参数之间的命名冲突。形参名与成员变量名相同,这时可以使用this引用来明确指定操作的是成员变量而不是方法参数。

public class Date {public int year;public int month;public int date;public void setDate(int y, int m, int d){year = y;month = m;date = d;}public void printDate() {System.out.println(year+"年"+month+"月"+date+"日");}public static void main(String[] args) {Date date1 = new Date();date1.setDate(2021, 12,21);date1.printDate();}
}

这里代码正常执行输出结果

2021年12月21日Process finished with exit code 0

那我们把

public void setDate(int y, int m, int d){year = y;month = m;date = d;}

改为

public void setDate(int year, int month, int date){year = year;month = month;date = date;}

这时的输出

0年0月0日

因为这里的year month date都是局部变量, 形参名与成员变量名相同

这时可以使用this引用来明确指定操作的是成员变量

public void setDate(int year, int month, int date){this.year = year;this.month = month;this.date = date;}

改为以上代码就可以正常运行了

Date date1 = new Date();date1.setDate(2021, 12,21);date1.printDate();Date date2 = new Date();date2.setDate(1234,1,23);

那怎么区分this是哪个呢

局部变量优先使用 谁调用这个方法 谁就是this

this关键字主要用于引用当前对象的实例。

当存在局部变量与实例变量同名时,使用this关键字可以明确指定操作的是实例变量而不是局部变量。

 当调用 date1.setDate(2021, 12, 21); 时,this指向的是 date1 对象的实例。

而在 date2.setDate(1234, 1, 23); 中,this指向的是 date2 对象的实例。

this指的是调用它的方法所属的对象。

4.2 什么是this引用

  1. 区分实例变量和局部变量: 当方法的参数名和实例变量名相同时,使用this关键字可以明确指定操作的是实例变量。例如,在setDay方法中,this.year表示实例变量,而year表示方法的参数。

  2. 在构造函数中调用其他构造函数: 在一个类的构造函数中,可以使用this来调用同一类的其他构造函数。

    public class Example {private int x;private int y;// 构造函数1public Example(int x) {this.x = x;this.y = 0;}// 构造函数2,调用构造函数1public Example(int x, int y) {this(x);  // 调用构造函数1this.y = y;}
    }
    

  3. 作为返回当前对象的引用: 在方法中可以使用this作为返回当前对象的引用,以支持方法的链式调用。

public class Example {private int x;private int y;public Example setX(int x) {this.x = x;return this;}public Example setY(int y) {this.y = y;return this;}
}

4.3 this引用的特性:

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

  2. this只能在成员方法中使用: this关键字只能在类的成员方法中使用。它不能在静态方法(用static修饰的方法)中使用,因为静态方法与任何实例对象无关。

  3. this只能引用当前对象: 在成员方法中,this关键字只能引用当前对象,不能引用其他对象。它代表调用该成员方法的当前对象。

  4. this是“成员方法”第一个隐藏的参数: 在成员方法中,this被视为第一个隐藏的参数。编译器会自动传递this作为参数给成员方法。当成员方法被调用时,编译器会负责将调用成员方法的对象的引用传递给该成员方法,而this负责接收这个引用。

5. 对象的构造及初始化

5.1 如何初始化对象

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:

需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:

1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?

2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

5.2 构造方法

5.2.1 概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

public class Date {public int year;public int month;public int date;public Date() {year = 2023;month = 12;date = 20;}
public static void main(String[] args) {Date date1 = new Date();date1.printDate();
2023年12月20日

可以看到没有使用setDate会输出

注释掉Date构造方法呢

输出

0年0月0日

可见输出的是默认值 也就是0 0 0

这种初始化方法叫做默认初始化

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

5.2.2 特性

1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行

3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

构造方法名字与类名相同 没有返回值

通过调试代码可以发现 构造方法是在实例化对象的时候调用的

实例化对象的时候, 会调用一个合适的构造方法

public Date() {this.year = 2023;this.month = 12;this.date = 20;}public Date(int year, int month, int date){this.year = year;this.month = month;this.date = date;}

这两个构造方法之间构成了方法的重载(函数名一样)

一个不带参数 一个带三个参数

构造方法就是根据这些不同的参数 初始化不同的成员变量

因此 对象的产生 简单来说 一定会有两步

1. 为对象分配内存

2. 调用合适的构造方法

如果注释掉不带参数的构造方法

可以观察到编译器报错

因此 一旦类提供了任何一种构造方法 那么编译器就不会再提供任何不带参数的构造方法

5.3 默认初始化

构造方法至少有一个 当没有写任何的构造方法的时候,  编译器/java会自带一个不带参数的构造方法.

只不过默认的这个构造方法, 是没有具体的实现的.

对象的初始化是一定会调用构造方法的

5.4 就地初始化

在声明成员变量时,就直接给出了初始值。
public int year = 1900;
public int month = 1;
public int day = 1;

this方法

构造方法中,可以通过this调用其他构造方法来简化代码

public Date() {this(2002,12,12);}public Date(int year, int month, int date){this.year = year;this.month = month;this.date = date;}
Date date1 = new Date();

这里不带参数进行初始化

那么调用第一个不带参数的方法

之后调用this

this方法是根据自己的参数数量(三个)调用的指定的Date构造方法

需要注意的是 this都放在构造方法的第一行中, 不然会报错

删掉sout恢复正常

另一个就是不能循环调用

绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)

小技巧: 编译器生成构造方法

在类中, 鼠标右键选择generate

选择 constructer

勾选自己需要的参数, 点击ok即可生成

6. 封装

面向对象的几个重要的特征: 封装, 继承, 多态

6.1 封装的概念

封装是指将类的实现细节进行隐藏,对外只提供接口。简单来说,封装就是套壳屏蔽细节,将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口来与对象进行交互。

6.2 访问限定符

在Java中,主要通过类和访问权限来实现封装。类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知。而访问权限用来控制方法或字段能否直接在类外使用。Java提供了四种访问限定符:

  1. public(公共): 能被任何类访问,没有访问限制。
  2. protected(受保护): 对同一包内的类和所有子类可见,允许访问。
  3. default(默认): (默认的什么都不写的情况下) 如果没有指定任何访问修饰符,则默认为包内可见,不允许访问。
  4. private(私有): 只有在同一类内部可见,不允许访问。

实现封装后, 类外就无法直接拿到这个name

class Stu {public String name;public int age;public void eat() {System.out.println(this.name+"正在吃饭");}}public class Main1 {public static void main(String[] args) {Stu s1 = new Stu();s1.name = "徐涛";s1.eat();}}

这里定义了一个可以直接使用name和age属性的Student类

name属性实现封装后 类外就无法直接拿到这个name字段了

public String name;

修改为

private String name;

6.3 封装扩展之包

6.3.1 包的概念

在Java中,包是一种组织类的机制,用于将相关的类和接口组织在一起。包的概念有助于解决类名冲突、组织代码结构、提高代码的可维护性等问题。一个包可以包含多个类,而且包之间可以存在层次关系。

例如,`java.util` 是Java标准库中包含有关实用工具类的包。

6.3.2 导入包中的类

在Java中,要使用其他包中的类,可以使用 `import` 语句导入相应的包或类。导入包的目的是为了能够在代码中直接使用其他包中的类而不必每次都写完整的包路径。

例如,要使用 `java.util.Date` 类,可以这样导入:

import java.util.Date;

如果需要使用 `java.util` 中的其他类,可以使用通配符 `*`:

import java.util.*;

然而,为了避免命名冲突和提高代码的清晰度,最好还是显式地指定要导入的类名,而不是使用通配符。
 

import java.util.Date;
import java.util.List;

6.3.3 自定义包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据机器学习:从理论到实战,探索学习率的调整策略

大数据机器学习:从理论到实战,探索学习率的调整策略 全文目录 大数据机器学习:从理论到实战,探索学习率的调整策略一、引言二、学习率基础定义与解释学习率与梯度下降学习率对模型性能的影响 三、学习率调整策略常量学习率时间衰减…

《PySpark大数据分析实战》-16.云服务模式Databricks介绍运行案例

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

【大数据面试】Flink面试题附答案

目录 ✅Flink介绍、特点、应用场景 ✅Flink与Spark Streaming的区别 ✅Flink有哪些部署模式 ✅Flink架构 ✅怎么设置并行度? ✅什么是算子链? ✅什么是任务槽(Task Slots)? ✅任务槽和并行度的关系 ✅Flink作…

TOPCON拓普康SR-3AR亮度计

特征 ■ 分光测光方式下的高速度、高精度值测定。 ■ 无需使用辅助镜,也能实现细微面、低亮度领域的高精度测定。 ■ 电动切换测定角(2/1/0.2/0.1)。 ■ 高精度测定频闪光源(搭载同步测定功能、积分时间延期…

uint29传输格式

前言 不知道谁想出来的。 反正我是想不到。 我看网上也没人讲这个。 写篇博客帮一下素未谋面的网友。 uint29 本质上是网络传输的时候,借用至多4字节Bytes,表达29位的无符号整数。 读8位数字,判断小于128? 是的话,返回末7位…

App(Android)ICP备案号查询——————高仿微信

😄 个人主页:✨拉莫帅-CSDN博客✨🤔 博文:132篇🔥 原创:130篇,转载:2篇🔥 总阅读量:388923❤️ 粉丝量:112🍁 感谢点赞和关注 &#x…

大数据时代,如何基于机密虚拟化技术构建数据安全的“基石”

云布道师 2023 年 10 月 31 日-11 月 2 日,2023 云栖大会在中国杭州云栖小镇举行,阿里云弹性计算产品专家唐湘华、阿里云高级安全专家刘煜堃、蚂蚁集团高级技术专家肖俊贤三位嘉宾在【云服务器 & 计算服务】专场中共同带来题为《大数据时代&#xf…

3-高可用-隔离术

隔离是指将系统或资源分割开,系统隔离是为了在系统发生故障时,能限定传播范围和影响范围,即发生故障后不会出现滚雪球效应,从而保证只有出问题的服务不可用,其他服务还是可用的。 比较多的隔离手段有线程隔离、进程隔…

Java--包,访问修饰符,多态数组,==和equals,hashcode,toString

包 同一个包里面不能有重复的类,不同的包可以有相同的类,包和包之间互不干涉。一个包下面有很多的类。 包的命名规则: 只能包含数字,字母,下划线,小圆点,但不能用数字开头,不能是关…

2_js运算符与流程控制语句

1. 运算符的应用 1.1 算数运算符 浮点数的精度问题 浮点数值的最高精度是17位小数,不要直接判断两个浮点数是否相等。 var result 0.1 0.2; // 结果不是 0.3,而是:0.30000000000000004 console.log(0.07 * 100); // 结果不是 7&#…

C++学习笔记(十五)

继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。 这个时候我们就可以考虑利用继承的技术,减少重…

3 - Electron app BrowserWindow对象-关于窗口

优雅的打开应用~ 当加载缓慢,打开应用的一瞬间会出现白屏,以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

MongoDB的原子操作findAndReplace、findOneAndDelete和deleteMany

本文主要介绍MongoDB的原子操作findAndReplace、findOneAndDelete和deleteMany。 目录 MongoDB的原子操作一、findAndReplace二、findOneAndDelete三、deleteMany MongoDB的原子操作 MongoDB的原子操作指的是在单个操作中对数据库的数据进行读取和修改,并确保操作是…

selenium css定位

selenium-css定位 element_css driver.find_element(By.CSS_SELECTOR, css表达式)css定位说明 selenium中的css定位,实际是通过css选择器来定位到具体元素,css选择器来自于css语法 css定位优点 语法简洁对比其他定位方式,定位效率更快对…

高防服务器防御靠谱吗?

​  随着互联网的普及和信息技术的不断发展,网络安全问题日益突出。高防服务器作为一种专业的网络安全设备,在防御网络攻击方面扮演着越来越重要的角色。然而,高防服务器是否靠谱,是否能够有效地防御各种网络攻击,一…

CUMT--Java--JDBC编程

目录 一、JDBC简介 二、数据库访问 1、加载数据库驱动 2、建立数据连接 3、创建Statement对象 4、执行SQL语句 5、访问结果集 三、MetaData接口 1、DatabaseMetaData接口 2、ResultSetMetaData接口 四、事务 1、JDBC中的事务 2、保存点 3、批量更新 一、JDBC简…

【JAVA】重力反弹,反弹高次一次比一次低

本来是想实现泡泡屏保(javascript实现漂亮的气泡碰撞效果(Chrome浏览器下更佳) 下载-脚本之家)的,还未实现 import javax.swing.*; import java.awt.*; import java.util.LinkedList; import java.util.Random;class Bubble {public static Image image;public int…

轮滑加盟培训机构管理系统源码开发方案

一、项目背景与目标 (一)项目背景 随着轮滑运动的普及和市场需求的增加,轮滑加盟培训机构逐渐兴起。这些机构面临着学员管理、课程排班、教师管理等多方面的挑战。为了提高管理效率和服务质量,需要开发一套专门针对轮滑加盟培训…

FormData文件上传多文件上传

一、简介 ​ 通常情况下,前端在使用post请求提交数据的时候,请求都是采用application/json 或 application/x-www-form-urlencoded编码类型,分别是借助JSON字符串来传递参数或者keyvalue格式字符串(多参数通过&进行连接&#…

大数据分析22、23真题回忆

2022 学长描述 1. 一个很简单的据估计 2. 算一个决策树 3. Cypher图 4.Hadoop和Spark的区别 2023 真题回忆 1. 大数据分析的定义 说出大数据分析三个层次 2.大数据分析流程 预处理部分包含哪几个步骤 3.Spark核心部件和应用库有哪些 并简要说明功能 4. 主成分分析和因…