Java基础·第1篇:面向对象 vs 面向过程——Java和C语言到底有什么区别?
编程语言的分类面向对象(Java)和面向过程(C语言)是两种主流编程范式。 它们到底有什么区别?本文用锤子和咖啡两个例子,讲清楚编程范式的核心思想。 1、面向过程的编程语言面向对象的编程范式其实上是将我们需要解决的问题拆解,变成一个一个的步骤,先做什么,后做什么。典型的面向过程的编程语言是我们编程学习的启蒙语言————C语言,我们在学习的过程中大部分时候都是在编写函数,各种各样的函数,在主程序中不断的根据需求依次的去调用函数,将需要处理的数据给函数,函数返回一个处理后的结果。这个过程就像在制造工具来解决实际问题,比如制造一把锤子,你需要先砍树造木柄,然后挖铁矿冶炼铁,紧接着锻造锤头,最后组装,那么你就拥有了一把锤子,你可以拿他钉钉子或是其他的需要。 以下面的一个简单的C语言程序为例:在程序运行过程中,我们将需要计算的数据a和b,传给做加法运算的函数sum(),函数sum()将计算后的结果赋值给变量sum,然后通过printf()函数输出出来,至此程序结束。 12345678910#include<stdio.h>int main(){ int a=1;...
Java基础·第3篇:Java封装——为什么要把数据藏起来?
前言在我们学习面向过程的编程语言,比如说C语言时,一定会出现下面的情况:假设你定义了一个全局变量 int balance = 1000;(余额)。在C语言里,程序中任何一个函数都可以直接访问并修改这个 balance。 12345678910// 面向过程风格(C语言)int balance = 1000;void buyCoffee() { balance -= 20; //直接修改}void hackFunction() { balance = 0; // 任何函数都能随意篡改,没有任何阻拦!} 因为没有数据的保护机制,数据对所有函数都是公开的,任何地方写错了一行代码,都可能导致数据被意外修改。如果在编写程序的时候,意外的写错了数据,造成bug出现,就要在几百行代码里找问题,很麻烦。 而在面向对象的编程语言中,可以对数据进行封装来实现对数据的保护。 为什么需要封装?从数据的“裸奔”说起在接触封装之前,我们定义的类通常长这样: 12345public class Student { public St...
Java基础·第2篇:数据类型(基本+引用)和输入输出(Scanner)
引入Java数据类型分为基本数据类型和引用数据类型。本文整理了8种基本数据类型的表格,用“藏宝图”讲清引用数据类型。后半部分介绍Java的输入输出:System.out和Scanner的用法。 Java的数据类型一、基本数据类型为了让你一目了然,我将这8种基本数据类型整理成了如下表格,涵盖了它们的存储大小、取值范围及核心特性。 数据类型 关键字 占用空间 取值范围 默认值 核心特性与注意事项 字节型 byte 1字节 -128 ~ 127 0 节省内存,常用于文件IO或网络传输。 短整型 short 2字节 -32,768 ~ 32,767 0 较少直接使用,用于特定内存优化场景。 整型 int 4字节 约±21亿 0 最常用的整数类型,默认整数字面量。 长整型 long 8字节 约±922亿亿 0L 存储超大整数,赋值时数值后需加L。 单精度浮点 float 4字节 约±3.4E38 0.0f 精度较低(6-7位有效数字),赋值需加F。 双精度浮点 double 8字节 约±1.8E308 0.0d 最常用的小数类型,默认浮点字面量。 字符型...
Java基础·第5篇:Java多态——不用再写三个重载方法了!
引入 假设你要写一个宠物管理系统。系统里有一个“投喂”功能: 狗:吃狗粮 猫:吃猫粮 兔子:吃兔粮 如果没有多态,你可能需要这样写: 123public void feed(Dog d) { d.eat(); }public void feed(Cat c) { c.eat(); }public void feed(Rabbit r) { r.eat(); } 三种动物,三个方法。那如果是十种动物呢?写十个长得一模一样的方法? 多态要解决的问题就是:用一个方法,接收所有动物。 1public void feed(Animal a) { a.eat(); } 不管你传进来的是狗、猫还是兔子,只要它是Animal,就能调eat()。至于具体怎么吃,每个动物自己说了算。 这就是多态——同一个方法调用,表现出不同的行为。 下面我们来看多态在Java中怎么实现。 多态的定义与前提1234567891011121314151617181920212223242526272829303132333...
Java基础·第4篇:Java继承——不用重复造轮子,一篇搞懂
什么是继承?继承的特点?继承的好处?引入假如现在需要你开发一个教务管理系统中一个最基础的功能————存储学生和教职工的身份信息,你会怎么做?你的做法可能是这样的:分别创建学生类、教师类和工人类,即 123学生类:属性(姓名,年龄,学工号)、行为(吃饭,睡觉,学习)老师类:属性(姓名,年龄,学工号,薪水)、行为(吃饭、睡觉,上课)工人类:属性(姓名,年龄,学工号,薪水)、行为(吃饭、睡觉,管理) 很明显,如果这样去设计教务管理系统,这三个类中有着大量重复的代码,这样就导致系统的代码复用率低,整个系统显得臃肿笨重。那么应该如何去解决这样的问题呢?假如多个类中存在相同属性和行为时,我们可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。如图所示: 其中,多个类可以称为子类,单独被继承的那一个类称为父类、超类(superclass)或者基类。 继承的概念继承描述的是事物之间的所属关系,这种关系是:is-a 的关系。类似于数学中的集合A属于集合B,表示集合A是集合B的子集,在这里我们用父类和子类来表示这样的继承关系,我们通过继承,可以使多种事物之间...
Java基础·第6篇:Java接口——能飞的就实现Flyer,能游的就实现Swimmer
引入现在需要对宠物管理系统增加一个飞行的功能: 1234狗不会飞行老鹰会飞行麻雀会飞行企鹅不会飞行 在这个宠物管理系统体系中,狗和企鹅是不会飞行的。那如果只用继承,那么狗和企鹅都会飞行,显然不符合常理。也许你也会想,给老鹰和麻雀分别写个飞行的方法,在创建对象之后分别调用,显然会很麻烦 12public void letFly(Eagle e) { e.fly(); }public void letFly(Sparrow s) { s.fly(); } 这时候就需要一个接口,来集中抽象一个系统中只有少部分子类拥有的行为和方法。 接口的概述接口的概念和定义格式 接口:一个用来父类下少部分子类独有功能的方法声明,且只声明,没有方法体 定义格式: 1234567 //接口的定义格式:interface 接口名称{ // 抽象方法}// 接口的声明:interface// 接口名称:首字母大写,满足“驼峰模式” 对于引入中出现的问题在我们了解接口后,可以做出以下的改进: 定义一个包含飞行方法的接口,让拥有飞行能...
Java高级-第一篇:JDBC操作数据库——为什么不用Statement?——PreparedStatement防SQL注入一篇搞懂
引入 这篇文章我们要学习怎么用Java程序来操作数据库,显而易见的是,我们不能直接跟MySQL说话,而是需要通过JDBC这个中间层。JDBC就是Java用来连接数据库的一套标准接口。 案例展示在写代码之前,我们需要简单配置一下:1、创建项目和模块2、在模块下面我们需要一个文件夹去存放JDBC驱动包3、最后在src文件夹下写我们的代码 4、我们需要编写的代码如下:由于关于JDBC这项技术,我们只要做到会用和看的懂的情况下,我们只需要看看知道怎么操作就行 123456789101112131415161718192021222324// 1. 注册驱动(JDBC 4.0后可以省略)Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取连接(MySQL的数据库、密码和用户名)String url = "jdbc:mysql://localhost:3306/test";String username = "root";String password = "123456&...
MyBatis 入门系列(一):从零搭建到查询实现,附踩坑记录
从零开始学 MyBatis:新手踩坑之路与核心原理详解 适合完全零基础的新手,用最直白的语言讲清楚 MyBatis 是什么、怎么用,以及必须搞懂的 5 个核心问题。 一、为什么要学 MyBatis?在我们以前的学习中,我们用Java操作数据库的方法只有JDBC,我们先回顾一下JDBC是怎么操作数据库的,为了操作数据库我们需要编写加载驱动、建立连接、写 SQL、处理结果集、关闭连接…… 十几行甚至几十行模板代码,不仅枯燥,而且代码量上来之后,出错的概率也增大了。 从这我们就可以看出JDBC的劣势了,基本就是我们全自动的去操作数据库,JDBC只是一个用Java操作数据库的一个桥梁。本身并没有给我们带来任何便捷,经过技术的迭代,我们看到了Mybatis这项新的技术。 MyBatis 就是来拯救你的:你只需要定义接口 + 写 SQL,它自动帮你完成剩下的一切(获取连接、预编译、执行、对象封装)。在一定程度上实现了Java操作数据库的半自动流程,省去我们的麻烦。 二、环境搭建(IDEA + Maven + MySQL)1. 创建项目(普通 Maven 项目,不要直接用 Spring Bo...
MyBatis 入门系列(二):增删改查 + 批量删除完整总结(含 @Param 和 foreach)
MyBatis 增删改查 + 批量删除完整总结(含 @Param 和 foreach)学习完Mybatis的基本操作流程之后,因为Mybatis本身就是用Java操作数据库的一项技术,我们躲不掉的要学习在Mybatis中怎么对数据库进行增删改查。接下来直接上实战: 一、Mapper 接口(UserMapper.java)1234567891011121314151617181920212223242526package org.example.mapper;import org.example.pojo.User;import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper { // 查询所有 List<User> findAll(); // 根据 id 查询单个 User findById(Integer id); // 新增(返回影响行数,并自动填充自增 id) int insert(User u...
Java基础·第7篇:Java抽象类——把共性的先做了,剩下的你自己看着办
一、为什么需要抽象类?假如我们需要编写一个员工管理系统。系统的要求如下: 12- 所有员工都有姓名、工号、薪水等基本属性,并且都需要打卡上班。- 所有员工都需要记录工作内容 对于第一个要求,这些属性和行为都是通用的,如果每一个都写一遍,整个系统的代码会变得冗余;对于第二个要求,这些工作内容每个员工的都不一样,无法统一。为了提高代码的简洁性和高效性,我们提出了抽象类的解决方案。 抽象类的解决方案: 通用的属性和方法(姓名、工号、薪水、职位、打卡)→ 父类写好,子类直接继承 无法统一的方法(工作内容)→ 父类只声明,子类各自实现 12345678910111213abstract class Employee { private String name; public Employee(String name) { this.name = name; } public void clockIn() { System.out.println(name + "打卡...










