• 类与对象(初级)


    目录

    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岁,颜色为白色。

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

    1. public class demo {
    2. public static void main(String[] args) {
    3. Cat cat = new Cat();
    4. cat.speak();
    5. }
    6. }
    7. class Cat{
    8. String name ;
    9. int age ;
    10. String color;
    11. public void speak(){
    12. System.out.println("喵喵喵");
    13. }
    14. }

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

    2.2 类的定义格式

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

    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
    1. public class Date {
    2. public int year;
    3. public int month;
    4. public int day;
    5. // 无参构造方法
    6. public Date(){
    7. this.year = 1900;
    8. this.month = 1;
    9. this.day = 1;
    10. }
    11. // 带有三个参数的构造方法
    12. public Date(int year, int month, int day) {
    13. this.year = year;
    14. this.month = month;
    15. this.day = day;
    16. }
    17. }
    上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。
    6. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。一旦用户手动生成,将会覆盖默认构造器。
    7. 构造方法中,可以通过 this 调用其他构造方法来简化代码
    例如:
    1. public class Date {
    2. public int year;
    3. public int month;
    4. public int day;
    5. // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
    6. // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
    7. // 但是this(1900,1,1);必须是构造方法中第一条语句
    8. public Date(){
    9. //System.out.println(year); 注释取消掉,编译会失败
    10. this(1900, 1, 1);
    11. //this.year = 1900;
    12. //this.month = 1;
    13. //this.day = 1;
    14. }
    15. // 带有三个参数的构造方法
    16. public Date(int year, int month, int day) {
    17. this.year = year;
    18. this.month = month;
    19. this.day = day;
    20. }
    21. }

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

    4.2 默认初始化

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

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

    4.3 就地初始化

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

    1. public class Date {
    2. public int year = 1900;
    3. public int month = 1;
    4. public int day = 1;
    5. public Date(){
    6. }
    7. public Date(int year, int month, int day) {
    8. }
    9. public static void main(String[] args) {
    10. Date d1 = new Date(2021,6,9);
    11. Date d2 = new Date();
    12. }
    13. }

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

    5. this关键字

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

    我们来看这样一个代码:

    1. class Dog{
    2. private String name;
    3. private int age;
    4. private String color;
    5. public Dog(String name, int age, String color) {
    6. name = name;
    7. age = age;
    8. color = color;
    9. }
    10. }

    我们可以看见 它的提示,这个变量 '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范围privatedefaultprotectedpublic
    1同类可访问可访问可访问可访问
    2同包不可访问可访问可访问可访问
    3子类不可访问不可访问可访问可访问
    4不同包不可访问不可访问不可访问可访问

    介绍:

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

  • 相关阅读:
    辅助知识-第7 章 知识产权与标准规范
    痞子衡嵌入式:聊聊i.MXRT1xxx上第三级启动保障 - SDMMC manufacture模式
    基于springboot的共享汽车管理系统源码数据库
    猜谜游戏、彩云词典爬虫、SOCKS5代理的 Go(Golang) 小实践,附带全代码解释
    54.Python-web框架-Django-免费模板django-datta-able
    数据结构:八种常见数据结构
    【python】pytorch包(第四章)手写数字图像识别
    【剑指Offer】27.二叉树的镜像
    SELinux零知识学习十六、SELinux策略语言之类型强制(1)
    分布式与微服务概念
  • 原文地址:https://blog.csdn.net/weixin_67807492/article/details/127756835