【JavaSE】JavaSE之类和对象(上)

由于在JavaSE中类和对象是入门很重要的一部分,知识点比较多,所以此处我选择分上下两部分来详解类和对象,这样读者不会感到疲劳,我也能更好的为你们做出详解~以此来认知和彻底掌握它!

JavaSE类和对象上半部分详解

  • 一. 面向对象的初步认知
    • 1.1 什么是面向对象
    • 1.2 面向对象与面向过程
  • 二. 类定义和使用
    • 2.1 简单认识类
    • 2.2 类的定义格式
    • 2.3任意定义类深入了解
  • 三. 类的实例化
    • 3.1什么是实例化
    • 3.2 类和对象的说明
  • 四. this引用
    • 4.1 为什么要有this引用
    • 4.2 什么是this引用
    • 4.3 this引用的特性
  • 五. 对象的构造及初始化
    • 5.1 如何初始化对象
    • 5.2 构造方法
    • 5.3 默认初始化
    • 5.4 就地初始化

一. 面向对象的初步认知

1.1 什么是面向对象

面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP)
oop思想:面向对象的思想(继承,封装和多态等等)

1.2 面向对象与面向过程

面向对象:举例来说我们前面使用的库里面的方法,我们不需要知道它是如何实现的,它的底层原理我们可以忽略,直接使用重视方法的使用就可以了。如洗衣机洗衣服,我们不需要知道洗衣机原理就可以直接使用。
面向过程:在库里面的方法,它注重的是底层原理实现,更加深入细节。如手洗衣服,一步步过程我们都要知道然后实现。
面向过程和面相对象并不是一门语言,而是解决问题的方法,没有哪个好坏之分,都有其专门的应用场景。在面向对象里我们需要先找对象,再创建对象,以及使用对象。我们在创建对象时需要先定义一个类,这时候我们就可以在主函数里创建很多对象,下文将带你深入了解~

二. 类定义和使用

2.1 简单认识类

类是用来对一个实体(对象)来进行描述的,一个文件夹只能定义一个类,里面可以定义它的属性(身高,体重,年龄等等),这些属性又称作成员变量定义在类的里面,方法的外面。

2.2 类的定义格式

【JavaSE】JavaSE之类和对象(上)_第1张图片
class为定义类的关键字,Person为类的名字,{}中为类的主体
类中包含的内容称为类的成员:属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。
注意:

  1. 类名注意采用大驼峰定义
  2. 成员前写法统一为public,后面会详细解释
  3. 此处写的方法不带 static 关键字. 后面会详细解释

2.3任意定义类深入了解

2.3.1定义一个学生类
【JavaSE】JavaSE之类和对象(上)_第2张图片
注意:

  1. 一般一个文件当中只定义一个类
  2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  3. public修饰的类必须要和文件名相同
  4. 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改(先在文件名里去改,然后再把代码里的类名改掉)

三. 类的实例化

3.1什么是实例化

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
语法格式:
【JavaSE】JavaSE之类和对象(上)_第3张图片

接下来我们将讲到如何去使用类中的成员变量以及赋值,还有多个实例化对象的创建。

类的创建:
【JavaSE】JavaSE之类和对象(上)_第4张图片

主函数引用:
【JavaSE】JavaSE之类和对象(上)_第5张图片

结果的打印:
【JavaSE】JavaSE之类和对象(上)_第6张图片

如果我们创建了一个对象,没有对它进行初始化,直接打印出来属性的时候输出结果就会是他们对应类型的0值。(引用类型对应的是null,boolean对应的是false,char对应的是‘\u0000’(空格))。
注意:

  1. new 关键字用于创建一个对象的实例.
  2. 使用 . 来访问对象中的属性和方法.
  3. 同一个类可以创建多个实例.

3.2 类和对象的说明

  1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
  2. 类是一种自定义的类型,可以用来定义变量,但是在java中用类定义出来的变量我们称为对象.
  3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量,每一个在栈上创建的对象,都会在堆里开辟一块空间储存成员变量。
  4. 简单易懂来讲,类就是房屋设计图纸,实例化对象就是建造房子

知识总结:
1.如何定义一个类?
class Person{
public String name;
}
2.如何通过这个类,实例化对象?
Person person1 = new Person();
Person person2 = new Person();
3.怎么去访问实例化出来的对象的方法和属性?
通过对象的引用:person1.属性 或者 person1.方法
4.什么是实例化对象?
通过new关键字 实例化一个对象,就会给这个对象分配一个内存。

四. this引用

4.1 为什么要有this引用

举例:
【JavaSE】JavaSE之类和对象(上)_第7张图片
但是打印结果却是不是如我们所料
【JavaSE】JavaSE之类和对象(上)_第8张图片

我们可以发现值并没有赋上去,在第四步的时候,我们传参并没有改变属性的值,只是改变了方法里的形参的值。那么此处有两个问题值得我们注意:

  1. 形参名不小心与成员变量名相同
  2. setDate和printDate函数如何知道打印的是那个对象的数据呢?

4.2 什么是this引用

java编译器给每个“成员方法“增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问
正确的修改:
【JavaSE】JavaSE之类和对象(上)_第9张图片
关于this

  1. 代表当前对象的引用
  2. 可以区别,当参数和成员名字冲突的时候
  3. this本质来说,可以看作是一个隐式的参数(编译器自动添加,不需要我们显式给出),是第一个参数
  4. 在很多情景中,也可以不需要this,但是存在即合理,我们还是要习惯使用this

4.3 this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在"成员方法"中使用(不能在静态方法static中使用,后面会讲)
  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
  5. this.date–>访问成员变量 this.func()–>访问成员方法 this();–>调用构造方法

五. 对象的构造及初始化

5.1 如何初始化对象

上述代码中我们是先创建对象再进行赋值

  1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
  2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

在后文我们会慢慢详解~~

5.2 构造方法

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

5.2.2 特性

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
  5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

当我们实例化一个对象时:一定会有为对象分配内存然后调用合适的构造方法,并不意味着只有这两步。
当我们写了一份不带参数的构造方法的时候
在这里插入图片描述
我们主函数就直接调用了这个构造方法
【JavaSE】JavaSE之类和对象(上)_第10张图片
在程序当中 没有构造方法的时候 ,编译器会帮我们默认提供一个不带参数的构造方法,如果你写了构造方法,编译器就不会再帮你生成一个不带参数的构造方法。(名字相同,参数列表不同,构造方法就形成了重载)
我们写带参数的构造方法只需要在实例化对象的时候,在小括号里进行相应的赋值。
【JavaSE】JavaSE之类和对象(上)_第11张图片
在IDEA里面,对构造方法生成有快捷键,当参数过多时,我们就不容易写构造方法,如图带四个参数的构造方法,鼠标右键点击空行,点Generate
再点击Constructor,最后摁住Shift和鼠标左键点击你要生成的参数构造方法。
【JavaSE】JavaSE之类和对象(上)_第12张图片

  1. 构造方法中,可以通过this调用其他构造方法来简化代码
    【JavaSE】JavaSE之类和对象(上)_第13张图片
    【JavaSE】JavaSE之类和对象(上)_第14张图片
    注意他们的执行顺序,且注意:this必须放在第一行(在构造方法里使用)!!!this还不能形成环,环就是在带2个参数构造方法里调用带1个参数的构造方法,然后在带1个参数的构造方法里调用带2个参数的构造方法,形成了无线循环的环。
  2. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)

5.3 默认初始化

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
局部变量在不初始化的情况下,他们的默认值都是0值
在这个过程里,其中关键字new扮演着很重要的角色,它在JVM层面需要做好多事情,如:

  1. 检测对象对应的类是否加载了,如果没有加载则加载
  2. 为对象分配内存空间
  3. 处理并发安全问题
    比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
  4. 初始化所分配的空间即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,如:
    【JavaSE】JavaSE之类和对象(上)_第15张图片
  5. 设置对象头信息(关于对象内存模型后面会介绍)
  6. 调用构造方法<>,给对象中各个成员赋值

5.4 就地初始化

在声明成员变量时,就直接给出了初始值。
我们也可以创建对象继续赋值,这样就会改变原来就地初始化的值,如果不赋值的话打印出来就是就地初始化的值。
此处我们也可以知道,输出值的时候我们总是要在类里面建立一个show方法输出
在这里插入图片描述

当成员变量多了的时候我们手动打字输出就会异常繁琐,所以我们此处也介绍下在类里面IDEA的成员变量快捷输出键
鼠标右键点击空白处进入Generate,然后进入到toString()里面,按住Shift+鼠标点击完成你想打印输出的成员变量
【JavaSE】JavaSE之类和对象(上)_第16张图片
那么类和对象前半节就讲到这里了,是不是很简单呢,下篇文章将带你彻头彻尾了解类和对象的后半部分,打好基础一起冲向更高的山峰吧!!!

你可能感兴趣的:(JavaSE,java)