首页 > 编程语言 >Java三剑客:封装、继承、多态的魔法世界

Java三剑客:封装、继承、多态的魔法世界

时间:2024-07-12 20:01:08浏览次数:20  
标签:Java name double 多态 Shape Animal public 三剑客

第一章:封装的艺术 —— 保护你的宝藏

案例分析:银行账户系统

想象一下,你正在构建一个银行账户系统。每个账户都有一个余额,这个余额需要受到严格的保护,不能被随意修改。我们可以通过封装来实现这一目标。

示例代码:

public class BankAccount {
    private double balance; // 私有变量,不允许直接访问

    public BankAccount(double initialBalance) {
        if (initialBalance > 0.0) {
            balance = initialBalance;
        } else {
            balance = 0.0;
        }
    }

    // 提供公共方法存款
    public void deposit(double amount) {
        if (amount > 0.0) {
            balance += amount;
        }
    }

    // 提供公共方法取款
    public boolean withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
            return true;
        } else {
            return false;
        }
    }

    // 提供公共方法查询余额
    public double getBalance() {
        return balance;
    }
}

在这个例子中,balance被声明为私有变量,只能通过deposit()withdraw()getBalance()方法进行访问和修改。这样,我们就能确保账户的安全性和一致性。


第二章:继承的传承 —— 父亲的衣钵

案例分析:动物王国

在Java中,继承允许我们创建一个类族谱,使得子类可以继承父类的属性和方法,从而实现代码的复用和扩展。

示例代码:

// 定义一个父类 Animal
public abstract class Animal {
    protected String name;
    protected int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public abstract void makeSound(); // 抽象方法,强制子类实现
}

// 定义一个子类 Dog,继承自 Animal
public class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void makeSound() {
        System.out.println("Woof woof!");
    }
}

// 定义另一个子类 Cat,继承自 Animal
public class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void makeSound() {
        System.out.println("Meow meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog("Buddy", 3);
        Animal myCat = new Cat("Whiskers", 2);

        myDog.makeSound();   // 输出: Woof woof!
        myCat.makeSound();   // 输出: Meow meow!
    }
}

在这个例子中,Animal类作为基类,定义了一个makeSound()抽象方法,所有继承自它的子类(如DogCat)都必须实现这个方法。这样,我们就能够通过一个统一的接口(即Animal类)来处理不同类型的动物,体现了继承的优势。


第三章:多态的魔法 —— 变身大师的技能

案例分析:图形绘制系统

在Java中,多态允许我们编写更加灵活和通用的代码,通过多态,同一段代码可以处理不同类型的对象,具体的行为由运行时对象的实际类型决定。

示例代码:

// 定义一个图形接口 Shape
public interface Shape {
    double calculateArea();
}

// 实现 Shape 接口的 Circle 类
public class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

// 实现 Shape 接口的 Rectangle 类
public class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(4, 6);

        System.out.println("Circle area: " + circle.calculateArea()); // 输出: Circle area: 78.53981633974483
        System.out.println("Rectangle area: " + rectangle.calculateArea()); // 输出: Rectangle area: 24.0
    }
}

在这个例子中,我们定义了一个Shape接口,以及两个实现该接口的类CircleRectangle。通过多态,我们可以使用Shape类型的引用指向任何实现了Shape接口的对象,并调用其calculateArea()方法。这样,我们就可以写出通用的代码,处理任意形状的图形,极大地提高了代码的灵活性和可扩展性。


设计模式与面向对象原则

深入理解封装、继承和多态之后,你将发现它们是许多高级编程概念和设计模式的基础。比如:

  • 单一职责原则:一个类应该只有一个引起它变化的原因,这正是封装思想的体现。例如,在BankAccount类中,我们通过将balance设置为私有变量,并提供公共方法来操作它,确保了账户的职责清晰。

  • 开放封闭原则:对扩展开放,对修改关闭。继承和多态机制是实现这一原则的关键。例如,在Animal类的例子中,我们定义了一个抽象方法makeSound(),所有的子类都必须实现这个方法。这样,当我们需要添加新的动物类型时,只需创建一个新的子类即可,无需修改现有代码。

  • 工厂模式:这是一种常用的创建型设计模式,用于封装对象的创建过程。通过工厂方法,我们可以根据传入的参数动态地创建对象,而无需指定具体的类。结合继承和多态,工厂模式可以提供非常灵活的对象创建机制。

  • 策略模式:这是一种行为型设计模式,允许在运行时选择算法或行为。通过定义一组算法接口,然后让不同的策略类实现这些接口,我们可以根据实际需求动态地切换策略,这充分体现了多态的灵活性。

标签:Java,name,double,多态,Shape,Animal,public,三剑客
From: https://blog.csdn.net/qq_44771627/article/details/140387473

相关文章

  • JAVA利用HttpClient进行POST请求(HTTPS)
    finalHttpClientUtilhttpClientUtil=newHttpClientUtil();finalMap<String,String>map=Maps.newHashMap();map.put("username",workNo);map.put("password",passwd);finalStringresultStr......
  • java将小写金额转换为大写的工具类
    摘自:http://www.cnblogs.com/niuyaoBolg/p/5654113.htmlpublicclassTool{privatestaticfinalStringUNIT="万千佰拾亿千佰拾万千佰拾元角分";privatestaticfinalStringDIGIT="零壹贰叁肆伍陆柒捌玖";privatestaticfinaldoub......
  • 【JavaWeb程序设计】EL和JSTL
    目录一、在数据库Book中建立表Tbook,包含图书ID,图书名称,图书价格。实现模糊查询图书,如果图书的价格在50元以上,则以黄色字体显示书名。相应的模糊查询放在Servlet中实现,在图书的显示代码中使用JSTL。1.运行截图2.建表(tbook)并插入数据3.search.jsp(1)查找表单(2)CSS4.mybat......
  • JavaScript调试技巧总结
    debug javascript最全面的JavaScript调试技巧总结本文将一一讲解各种前端JS调试技巧,也许你已经熟练掌握,那让我们一起来温习,也许有你没见过的方法,不妨一起来学习,也许你尚不知如何调试,赶紧趁此机会填补空白。Thisentrywaspostedin Review andtagged debug, javasc......
  • 同时用到,网页,java程序,数据库的web小应用
    具体实现功能:通过网页传输添加用户的请求,需要通过JDBC来向MySql添加一个用户数据第一步,部署所有需要用到的工具IDEA(2021.1),Tomcat(9),谷歌浏览器,MySql,jdk(17)第二步,创建java项目,提前部署数据库在idea中新建一个空的java项目:我创建的数据库名为learnbase,执行use......
  • 数据结构(Java):队列&集合Queue&力扣面试OJ题
    1、队列1.1队列的概念队列是一个特殊的线性表,只允许在一端(队尾)进行插入数据操作,在另一端(对头)进行删除数据。队列具有先进先出FIFO(FirstInFirstOut)的特性。入队:数据只能从队尾进队列    出队:数据只能从对头出队列即:队尾进队头出我们可以把队列想象为一个排队......
  • 深入理解 JavaScript 闭包:前端开发中的重要概念
    闭包是JavaScript中一个非常重要的概念,对于理解和编写高效、灵活的代码至关重要。尽管它看似复杂,但一旦掌握了闭包,你将能够更好地理解JavaScript的函数作用域和变量生命周期。本文将深入探讨JavaScript闭包,帮助你在前端开发中更好地运用这一强大工具。什么是闭包?闭包是指......
  • JAVA——水仙花数问题
    2024/07/121.问题2.错误解法3.错误分析4.正确解法5.其他:关于Java中幂函数的用法6.参考1.问题2.错误解法importjava.util.Scanner;publicclassMain{ publicstaticvoidmain(String[]args){ Scannerscanner=newScanner(System.in); intA=nextInt();......
  • java集合工具类
    java集合工具类importjava.util.Collection;importjava.util.List;importjava.util.function.Consumer;importjava.util.stream.Collectors;publicclassCollUtil{/***集合是否为空**@paramcollection集合*@return是否为空......
  • Java中的方法重写详解
    Java中的方法重写详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.方法重写的定义和特点方法重写(MethodOverriding)是指子类可以重写父类的同名方法,以便于子类根据自身特定的需求来实现方法的具体行为。重写方法必须具有相同的方法签名,即方法名、......