HOME> 精彩旅程规划> 面向对象编程(NBA版)

面向对象编程(NBA版)

2025-10-22 21:26:35     精彩旅程规划    

前言

提前声明,本篇文章包含一些基础篮球知识,如果你是篮球小白,我建议先去关注下NBA官方抖音号,了解下NBA,再来阅读本文章啊bro!

一、面向过程 VS 面向对象

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特 性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

缺点:性能比面向过程低

比如我给詹姆斯赋予了一个扣篮的功能,它通过调用就可以在比赛中实现扣篮。 面向对象呢就是把现实问题抽象为对象,通过调用每个对象的属性或功能去解决问题。 如果我要修改我的需求,把詹姆斯换成库里,我用面向过程是不是得把每个步骤中的詹姆斯改为库里。而用面向对象解决,我甚至可以重新创一个对象比如库里,仅仅在调用的时候选择库里就行了

面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消 耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能 是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

二、面向对象关键概念

现在让我们一不一样的视角来了解下面向对象(OOP)。

从上图我们可以看到面向对象主要包括六大部分——类、对象、继承、封装、多态、抽象。面向对象呢就像是一支NBA球队,而这些类呢就是球队里的不同位置(中锋、前锋、后卫等等),每个类里都有对应的球员,也就是对象,有的位置呢它有别的位置的一些球员和他们的篮球技能,如果一个后卫(我们这里以库里为例)在换成小个子阵容后,他成了篮下能力最强的人,那么这时库里就会做出一些中锋该做的事,抢篮板、挡拆等等,这就是继承与多态,不过有些球员呢,我们不需要他做别的事,只需要他在原来的位置上做好自己该做的事,这也就是封装,至于抽象这个概念呢,我想就用伦纳德本人举例,他拥有极强的篮球得分和防守能力,但是目前这也仅仅是声明,应为他压根儿不打球,也就是说这是一个没有实现的声明,但是它可交给他的队友这些技能,让她们在赛场上实现,大概这就是抽象吧。

相信你在看完这段文字后再来了解面向对象会比较容易理解些

三、类与对象

类(Class):类是对现实世界中事物的抽象,是对象的蓝图。它定义了对象的属性(字段)和行为(方法)。

对象(Object):对象是类的实例,具有类所定义的属性和方法。每个对象都有独立的状态和行为。

示例代码:

class Animal {

String name;

// Constructor

public Animal(String name) {

this.name = name;

}

// Method

public void speak() {

System.out.println(name + " makes a noise.");

}

}

public class Main {

public static void main(String[] args) {

// 创建对象

Animal dog = new Animal("Dog");

dog.speak(); // 输出: Dog makes a noise.

Animal cat = new Animal("Cat");

cat.speak(); // 输出: Cat makes a noise.

}

}

在这段代码中Animal 类定义了一个属性 name,用于存储动物的名字。构造方法用于初始化这个属性。speak 方法打印出动物的叫声。在主类中,main 方法创建了 Animal 类型的对象 dog 和 cat,并调用 speak 方法输出它们的叫声。

(NBA版)Animal类就相当于后卫这个位置,在这个位置里定义了一个投篮属性name,用于储存球员的名字,speak方法打印出球员的投篮姿势。在主类中(可以理解为教练上的阵容),创建了后卫哈登和库里,哈登左手投篮,库里右手投篮。

四、封装

封装(Encapsulation):封装是将对象的状态(属性)和行为(方法)捆绑在一起,并通过访问修饰符控制对这些属性和方法的访问,保护对象的内部状态不被外部随意修改。使用 getter 和 setter 方法来安全地访问信息。

示例代码:

class Person {

private String name; // 私有属性

// Constructor

public Person(String name) {

this.name = name;

}

// Getter

public String getName() {

return name;

}

// Setter

public void setName(String name) {

this.name = name;

}

}

public class Main {

public static void main(String[] args) {

Person person = new Person("Alice");

System.out.println(person.getName()); // 输出: Alice

person.setName("Bob");

System.out.println(person.getName()); // 输出: Bob

}

}

Person 类有一个私有属性 name,外部无法直接访问该属性。提供了 getName 和 setName 方法用于获取和设置该属性的值。这样可以控制外部对 name 属性的访问。在 Main 类的 main 方法中,通过创建 Person 对象并利用 getter 和 setter 方法演示了封装的特性。

(NBA版)Person类相当于中锋这个位置,这个位置上有个球员叫做奥尼尔(name),他只能打中锋,不能打其他位置。

五、继承

继承(Inheritance):继承允许一个类(子类)从另一个类(父类)派生,子类可以继承父类的属性和方法,同时也可以增加新的特性或重写父类的方法。这样可以实现代码的重用。

示例代码:

class Animal {

public void sound() {

System.out.println("Animal makes a sound");

}

}

class Dog extends Animal {

@Override

public void sound() { // 方法重写

System.out.println("Dog barks");

}

}

public class Main {

public static void main(String[] args) {

Animal myDog = new Dog();

myDog.sound(); // 输出: Dog barks

}

}

Animal 类定义了一个 sound 方法,提供了动物叫声的默认实现。Dog 类继承自 Animal 类,并重写了 sound 方法提供了具体的实现。在 Main 类的 main 方法中,使用多态性,将 Dog 对象赋值给 Animal 类型的引用,并调用 sound 方法,实际调用的是 Dog 类中的实现。

(NBA版)后卫这个位置有一个投篮的技能,中锋呢在训练中继承了这个技能,他也能投篮,并且还改进了下,自抛自扣——假装投篮,将球投到篮板待球弹回再扣篮。而在实际比赛中一个后卫名叫威斯布鲁克用出了这招。

六、多态

多态(Polymorphism):多态允许同一方法在不同的对象上表现出不同的行为。实现多态的方式包括方法重载(在同一类中定义同名但参数不同的方法)和方法重写(在子类中重写父类的方法)。

示例代码:

class Animal {

public void sound() {

System.out.println("Animal makes a sound"); // 默认动物叫声

}

}

class Cat extends Animal {

@Override

public void sound() {

System.out.println("Cat meows"); // 猫的叫声

}

}

class Dog extends Animal {

@Override

public void sound() {

System.out.println("Dog barks"); // 狗的叫声

}

}

public class Main {

public static void main(String[] args) {

Animal myAnimal1 = new Cat(); // myAnimal1 是 Cat 类型的对象

Animal myAnimal2 = new Dog(); // myAnimal2 是 Dog 类型的对象

makeSound(myAnimal1); // 输出: Cat meows

makeSound(myAnimal2); // 输出: Dog barks

}

// 接受Animal类型的参数

public static void makeSound(Animal animal) {

animal.sound(); // 动态绑定,运行时决定调用哪个方法

}

}

Animal 类和它的子类 Cat 和 Dog 都定义了 sound 方法。子类重写了该方法以提供特定的叫声。Main 类的 main 方法中,分别创建 Cat 和 Dog 的对象,使用相同的 Animal 类型引用。通过调用 makeSound 方法,实现多态:Animal 类型的引用根据实际对象类型来决定实际调用的方法,体现了动态绑定。

(NBA版)后卫这个位置呢有得分后卫和控球后卫,他们有不同的得分方式,比赛时,上这两种后卫,分别得分,得分后卫直接选择干拔得分,控球后卫选择助攻队友扣篮得分。

七、抽象

抽象的概念

1.定义:

抽象是从一组对象中提取出共同的特征和行为,而不考虑其具体的实现细节。它使得开发者可以处理对象的概念,而不必关注其具体实现。

2.抽象类(Abstract Class):

抽象类是一个不能被实例化的类,它只能被其他类继承。抽象类可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。一般用于提供一个基础,然后其他子类可以基于这个基础进行具体实现。

3.接口(Interface):

接口是一种特殊的抽象类,它只包含方法的声明而不包含方法的实现。一个类可以实现多个接口,从而能够拥有多种行为。在Java中,接口为实现类提供了一种实现多态的方式

抽象类:

interface Vehicle {

void start(); // 抽象方法

void stop(); // 抽象方法

}

class Car implements Vehicle {

public void start() {

System.out.println("Car is starting.");

}

public void stop() {

System.out.println("Car is stopping.");

}

}

class Bicycle implements Vehicle {

public void start() {

System.out.println("Bicycle is starting.");

}

public void stop() {

System.out.println("Bicycle is stopping.");

}

}

public class Main {

public static void main(String[] args) {

Vehicle myCar = new Car();

myCar.start(); // 输出: Car is starting.

myCar.stop(); // 输出: Car is stopping.

Vehicle myBicycle = new Bicycle();

myBicycle.start(); // 输出: Bicycle is starting.

myBicycle.stop(); // 输出: Bicycle is stopping.

}

}

Animal 是一个抽象类,包含一个抽象方法 makeSound(),以及一个具体的方法 eat()。Dog 类继承了 Animal 并实现了 makeSound() 方法。

(NBA版)伦纳德有优秀的低位单打技术,但他不打球,于是他把这招交给了祖巴茨,祖巴茨在比赛中实现了这个技术。

接口:

interface Vehicle {

void start(); // 抽象方法

void stop(); // 抽象方法

}

class Car implements Vehicle {

public void start() {

System.out.println("Car is starting.");

}

public void stop() {

System.out.println("Car is stopping.");

}

}

class Bicycle implements Vehicle {

public void start() {

System.out.println("Bicycle is starting.");

}

public void stop() {

System.out.println("Bicycle is stopping.");

}

}

public class Main {

public static void main(String[] args) {

Vehicle myCar = new Car();

myCar.start(); // 输出: Car is starting.

myCar.stop(); // 输出: Car is stopping.

Vehicle myBicycle = new Bicycle();

myBicycle.start(); // 输出: Bicycle is starting.

myBicycle.stop(); // 输出: Bicycle is stopping.

}

}

Vehicle 是一个接口,定义了两个方法 start() 和 stop()。Car 和 Bicycle 类实现了这个接口,并提供了具体的实现。通过这种方式,您可以使用相同的接口与不同的实现进行交互。

(NBA版) 全明星赛(指Vehicle)是一个接口,这场比赛定义了两种得分方式扣篮和三分。首发(Car)和替补(Bicycle)都上场了,并用这两种方式得分了。

八、总结

面向对象这一部分在Java中就是手机里的苹果,篮球里的乔丹,希望这篇文章能帮助你更好地理解这一编程重点。