用Java编写类的教程。
微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩
构造方法
构造函数是在创建新对象时运行的方法。这些方法通常用于为对象设置内部状态,因此您不必在创建对象后立即调用一堆 setter 方法。构造函数和设置器的一个常见问题是我们希望为参数使用与属性相同的名称。我们可以使用“this”关键字来解决这个问题,“this”始终指代当前对象,因此即使属性名称已被参数临时覆盖,我们仍然可以访问这些值。语法如下:
class Point {
private int x;
private int y;
// this is a constructor method
// it sets the values of the private attributes
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
// constructor parameters are passed like this
Point myPoint = new Point(3, 7);
静态方法
静态方法类似于静态属性,因为它们属于类而不是对象。静态方法是与该类型的功能相关的行为,但与任何特定对象的内部状态无关。例如,如果我们有一个类“Car”,我们可以有一个静态方法“mphToKph”,它将英里每小时转换为公里每小时,这将是静态方法的一个很好的用例,因为它与“Car”类相关不一定需要知道任何给定汽车对象的状态。这是一个例子:
class Car {
// this is a static method
public static int mphToKph(int mph) {
// implementation can only access parameters
return mph * 1.609;
}
}
// we call the static method with the class name not an object.
int kph = Car.mphToKph(25);
方法重载
方法重载是将静态多态性引入我们的 java 代码的常见模式。当我们使用方法重载时,我们根据它们的行为为方法分配不同的行为。这是构造函数的一种非常常见的模式,因为我们可能希望根据我们提供的内容以不同的方式创建对象。然而,它不是构造函数独有的,可以与任何类型的方法一起使用。这是一个例子:
class Car {
private int speed = 0;
// default behavior
public void accelerate() {
speed += 5;
}
// parameterized becavior
public void accelerate(int amount) {
speed += amount;
}
}
扩展另一个类
继承是 OOP 的 4 大支柱之一,它允许我们扩展另一个类的行为,从而减少我们必须编写的代码量。在 java 中,它的行为是任何给定的子类型都继承父类的方法和属性,一个例子就是一个普通的类“Animal”,它具有针对不同制造商的子类型,比如“狗”或“鸟”类. 这些子类型可能是不同的类型,但它们都具有非常相似的属性,因此我们可以从“Animal”类继承所有常用方法。此外,我们在构造子类型时不必如此具体,因为如果足够具体的话,我们可以只使用超类型作为类型参数。此处显示了一个示例:
class Car {
private int speed = 0;
public void move() {
speed += 5
}
}
// the extends keyword denotes inheritance
class SportsCar extends Car {
public void makeEngineNoises() {
System.out.println("Vrooom");
}
}
Car s2000 = new Car();
s2000.move();
s2000.makeEngineNoises();
受保护的属性和方法
除了用于属性和方法的其他修饰符关键字外,还有与继承有关的 protected 修饰符。私有属性或方法只对特定类可见,而受保护属性对该类的所有子类可见,但对其他类不可见。
最终方法
Final 是方法的特殊修饰符,因为它防止子级修改该方法的实现,这用于使方法在类层次结构中保持一致。
方法覆盖
如果你想改变从父类继承的方法的行为,你仍然可以使用装饰器来做到这一点。(装饰器是 Java 中的一个注解,它改变了方法的行为)一个你想要使用覆盖的例子是,如果你有一个类“dog”,它扩展了“animal”,“dog”继承了一个方法“walk” ”,您可能想要更改“walk”的实现,以更具体地说明狗是如何走路的。这是一个例子:
class Car {
protected
();
s2000.move();
继承的陷阱
虽然继承是面向对象编程的重要组成部分,但在程序员中它也是一个有争议的工具。复杂的继承层次结构会使代码更难理解,并可能引入意外和不需要的行为,此外,继承会在子类和父类之间产生依赖性,这是我们在编写程序时通常要避免的事情。由于这些问题,继承并没有被广泛推荐使用,一些现代语言如 Go 和 Rust 甚至完全放弃了它。Java 特别也不支持多重继承,这意味着一个类只能从一个其他类继承,这会限制继承的灵活性。
作品
为了处理 OOP 中的继承问题,如今大多数程序员建议使用组合来替代继承。组合代表“有一个”关系而不是“是一个孩子”关系,这意味着我们考虑一个对象的组件,使它做我们想做的事情,而不是仅仅从具有相似行为的父对象继承。这种方式导致组件的耦合更加松散,并且具有更多的通用性。组合也很容易,我们只需将其他类的对象分配为我们类的属性,这使我们可以访问该类的行为,而无需深度耦合和其他继承陷阱。这并不是说继承永远没有用处,但在许多情况下,当您想要修改和扩展现有类的行为时,组合可能会更好。
class Car { // car does not extend anything
// composing this class with other types
private Wheels wheels = new Wheels();
public void move() {
wheels.turn();
}
}
编程到接口
面向对象编程中的接口很重要,因为它们允许我们分离和松散地耦合我们的代码。一个很好的例子是内置的“java.util.Collection”接口。该接口描述了集合必须具有的方法和常量。正因为如此,我们可以相信我们可以以相似的方式与所有集合进行交互,这意味着我们不必学习集合的每个特定实现的方法,并且在构建集合时我们可以通用,减少对特定的依赖类型。这是一个例子:
interface Vehicle {
// methods to not need bodies in interfaces
void speedUp();
void slowDown
void slowDown() {
speed -= 1;
}
}
接口编程的其他好处
针对接口编程的其他一些好处包括:可测试性,通过使我们的许多类遵循公共接口,我们可以更轻松地编写单元测试以确保它们正常工作,并且它使人工测试变得更加简单。在业务环境中,它还允许我们测试一个想法的多个实现,而无需完全投入,这在从客户那里获得反馈或需要更改实现时非常有用。
测试你学到了什么
这里有一个 java 示例项目来测试您所学的内容,它使用了本文涵盖的大部分概念,以及一些其他基本的 java 知识。查看自述文件以了解如何开始,然后只需在需要的地方填写代码,并使其运行!
https://github.com/Melidee/java-classes-intro
结论
在本文中,我们介绍了如何通过编写类在 Java 中进行有效的面向对象编程,还介绍了类的工作原理、它们的属性、方法、继承、组合和接口编程。使用所有这些工具,您应该能够提高代码质量,并了解代码如何交互。
推荐书单
《项目驱动零起点学Java》
《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。
《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。
马士兵,马士兵教育创始人,毕业于清华大学,著名IT讲师,所讲课程广受欢迎,学生遍布全球大厂,擅长用简单的语言讲授复杂的问题,擅长项目驱动知识的综合学习。马士兵教育获得在线教育“名课堂”奖、“最受欢迎机构”奖。
赵珊珊,从事多年一线开发,曾为国税、地税税务系统工作。拥有7年一线教学经验,多年线上、线下教育的积累沉淀,培养学员数万名,讲解细致,脉络清晰。
精彩回顾
微信搜索关注《Java学研大本营》
访问【IT今日热榜】,发现每日技术热点