29从零开始学Java之如何正确创建Java里的类?

2023-05-16

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

在上一篇文章中,壹哥给大家介绍了面向对象和面向过程的概念,并介绍了两者的区别。但是上一篇文章中的内容,介绍的还是比较笼统。接下来壹哥会在本篇文章中,再单独给大家详细介绍Java中类的概念,让大家加深对面向对象的理解。

----------------------------------------------前戏已做完,精彩即开始--------------------------------------------------

全文大约【4000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github:

GitHub - SunLtd/LearnJava

Gitee:

一一哥/从零开始学Java

一. 类的简介

1. 概念

要掌握面向对象,我们就不得不先了解一下什么是类。类是对表示客观世界中某类群体的一些基本特征的抽象。它会在一组相同或相似的对象中,抽取出共性的特征和行为,保留我们所关注的部分。

当然,这个概念对于小白来说很难理解,壹哥必须给大家举个栗子🌰。

壹哥很久以前上大学时,去生产手机设备的电子厂做过暑假工。当时那个厂子是给摩托罗拉生产手机壳的,你们知道手机壳是怎么生产的吗?肯定不是靠人力把一个个壳子给雕刻出来,而是利用专门的“模具”来生产。就是每一款手机设计出来之后,就会针对该款手机的外形进行“开模”,先生产出一款手机外壳的“模具”。接下来工厂里面就调制出所需的塑料(液体形态),把这个液体的塑料往模具里一倒一压,等冷却后抠出来就是一个个的手机壳了。

其实这样的场景,壹哥相信很多人都见过,我们家里做饭用的大铁锅、洗脸盆等用品,也都是通过对应的模具生产出来的。

那么大家想一下,这个“模具”不就是某类群体的一些基本特征的抽象吗?把所有手机壳或者是锅碗瓢盆的“共性的特征和行为抽取出来”!所以,“模具”就是一个“类”,“类”就是一个“模具”!我们可以利用“类”生产出很多同类的“产品”,这些个产品就是“对象”。

2. 类与对象的关系

类是对象的抽象,对象是类的具体。也就是说,类是一种概念模型,定义了对象的所有特性和所需的操作。而对象是一个真实的模型,是一个具体的实体。所以类是描述了一组具有相同特性(属性)和相同行为(方法)的一组对象的集合。

类是构造面向对象程序的基本单位,是抽取了同类对象的共同属性和方法所形成的对象或实体的“模板”。而对象则是现实世界中实体的描述,对象要创建才存在,有了对象才能对对象进行操作。概括总结就是:

类定义了对象应具有的特征和行为,类是对象的模板;

对象是拥有多个相同特征和行为的实体,对象是类的实例。

所以,类是对象的模板,对象是类的实例面想对象其实就是从具体到抽象,再从抽象到具体的过程就好比“人类”是一个类别的统称,但并不是某个具体的对象“张三、李四”;而“张三、李四”则是一个个具体的“对象”,不是“人类”。

3. 类的组成

在一个类中,主要包括两个核心要素,即属性和行为。属性其实就是类中的各种变量,行为其实就是类中的各种方法。

属性:对应着各种变量,包括成员变量、类变量等;

行为:对应着各种方法,包括实例方法、静态方法、静态代码块等。

接下来壹哥会给大家讲解如何创建一个类,并介绍以上这些概念该如何用代码定义,另外我们也会在后面通过专门的文章来学习这些内容。

二. 类的创建

1. 创建步骤

我们要用代码创建一个类,可以按如下几个步骤进行实现:

1. 确定类名;

2. 编写成员变量;

3. 编写成员方法。

通过以上步骤,一个类就可以创建出来了。

2. 基本语法

在 Java 中,定义一个类需要使用 class 关键字、类名和一对表示程序体的大括号,基本语法如下:

[public][abstract|final]class<class_name>[extends<class_name>][implements<interface_name>] {
    //属性部分
    <property_type> <property1>;
    <property_type> <property2>;
    <property_type> <property3>;
	......
    
    //方法部分
    method1();
    
    method2();

    method3();
    ......
}

在上述语法中,“[]”中括号里的部分是可选的,可以省略,中括号外面的部分则是必须的。“|”竖线表示“或的关系”,比如abstract|final,说明可以使用abstract 或 final 关键字,但这两个关键字不能同时出现。

3. 关键字

在上述语法中,出现的各关键字含义如下:

  • public表示“公共的”,使用 public 修饰,该类就可以被其他类和程序访问。Java程序的主类必须是 public类,凡是需要作为公共工具供其他类和程序使用的类都应定义为 public类。
  • abstract表示“抽象的”,被abstract修饰的类是抽象类。抽象类不能被实例化,抽象类中可以有抽象方法(使用 abstract修饰的方法) 和具体方法(没有使用 abstract修饰的方法)。继承抽象类的所有子类,都必须实现该抽象类中所有的抽象方法(除非子类也是抽象类)。
  • final常量修饰符。被final修饰的类不允许被继承。
  • class声明类的关键字。
  • class_name类的名称。
  • extends表示继承的关键字,表示一个类继承其他类。
  • implements表示实现的关键字,表示一个类实现某些接口。
  • property_type成员变量的类型。
  • property成员变量的名称。
  • method()成员方法的名称。

4. 命名规则与规范

既然我们要创建一个类,必须给该类起一个名字,这就是“类名”。Java类名的命名规则,也要遵循我们前面学过的Java命名规范,让我们再来复习一下Java的命名规则与规范吧:

①. 标识符由 字母(含英、中、日、俄等)、数字、下划线"_" 和 美元符号$ (音: dollar)组成,如age、G7、_value、$salary

②. 不能以数字开头,如123abc

③. 严格区分大小写,如class与Class是不同的

④. 长度无限制(一般不要超过15个字符);

⑤. 不能是Java中的保留字和关键字。

以上这些是必须要遵循的规则,还有一些建议我们遵守的规范,如下:

  • 标识符命名习惯尽量做到见名知意,如Order订单类,不要写a、b、c这种名称;
  • 变量名/方法名/参数名首字母要小写。如果名称由多个单词组成,第一个单词的首字母应小写,剩下的单词首字母应大写(驼峰式命名法),例如:xxxYyyZzz、numCounter;
  • 类名: 单词首字母应大写,如果类名由多个单词组成,每个单词的首字母都应大写(帕斯卡命名法),例如:XxxYyyZzz、OrderCancel;

所以我们在给类进行命名时,也要遵守以上规则和规范。

5. 基本案例

学习了以上这些理论内容之后,我们通过一个小案例来感受一下如何创建一个类。

/**
 * @author 一一哥Sun 
 * QQ:2312119590 
 * CSDN、掘金、知乎找我哦
 * 千锋教育
 */
public class Person {//类名首字母大写,要见名知意
    //定义属性
	// 姓名
	public String name;

	// 性别
	private String sex;

	// 年龄
	private int age;

    //定义方法
	/**
	 * 吃饭
	 */
	public void eat() {
		System.out.println("我会吃饭...");
	}

	/**
	 * 说话
	 */
	public void speak(String name, String sex, int age) {
		System.out.println("我会说话...我的名字是:" + name + ",性别:" + sex + ",年龄=" + age);
	}

}

我们在上面的代码中,就是按照创建类的3个核心步骤进行实现的:

  1. 声明类给类起一个合格的名字。
  2. 编写类的属性类的属性就是类中的变量,通过在类的主体中定义变量来描述类所具有的特征。类中声明的变量分为类的成员变量和静态变量
  3. 编写类的方法类的方法描述了类所具有的行为,它们是类的成员方法,我们可以简单地把方法理解成可以独立完成某个功能的单元模块。

大家注意,类中的属性和方法都是类的成员。

三. 属性的定义

壹哥在上面给大家讲了,类的成员包括属性和方法,其中方法的定义我会放在以后进行专门地讲解,今天我们先来学习一下属性的定义。

1. 属性简介

类中的属性,其实就是类中的变量,通过在类的主体中定义变量来描述类所具有的特征。类中声明的变量分为类的成员变量(实例变量)和静态变量(类变量)

2. 基本语法

我们要想定义类的属性,应该遵循一定的语法格式,如下:

[public|protected|private][static][final]<type><variable_name>

上面语法中,各参数的含义如下:

  • public、protected、private:访问修饰符。用于表示成员变量的访问权限。
  • static:静态修饰符。表示该成员变量为类变量,也称为静态变量。
  • final:常量修饰符。表示将该成员变量为常量,其值无法被改变。
  • type:变量的类型。
  • variable_name:变量名称。

我们可以在声明变量的同时对其进行初始化,如果声明变量时没有对其进行初始化,则系统会使用默认值进行初始化。接下来我们就通过一个代码案例来学习属性的定义。

3. 基本案例

/**
 * @author 一一哥Sun 
 * QQ:2312119590 
 * CSDN、掘金、知乎找我哦
 * 千锋教育
 */
public class Car {
	// 汽车品牌
	public String logo;

	// 汽车颜色
	private String color;

	// 汽车价格
	private double price;
	
	//静态常量:定义一个字符串常量
	public static final String CAR_MANUFACTURER="大众";

    /**
	 * 为私有的成员变量提供对外的公开方法,方便其他类对该属性进行访问。
	 * 获取汽车的logo
	 */
	public String getLogo() {
		return logo;
	}

	/**
	 * 为汽车的logo重新赋值
	 * @param logo
	 */
	public void setLogo(String logo) {
		this.logo = logo;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}
	
	//复写toString方法,返回汽车信息
	@Override
	public String toString() {
		return "[Logo]=" + logo + ",[Color]=" + color + ",[Price]=" + price;
	}

}

在上述Car汽车类中,我们定义了 3个成员变量和1个静态变量。一般情况下,像这种类的成员变量,访问修饰符都是private私有的,表示该成员变量只是被该类自己访问,不能被外界访问。如果我们想要被外界访问,可以对外提供一些该属性对应的公开方法,如setXXX和getXXX(),而不是被其他类来直接访问该属性。

另外我们还定义了一个公开静态的字符串常量。一般情况下,一个常量都是可以被其他类直接访问的,所以经常设置成公开的和静态的,这样方便直接调用。而常量的值一旦被设置之后,就不能在运行时被修改了,这也就是常量的含义:保持常态不变!

4. 成员变量与局部变量的对比

我们在上面说过,类中的属性其实就是变量,有成员变量和静态变量。但是我们知道,还有一种局部变量,那么成员变量与局部变量有什么区别呢?我们来看下表:

区别

局部变量

成员变量

位置

定义在方法内

定义在方法外,类的里面

默认值

没有默认值

系统提供默认值,与之前讲的数组一致

作用域

所在的{}

在整个类中

重名

在不同的作用域可以重名

不能重名

生命周期

方法执行完被销毁

当对象被销毁的时候销毁

另外我们还要注意,局部变量是可以与实例变量重名的。如果成员变量和局部变量的名称相同,Java会遵循就近原则,就是哪个近采用哪个变量。

------------------------------------------------​​​​​​​正片已结束,来根事后烟----------------------------------------------

四. 结语

至此,壹哥就把与类相关的内容给大家讲解完毕了,现在你知道该如何创建一个类了吗?我们在创建类时,要遵守定义类时的命名规则和基本语法,掌握常用关键字的基本含义,多写多练自然就会啦。

在下一篇文章中,壹哥会继续讲解面向对象中关于对象的内容,敬请期待哦。如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

五. 配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看壹哥帮你筛选出的视频教程。与本文配套的Java学习视频,链接如下:

Bilibili External Player

六. 今日作业

1. 第一题

设计一个学生类,并设计出一个学生应有的属性,请把实现代码在评论区贴出来哦。

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

29从零开始学Java之如何正确创建Java里的类? 的相关文章

  • 短 2 个字节

    我正在从串行端口读取一个长度为 133 字节的数据包 最后 2 个字节包含 CRC 值 我使用 Java 将 2 个字节值制成单个 我认为很短 这就是我所做的 short high 48 0x00ff short low 80 short
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • 空检查时可能未初始化错误

    我正在检查变量是否已初始化 但此时 netbeans 给了我variable reader might not have been initialized警告 我该如何解决 抑制这个问题 这是我的代码 摘要 final Reader rea
  • Java制作一条有向线并使其移动

    我想画一条有向线并让它移动 我能够绘制一条有向线并移动该线 但当我移动该线时箭头会移位 这是我的绘画方法 Line2D Double line new Line2D Double startX startY endX endY g2d dr
  • Spring引导错误

    我正在使用 Spring BOOT 运行一个简单的桌面应用程序 下面是错误堆栈 org springframework beans factory BeanCreationException Error creating bean with
  • POJO 到 Google App Engine 中的 XML 字符串?

    我想为我的 Java Google App Engine 程序创建一个 REST 接口 我想我应该从我的 POJOS 生成一些 XML 开始 然而 XStream似乎受到了GAE的限制 我可以使用什么在 Google App Engine
  • 多模块项目的 Maven 报告和站点生成

    我正在尝试使用子模块来正确测试和生成报告 但遇到了一些问题 我有以下项目结构 parent test1 test2 和 pom xml 的parent看起来像这样
  • 是否可以使用 Java 在文件上设置自定义元数据?

    是否可以在 File 实例上获取和设置自定义元数据 我想将通过系统处理的文件用作某种非常简单的数据库 其中每个文件都应包含其他自定义元数据 例如发件人的电子邮件 一些时间戳等 它是针对内部系统的 因此安全性不是问题 在 java 7 中你可
  • SimpleDateFormat.parse() 忽略模式中的字符数

    我正在尝试解析一个可以具有不同格式的日期字符串 尽管字符串不应与第二个模式匹配 但它却以某种方式匹配 因此返回错误的日期 这是我的代码 import java text ParseException import java text Sim
  • JAXB:如何注释类以使它们属于不同的命名空间?

    我希望有JAXB 注释的类将是 编组 解组到不同的 XML 命名空间 我需要的是这样的
  • 使用套接字和 AsyncTask 强制关闭

    堆栈的人们大家好 请参阅下面我的班级代码和我的 LogCat 尝试连接时我受到强力关闭 如果有人能帮助我找出原因 我将不胜感激 基本上代码的作用是 从意图中获取 IP 地址 连接到端口 32 的 IP 然后发送一个命令 等待响应并发送另一个
  • Spring Security 3.0 中 security-role-ref 和 role-link 的等效项是什么?

    我正在将带有 web xml 安全约束 安全角色和登录配置的标准 Web 应用程序移植到 Spring Security 3 0 我在 web xml 中找到了几乎所有功能的等效映射 security role ref 元素除外 我不想指定
  • 如何以编程方式搜索 Google Java API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道是否以及如何以编程方式搜索 Google 特别是如果有 Java API 的话 一些事实 Goo
  • 关于 ArrayList[] x 的 Java 问题

    我一直对 ArrayList 数组有这个问题 也许你能帮忙 declare in class private ArrayList
  • Java - 通过相对路径加载dll并将它们隐藏在jar中

    PART 1 我正在开发一个 Java 应用程序 应该作为 jar 发布 该程序依赖于JNI调用的C 外部库 要加载它们 我使用以下方法System load使用绝对路径 效果很好 然而 我真的想将它们 隐藏 在 JAR 中 所以我创建了一
  • Android webview 滚动不起作用

    我正在尝试在网络视图中向下滚动到页面底部 我正在使用谷歌在其教程中提供的网络视图示例 我正在使用这行代码来尝试滚动 但它不起作用 mWebView pageDown true 关于如何使其以编程方式滚动有什么建议吗 谢谢 public cl
  • 这种复杂的泛型模式会导致 Eclipse 崩溃 - 我可以让它工作吗?

    我使用的是 Eclipse Luna 4 4 0 JDK 1 8 0 05 我正在制作一个游戏 游戏世界的拓扑结构可以大致分为World gt Level gt Tile 其中图块是地形的一个小单位 我设置了三个项目 一个包含这些结构的一些
  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile

随机推荐