初识Java语言(四)- 类和对象

  • 2、方法

  • 3、static关键字

  • 三、自定义类

    • 1、从构造方法开始
  • 2、用var声明局部变量

  • 3、显式参数与隐式参数

  • 4、认识引用

往期文章:

前言- IDEA如何配置?让你敲代码更轻松!

初识Java语言(一)- 基本数据类型及运算符

初识Java语言(二)- 方法以及递归

初识Java语言(三)- 数组

一、类与对象的概念


1、类

  1. 类(class)是构造对象的模板或蓝图。

我们可以将类(class)想象成一个模具,将对象想象成一个由模具形成的物品。如下:

  1. 封装(encapsulation,有时称为数据隐藏)是处理对象的一个重要概念。

从形式上来看,封装就是将数据和行为(方法)组合在一个包中,并对对象的使用者隐藏了具体的实现方式。实现封装的关键在于,绝对不能让类中的方法直接访问其他类的实例字段(成员变量)。

  1. 通过扩展一个类来建立另外的一个类的过程称为继承。有关继承的细节问题,我们后面再将。记住 : 在java中,所有的类源自一个“超类”,也就是Object

2、对象

面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。对于一些规模较小的问题,将其分解为过程的开发方式比较理想(面向过程)。面向对象更加适合解决规模比较大的问题。

要想使用面向对象程序设计,一定要清楚对象的三个特性:

  • 对象的行为(behavior)----- 可以对对象完成哪些操作,或者是应用哪些方法?

  • 对象的状态(state)----- 当调用这些方法时,对象会如何响应?

  • 对象的标识(identity)----- 如何区分具有相同 行为与状态的不同对象?

3、面向过程与面向对象的区别

面向过程:

  1. 系统以过程方法为中心来组织

  2. 过程间相互发送数据

  3. 过程的执行动作与数据被明显的分离

  4. 关注的焦点在于数据结构、算法和执行步骤

  5. 过程通常难以被复用。

面向对象:

  1. 系统以对象为中心来组织

  2. 对象相互间发送消息

  3. 相关的属性和行为被统一到对象上

  4. 关注的焦点是对象及对象的职责

  5. 使得系统构建更容易,易维护,易扩展,易复用

  6. 解决问题的方式更接近人的

举个例子: 假设你现在需要洗一堆衣服

​ 面向过程: 拿盆 -> 加水 -> 放洗衣粉 -> 手洗 -> 再加水 -> 再洗一遍 -> …… -> 晾晒 -> 完成

​ 面向对象: 只需要三个对象: 人 、 衣服 、 洗衣机; 我们将衣服放入洗衣机,放入洗衣服,启动洗衣机即可。在这三个对象里分别写一些方 法: 比如洗衣机 :自动加水,换水等等。

image-20210806152749077

二、类的成员


1、字段

对象中的数据称为实例字段(成员变量)。 作为一个类的实例,特定对象都有一组特定的实例字段值,这些值的集合就是这个对象当前状态。无论何时,调用对象上的方法(函数),都有可能改变它的状态。

//单链表结点

class Node {

public int val; //字段或者 成员变量

public Node next;

}

有时候,我们需要设置成员变量的初始值,也可以这样完成操作。(显式设定初始值)

class Node {

public int val = 10;

public Node next = null;

}

2、方法

就是我上一篇文章讲过的方法,是一样的。用于描述对象的行为。Java中方法的概念以及递归的讨论

class Node {

public int val; //字段

public Node next;

//方法

public void show() {

System.out.println(this.val);

}

}

public class Main {

public static void main(String[] args) {

Node node = new Node(10);

node.show(); //调用类中的方法

}

}

3、static关键字

  1. 修饰属性

  2. 修饰方法

  3. 修饰代码块

  4. 修饰类(在后面的文章会具体讲解)

修饰属性: Java静态属性和类相关,和具体的实例无关。换句话说,同一个类的不同实例共用同一个静态属性。

class Test {

public int val;

public static int count;

}

public class Main {

public static void main(String[] args) {

Test demo1 = new Test();

demo1.count = 10; //为count进行初始化

System.out.println("调用demo1时 " + demo1.count);

demo1.count++;

System.out.println(“============”);

Test demo2 = new Test();

System.out.println("调用demo2时 " + demo2.count);

}

}

运行结果:image-20210806155522419

是不是感到很疑惑? 我们来画一画这个内存图,就能理解其中的奥妙了!!!

image-20210806160604235

上诉代码内存图:

image-20210806161626879

由图可知,我们虽然创建了两个实例化对象(demo1和demo2),但是因为类中的实例字段(count)被static修饰,所以它是在方法区开辟内存空间,且接下来由这个类所实例化的所有对象里面的count,都是指向方法区count所开辟的一块空间。(说白了,就是count的空间被所有对象所共享,一个对象将count改了,其他对象输出的count也是被改了的)

修饰方法: 如果在任何方法上应用static关键字,则这个方法称为静态方法。

  • 静态方法属于类,而不属于对象。

  • 可以直接调用静态方法,而无需创建类的实例。

  • 静态方法可以直接访问静态数据成员,并可以修改静态数据成员的值。

class TestDemo {

public int val;

public static int count;

public static void change() {

//val = 100; //error,静态方法不能访问非静态成员。原因看上面的三点

count = 100;

}

}

public class Main {

public static void main(String[] args) {

TestDemo.change;

System.out.println(TestDemo.count);

}

}

因为change方法是静态的,所以不需要进行实例化,就可以直接通过类名进行调用。

注意事项1: 静态方法和实例无关,而是和类相关。因此这导致了两个情况:

  1. 静态方法不能直接使用非静态数据成员或调用非静态方法。(因为非静态数据成员和方法都是和实例相关的)。
  1. thissuper两个关键字不能在静态上下文中使用。(this是当前实例的引用,super是当前实例父类实例的引用,也是和当前实例相关的)
  1. static不允许修饰局部变量。局部变量不是类中的变量,而是方法中的。

注意事项2:

  1. 实际上一个方法具体要不要带static关键字,都是需要看情况的。
  1. main方法是被static修饰的!!!

修饰代码块:

java中初始化实例字段的方法有三种:

  • 在构造方法中设置值

  • 在声明中赋值

  • 用初始化块设置值

四种代码块:

**1. 本地代码块(定义在方法里面的)

2. 实例代码块(构造代码块)

3. 静态代码块

4. 同步代码块**

在一个类的声明中,可以包含任意多个代码块。只要构造这个类的对象,这些代码块就会执行。也就是是初始化块里的数据,是为了构造对象时,做一些准备工作。例如:

image-20210806180805748

初始化块,放在前面或者后面,都没关系。因为实例化时,首先会将这些初始化块,从上至下的执行一次。然后才是执行构造方法的的语句。

如果类的静态字段需要很复杂的初始化代码,那么就可以使用静态的初始化块。将代码放在一个块中,并标记关键字static

image-20210806200153126

image-20210806203516469

看图,上面的代码。先是执行的静态代码块->实例代码块->构造方法 ,且静态代码块只会在第一次使用这个类的时候初始化这一次,看下图:

image-20210806204332620

代码块与实例字段初始化的顺序:

image-20210806205259803

总结: 在类第一次加载的时候,将会进行静态字段的初始化。与实例字段一样,除非将静态字段显式地设置成其他值,否则默认的初始值是0、false或者null。所有的静态字段初始化方法以及静态初始化块都将依照类声明中出现的顺序执行。

三、自定义类


1、从构造方法开始

image-20210806165003321

在上(类的成员)文中,我们提到了类中实例字段的初始化,说到了显式初始化字段值。除了这样初始化,Java还提供了一个叫构造方法的功能。专门用于实例化对象时用。上图所示,就是一些构造方法。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-1ADSaNQx-1713540477546)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值