类与对象(初级)

2023-11-03

目录

1. 面向对象的初步认知

1.1 什么是面向对象(官方解释)

1.2 面向对象与面向过程的对比

2.  类

2.1 简单认识类

2.2 类的定义格式

 3. 类的实例化

3.1 什么是实例化

3.2 类和对象的说明

 4. 构造方法(构造器)

4.1 特性

4.2 默认初始化

4.3 就地初始化

5. this关键字

5.1 this引用

5.2 this引用的特性

6. 访问限定符


引出: 我们至今为止Java都是用单独定义的变量和数组来解决问题,那是由于我们的目的简单,要求少。但是如果一旦我们这个要求变高,虽然仍可以解决问题,但是这样不利于数据的管理并且效率很低。

1. 面向对象的初步认知

1.1 什么是面向对象(官方解释)

Java 是一门纯面向对象的语言 (Object Oriented Program ,简称 OOP) ,在面向对象的世界里,一切皆为对象。 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情 。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

1.2 面向对象与面向过程的对比

我们之前学的C语言叫做面向过程的程序编程,而我们学的这一门Java叫做面向过程。举个例子就懂了。
问:把大象关进冰箱需要几步?
C语言: 怎么怎么把大象  “剁碎”  再怎么怎么塞进去 .........

Java :  第一步:打开冰箱;第二步:把大象塞进冰箱;第三步:关上冰箱。

具体怎么赛Java不管。具体的实现细节不对外。

对比起来好像时Java更胜一筹。

2.  类

2.1 简单认识类

类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干 啥) ,描述完成后计算机就可以识别了。

例题:

我们假设我们有一只猫,这个类型叫做cat类,那么我们这只猫有那些属性呢?

我们假设它的名字叫做marry,年龄为2岁,颜色为白色。

那么它肯定还有一些行为对吧,比如跑,跳,叫,这些都是它的行为。

public class demo {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.speak();
    }
}
class Cat{
    String name ;
    int age ;
    String color;
    public void speak(){
        System.out.println("喵喵喵");
    }
}

我们的类的位置可以任意写,不需要位于main方法之后,当然这里讲的是同一个包中(包在后面就会讲到)。那是因为我们Java的加载不同于C语言,不必在运行时一行行的加载(这也不用过多纠结以后讲)。

2.2 类的定义格式

class ClassName{
    field; // 字段(属性) 或者 成员变量
    method; // 行为 或者 成员方法
}

public是访问修饰符,暂时不介绍,class是关键字用于创建一个类,这个猫就是一个类,数据类型就叫做Cat。我们先前提过基本数据类型和引用数据类型对吧,我们说了除了那 8 个基本数据类型全都是引用数据类型。基本数据类型保存在栈区上,引用数据类型保存在堆区上。

图示:

cat是实例化对象,注意这里写的不是Cat,Cat是个数据类型。

 3. 类的实例化

3.1 什么是实例化

定义了一个类,就相当于在计算机中定义了一种新的类型 ,与 int double 类似,只不过 int double java 语言自 带的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog 类和 Student 类。它们都是类 ( 一种新定 义的类型) 有了这些自定义的类型之后,就可以使用这些类来定义实例 ( 或者称为对象 )
用类类型创建对象的过程,称为类的实例化 ,在 java 中采用 new 关键字,配合类名来实例化对象。
就拿上面的Cat来解释,很多猫具有Cat类型的属性和方法,很多猫都可以有名字,有年龄,有颜色,也都会 喵喵喵 得叫,我们无法确定我们找的猫是哪一只,无法分辨,所以需要实例化对象来找一只属于我们的猫。
注意事项
new 关键字用于创建一个对象的实例 .
使用 . 来访问对象中的属性和方法 .
同一个类可以创建对个实例 .

3.2 类和对象的说明

1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .
2. 类是一种自定义的类型 ,可以用来定义变量 .
3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

 4. 构造方法(构造器)

构造方法 ( 也称为构造器 ) 是一个特殊的成员方法, 名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次
是类得一种特殊方法,其主要作用就是完成对新对象的初始化。
基本语法:
【修饰符】 方法名(形参列表){方法体}

注意:这里的方法名必须是类名。

4.1 特性

1. 名字必须与类名相同
2. 没有返回值类型,设置为 void 也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
4. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )
5. 修饰符可以为 默认,protected,public,private
public class Date {
    public int year;
    public int month;
    public int day;
    // 无参构造方法
    public Date(){
        this.year = 1900;
        this.month = 1;
        this.day = 1;
    } 
 // 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。
6. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。一旦用户手动生成,将会覆盖默认构造器。
7. 构造方法中,可以通过 this 调用其他构造方法来简化代码
例如:
public class Date {
    public int year;
    public int month;
    public int day;
// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
    public Date(){
//System.out.println(year); 注释取消掉,编译会失败
        this(1900, 1, 1);
//this.year = 1900;
//this.month = 1;
//this.day = 1;
    }
    // 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}

如果使用这种方法构造,this()必须在构造器的第一行。

4.2 默认初始化

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
public class Date {
    public int year;
    public int month;
    public int day;
    public Date(int year, int month, int day) {
// 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }
    public static void main(String[] args) {
// 此处a没有初始化,编译时报错:
// Error:(24, 28) java: 可能尚未初始化变量a
// int a;
// System.out.println(a);
        Date d = new Date(2021,6,9);
    }
}
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
Date d = new Date ( 2021 , 6 , 9 );
在程序层面只是简单的一条语句,在 JVM 层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象, JVM 要保证给对象分配的空间不冲突
4. 初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型 默认值
byte 0
char '\u0000'
short 0
int 0
long 0L
boolean false
float 0.0f
double 0.0
reference null

5. 设置对象头信息(关于对象内存模型后面会介绍)
6. 调用构造方法,给对象中各个成员赋值
这部分主要用于了解,以后还会细讲。

4.3 就地初始化

在声明成员变量时,就直接给出了初始值。
 

public class Date {
    public int year = 1900;
    public int month = 1;
    public int day = 1;
    public Date(){
    }
    public Date(int year, int month, int day) {
    }
    public static void main(String[] args) {
        Date d1 = new Date(2021,6,9);
        Date d2 = new Date();
    }
}

注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

5. this关键字

我们在前面的构造器中用到this这个关键字,那么这个关键字究竟是干什么的呢?

我们来看这样一个代码:

class Dog{
    private String name;
    private int age;
    private String color;

    public Dog(String name, int age, String color) {
        name = name;
        age = age;
        color = color;
    }
}

我们可以看见 它的提示,这个变量 'name' 指向了它自己,编译器自己都不知道要指向哪里去了。

这里有一个成员变量叫做 'name' 还有一个传参的变量 'nam ' 所以要解决怎么个问题,我们就可以用到 this 关键字。我们把代码改一改:

这样我们的代码没有任何的警告提示信息了。

那么到底什么是this引用?

5.1 this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
就拿上面的例子:this引用的是调用成员方法的对象。

画图说明:

 

每一个对象完成以后都会隐藏一个this指向自己。

5.2 this引用的特性

1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
例如:

6. 访问限定符

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

No 范围 private default protected public
1 同类 可访问 可访问 可访问 可访问
2 同包 不可访问 可访问 可访问 可访问
3 子类 不可访问 不可访问 可访问 可访问
4 不同包 不可访问 不可访问 不可访问 可访问

介绍:

public:可以理解为一个人的外貌特征,谁都可以看得到
default: 对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了
private:只有自己知道,其他人都不知道
【说明】
protected主要是用在继承中,继承部分详细介绍
default权限指:什么都不写时的默认权限
访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类与对象(初级) 的相关文章

随机推荐

  • web前端字体居中_css文字居中怎么弄?

    CSS是一种定义样式结构如字体 颜色 位置等的语言 被用于描述网页上的信息格式化和现实的方式 下面我们来看一下css设置文字居中的方法 css可以通过为文字所在标签添加text align center样式使文字居中 text align属
  • git冲突在eclipse、idea、sourceTree上的解决方法

    一 使用eclipse时 情形一 用户1编辑A文件并提交 用户2未拉取最近代码也编辑A文件产生的冲突 用户2未提交本地仓库时 1 进入同步页面 注意 只有一个向下箭头表示未提交本地仓库 2 拉取远程文件 双击冲突文件减去编辑 将右侧代码合并
  • IT实习技能提升第一篇

    文章目录 前言 一 Git 1 基础配置 2 老板让去git上拉取代码 3 更改完代码后上推 二 QT使用步骤 1 注册QT账号挺有必要 2 同时运行两个项目 总结 前言 新入职的码农 嵌入式软件方向 提示 以下是本篇文章正文内容 下面案例
  • IOS小白入门指南

    加入ios 项目已经一个多月了 本篇文章主要介绍IOS开发入门的一些基础知识 帮助想学习iOS开发的人更有效率地学习 目录 需要的计算机基础 开发语言选择 IOS两种开发语言的异同 Objective C和swift的相同点 二者的不同点
  • 关于webview加载网页,返回后总是刷新页面问题解决

    最近用webview发现返回上个页面总是又自动刷新页面 我的需求是进入下页的时候不用缓存 而返回上个页面的时候不要刷新页面回到顶部 要保持在原来页面进入下页的位置 首先来了解一下webview加载网页的几个模式 即websetting中设置
  • 【AI视野·今日CV 计算机视觉论文速览 第211期】Wed, 2 Jun 2021

    AI视野 今日CS CV 计算机视觉论文速览 Wed 2 Jun 2021 Totally 63 papers 上期速览 更多精彩请移步主页 Interesting YOLOS You Only Look at One Sequence 纯
  • 冲击python二级——python的安装,IDLE的一般操作,PIP包管理使用,变量基础

    现在大部分的教程 都会要求直接安装Anaconda 和Pycharm 虽然pycharm是非常优秀的python IDE生产工具 但是对于新手来说配置比较繁琐 并不友好 而且国考计算机二级 只能用python自带的idle 用pip包管理安
  • 大数据——基于Spark Streaming的流数据处理和分析

    基于Spark Streaming的流数据处理和分析 流是什么 为什么需要流处理 流处理应用场景 如何进行流处理 Spark Streaming简介 Spark Streaming流数据处理架构 Spark Streaming内部工作流程
  • 实验室项目——连接mysql服务器报错(驱动版本不一致)

    mysql right syntax to use near OPTION SQL SELECT LIMIT 15 at line 1 问题描述 OPTION SQL SELECT LIMIT XXX 问题原因 项目使用的mysql驱动和m
  • 集线器、交换机和路由器(图解)

    一 物理层 使用 MAC 解决设备的身份证问题 1 通信的原始时代 很久很久之前 你不与任何其他电脑相连接 孤苦伶仃 直到有一天 你希望与另一台电脑 B 建立通信 于是你们各开了一个网口 用一根网线连接了起来 用一根网线连接起来怎么就能 通
  • UEFI/Legacy bios简介与grub安装教程

    目录 一 BIOS简介 二 UEFI与Legacy 启动模式简介 Legacy启动模式 UEFI启动模式 具体不同 三 grub安装 grub软件包的安装 grub源码下载 grub本地编译安装及使用 Ubuntu 环境下 四 参考 一 B
  • 华为机试-8.计算面积(绘图机器的绘图笔初始位置在原点)

    计算面积 绘图机器的绘图笔初始位i在原点 0 0 机器启动后其绘图笔按下面规则绘制直线 1 尝试沿着横向坐标轴正向绘制直线 直到给定的终点值E 2 期间可通过指令在纵坐标轴方向进行偏移 井同时恰制直线 偏移后按规则1绘制直线 指令的格式为X
  • chatgpt赋能python:Python输出中出现的None值:问题、解释和解决方案

    Python输出中出现的None值 问题 解释和解决方案 在Python编程中 经常会出现输出中包含None值的情况 这会给程序员带来一些困扰 因为它可能会在应用程序中导致错误或不正确的结果 在本篇文章中 我们将探寻这个问题的原因 介绍有关
  • Cascade EF-GAN: 局部聚焦渐进式面部表情编辑

    目前面部表情编辑存在的问题 生成性对抗网络 GAN 的最新进展表明 面部表情编辑有了显著的改进 然而 当前的方法仍然容易在表达密集型区域周围产生伪影和模糊 并且在处理大间隙表达转换 例如从愤怒到大笑的转换 时 经常引入不希望的重叠伪影 本文
  • Java中为什么只有值传递?

    开始之前 我们先来搞懂下面这两个概念 形参 实参 值传递 引用传递 形参 实参 方法的定义可能会用到 参数 有参的方法 参数在程序语言中分为 实参 实际参数 用于传递给函数 方法的参数 必须有确定的值 形参 形式参数 用于定义函数 方法 接
  • 面向对象三大基本特征及五大基本原则介绍

    目录 前言 一 面向过程和面向对象区别 二 面向对象的三大基本特征 封装 继承 多态 1 封装 2 继承 3 多态 三 面向对象的五大基本原则 1 单一职责原则 SRP 2 开放封闭原则 OCP 3 里氏替换原则 LSP 4 依赖倒置原则
  • python 如何将代码中的输入保存到txt里边

    一 在 print 前建立一个txt python3 f open print txt w print this is a txt file f f close python2 f open print txt w print gt gt
  • 摄影基础之---景深

    正在上传 重新上传取消 1 概述 先看两个例子 拍摄花 昆虫等照片时 背景拍的比较模糊 突出被拍物 但当拍摄纪念照 风景等照片时 却会把背景拍摄得和被拍对象一样清晰 这两者就是不同景深 前者为浅景深 拍摄聚焦到被拍物上 只能拍清一小段距离
  • 什么是MMU,MMU的作用

    I 什么是MMU MMU的作用 MMU是Memory Management Unit的缩写 针对各种CPU MMU是个可选的配件 MMU负责的是虚拟地址 O1663 O1664 物理地址的转换 提供硬件机制的内存访问授权 现 代的多用户多进
  • 类与对象(初级)

    目录 1 面向对象的初步认知 1 1 什么是面向对象 官方解释 1 2 面向对象与面向过程的对比 2 类 2 1 简单认识类 2 2 类的定义格式 3 类的实例化 3 1 什么是实例化 3 2 类和对象的说明 4 构造方法 构造器 4 1