用王者荣耀告诉你,什么叫类与对象,思维图+核心+架构让你一步到位

简介: 用王者荣耀告诉你,什么叫类与对象,思维图+核心+架构让你一步到位


优点:代码可复用、容易维护和开发、可扩展性强(比如洗衣服不想用洗衣液了可以换成洗衣粉),所以更适合大型项目。

缺点:比面向过程的性能低

总结:

  • 面向过程:强调过程。
  • 面向对象:强调对象、分工和协作。

2. 类与对象


类:类是一个抽象的概念,在现实世界中不存在。

类本质上是在现实世界中具有共同特征的事物,通过提取这些共同特征形成的概念叫做“类”,比如人类、动物类、汽车类、鸟类等。

类其实就是一个模板,类中描述的是所有对象的“共同特征”。

对象:对象是一个具体的概念,在现实世界中真实存在的。比如李白、爱迪生、贝克汉姆都是对象,他们都属于人类。对象就是通过类创建出的真实的个体。

2.1 抽象

将具有相同特征的对象抽取共同特征的过程叫做“抽象”。


2.2 实例化

对象还有一个别名叫做“实例”,通过类创建对象的过程叫做“实例化”。


3. 类的定义


我们都知道类具有相同的特征,特征包含静态的和动态的。

鸟类的静态特征是长着一双翅膀,动态特征是会飞。狗类的静态特征是嗅觉灵敏,动态特征是会“汪汪”叫…

所以,类 = 属性 +方法

3.1 java 定义类的语法格式

[修饰符] class 类名 {
属性 + 方法
}

注:这里修饰符可以省略,后面会讲解。

复制代码

案例一:用 java 代码创建人类

public class Person {
// 姓名
private String name;
// 年龄
private int age;
// 性别 0-女 1-男
private int sex;
// 身份证
private String idCard;
// 吃饭方法
public void eat(){
System.out.printf(“人要吃饭”);
}
}

复制代码

在上面的例子中,属性以“变量”的形式存在。为什么呢?

因为属性是静态特征,属性包含的是数据,比如年龄18岁,性别男,身高180。所以在 java 程序中有关属性的数据只能存在于变量中。

案例二:用 java 代码创建动物类

public class Animal {
// 体重
private int weight;
public void sleep(){
System.out.println(“动物要睡觉”);
}
}

复制代码

注:在 java 中凡是用 class 定义的类型都是引用类型,他的类型就是类名本身。

3.2 实例变量

实例变量:把对象共同的静态特征抽取出来存放在类中的变量里面,比如人类中的年龄、性别、身高等。

上面类中的变量就是实例变量,因为对象又叫做实例,所以实例变量就是对象级别的变量。

4. 对象的创建和使用


4.1 创建对象

我们学会定义类之后,该如何创建对象呢?

很简单,new 一下。

语法格式:

类名 变量名 = new 类名();

复制代码

我们 new 出来的对象也需要用一个变量来接收,例如:

Student student = new Student();
People people = new People();
Animal animal = new Animal();

复制代码

4.2 使用对象

创建对象之后,我们怎样使用对象?怎样获取对象的属性?怎样访问对象的方法?

对象.属性 对象.方法

public class Person {
// 姓名
private String name;
// 年龄
private int age;
// 性别 0-女 1-男
private int sex;
// 身份证
private String idCard;
// 吃饭方法
public void eat(){
System.out.printf(“人要吃饭”);
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println(“1号人类姓名:”+person1.name);
System.out.println(“1号人类年龄:”+person1.age);
System.out.println(“1号人类身份证:”+person1.idCard);
person1.eat();
System.out.println(“-----------------------”);
Person person2 = new Person();
System.out.println(“2号人类姓名:”+person2.name);
System.out.println(“2号人类年龄:”+person2.age);
System.out.println(“2号人类身份证:”+person2.idCard);
person2.eat();
}
}

复制代码

运行结果:

我们都知道一个类可以创建很多对象,但是上面人类创建的对象的年龄为什么是0?身份证为什么是null?

这是因为在 java 中,我们在创建对象的时候如果没有给变量手动赋值,系统会对实例变量默认赋值。默认值如下所示:

| 数据类型 | 默认值 |

| — | — |

| byte | 0 |

| short | 0 |

| int | 0 |

| long | 0L |

| float | 0.0f |

| double | 0.0 |

| 引用类型 | null |

5. 画个内存图


为什么要学习 JVM 内存图?

因为 JVM 内存图可以加深你对 Java 运行机制的理解。

Java 虚拟机在运行 java 程序时,会将自己管理的内存划分为几个区域,每个区域都有自己的用途,他们的创建时间和销毁时间也不一样。

JVM 内存很复杂,这里我们主要关注三个区域:栈、堆、方法区。

栈:主要存放方法信息,比如 main 方法。

堆:主要存放对象实例,你可以想象成这里“堆满了对象”。

方法区:这里主要用来存储类的信息、静态变量、常量以及编译器编译后的代码。


前面的例子中,我们创建了两个 Person 类的对象 person1 和 person2。

person1 和 person2 实际上存储的是堆中对象的内存地址:ox00001 和 ox00002,所以他们分别指向了堆中的两个对象。

所以当我们访问对象的实例变量时,先根据对象变量存储的内存地址找到该对象,再获取该对象的实例变量存储的数据。

6. 空指针异常


有时候我们会遇到空指针异常,例如

public class Student {
// 姓名
private String name;
public static void main(String[] args) {
Student student = null;
System.out.println(“学生姓名:”+student.name);
}
}

复制代码

运行结果:

为什么会有空指针异常?通过下面的内存图就能明白:


你新建了空的对象变量 student,它里面没有存任何对象的内存地址。所以当你去访问它的实例变量时,它找不到堆中的对象,就会抛出空指针异常。

7. 构造方法


构造方法是啥?通过“构造”的字面意思隐隐约约感觉它是造东西用的。可是造啥呢?

对,造对象用的。

当你 new 对象的时候是通过调用构造方法来完成对象的创建,以及对象属性的初始化操作。

也就是说在创建对象之前会先调用构造方法。

注:

  1. 当类中没有提供任何构造方法,系统默认提供一个无参数的构造方法。
  2. 当类中手动的提供了构造方法,那么系统将不再默认提供无参数构造方法。

7.1 定义构造方法

语法格式:

[修饰符列表] 构造方法名(形式参数列表){
方法体;
}

复制代码

注:

  1. 构造方法名和类名一致
  2. 构造方法没有返回值
  3. 一个类中可以定义多个构造方法,这些构造方法其实是方法的重载

例如:

public class Student {
// 姓名
private String name = “一颗雷布斯”;
public Student() {
System.out.println(“我是一个没有参数的构造方法”);
}
public static void main(String[] args) {
Student student = new Student();
}
}

复制代码

运行结果:

7.2 定义多个构造方法

public class Student {
// 姓名
private String name;
public Student() {
System.out.println(“我是构造方法1”);
}
public Student(String name) {
System.out.println(“我是构造方法2”);
}
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student(“一颗雷布斯”);
}
}


相关文章
|
7月前
|
Java
javaEE架构必须懂的知识Base类
javaEE架构必须懂的知识Base类
30 0
|
7月前
|
存储 Kubernetes 负载均衡
Kubernetes的“厨房”:架构是菜谱,组件是厨具,资源对象是食材(下)
本文深入探讨了Kubernetes(K8s)的架构、核心组件以及资源对象。Kubernetes作为一个开源的容器编排系统,通过其独特的架构设计和丰富的组件,实现了对容器化应用程序的高效管理和扩展。通过本文的介绍,读者可以深入了解Kubernetes的架构、核心组件以及资源对象,从而更好地应用和管理容器化应用程序。Kubernetes的灵活性和可扩展性使得它成为容器编排领域的领先者,为企业提供了强大的容器运行环境。
|
23天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
32 0
|
2月前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
22 2
|
3月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
190 3
|
4月前
|
设计模式 算法 PHP
深入理解PHP中的数组操作探索编程之美:从代码到架构的思维转变
【8月更文挑战第24天】在PHP编程中,数组是基础且强大的数据结构。本文将通过浅显易懂的方式,介绍如何在PHP中高效地操作数组,包括创建、遍历、排序和过滤等常见任务。无论你是初学者还是有经验的开发者,这篇文章都会带给你新的启示。 【8月更文挑战第24天】在编程的世界中,代码不仅仅是冰冷的字符排列,它承载着思想、解决问题的智慧和创新的灵魂。本文将通过个人的技术感悟,带领读者从编写单一功能的代码片段出发,逐步深入到整个软件架构的设计哲学,探索如何将代码块转化为高效、可维护和可扩展的系统。我们将一起见证,当代码与架构思维相结合时,如何引发技术实践的革命性飞跃。
|
4月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
29 0
|
4月前
|
SQL 数据库
拒绝了对对象 ‘GetTips‘ (数据库 ‘vipsoft‘,架构 ‘dbo‘)的 EXECUTE 权限
拒绝了对对象 ‘GetTips‘ (数据库 ‘vipsoft‘,架构 ‘dbo‘)的 EXECUTE 权限
41 0
|
4月前
|
运维 Kubernetes 索引
揭秘ChaosBlade的Helm安装双架构:一步到位,让系统故障测试变得前所未有的简单和高效!
【8月更文挑战第7天】在多变的IT环境中,确保应用的稳定与可用至关重要。混沌工程通过故意引入故障来增强系统韧性。ChaosBlade是一款开源混沌实验工具,支持多样化的故障注入。结合Kubernetes的包管理器Helm,可简化ChaosBlade在集群中的部署。本文介绍如何使用Helm安装ChaosBlade双架构版本,包括添加仓库、选择版本、安装配置及验证等步骤,助力高效实施混沌工程,提升系统稳定性和可靠性。
59 0
|
7月前
|
设计模式 供应链 安全
如何在短频快的节奏中做好技术?业务开发必会的架构思维
本文提供一种业务架构设计模式:从业务&技术两个角度提炼出一个基础思维框架,供业务线开发同学参考。
如何在短频快的节奏中做好技术?业务开发必会的架构思维
下一篇
无影云桌面