《Java学习大冒险:从菜鸟到“大侠”之路》
嘿,小伙伴们!今天咱们就开启一场超酷的Java学习大冒险。想象一下,你就像一个初入江湖的小菜鸟,Java这片广阔天地就是你的江湖,而学会Java,你就能成为这个江湖里的“大侠”!
🎯 开篇:菜鸟的困惑
> 新手:"师傅,Java代码好长啊!一个需求要写100行!" 别慌!今天带你用 **"方法"** 当招式,**"面向对象"** 当心法,成为Java江湖的"大侠"! --- |
🧩 第一章:方法的定义——代码里的"武功招式"
方法 = 打包重复代码 + 取个酷炫名字
> 就像"降龙十八掌"能反复调用,方法让你一招走天下!
一、 方法语法(武功秘籍)
1、方法的定义与详细解释
首先来一波官方解释:
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集合
注意:
1、方法必须先创建才可以使用,该过程成为方法定义
2、方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
权限修饰符 static 返回值类型 方法名(参数列表){
如果有返回值 return 返回值
没有返回值 不用写return
}
看到这里先别蒙,我来解释一哈,这个方法就是相当于咱小说里嘎嘎炫酷的技能一样,它前面那个权限修饰符就好比是内门和外门功法的权限一样,这就涉及咱下面讲的封装思想了,咱暂且把它看为外门(public)就是谁都可以用的,返回值呢就相当于这个功法用过后会回馈我们一些东西,至于方法名那就不多解释了各位彦祖们和亦菲们,参数列表则是我们施展功法时需要的东西(参数列表: 数据类型 变量名 )。
修饰符 | 就像是大侠的身份标识,比如“public”表示这是一个公开的绝技,谁都可以学;“private”则表示这是大侠的独门秘籍,只能自己用 |
返回值类型 | 就是绝技施展后会产生什么效果。如果是“void”,表示这招没有直接的效果反馈;如果是其他类型,比如“int”,就表示会返回一个整数结果。 |
方法名 | 给这招取个响亮的名字,方便大家记住 |
参数列表 | 施展绝技时需要的一些“道具”或者“条件 |
方法体 | 具体的招式动作,也就是实现功能的代码 |
return | 如果有返回值,就用“return”把结果交出来 |
所以这里方法就会分为四种
1、有参数无返回值
无返回值则用void表示
public static void 方法名(参数列表){
方法体;
}
案例代码:
public static void add(int a, int b) {
System.out.println(a + b);
}
2、 有参数有返回值
有参有返回值 返回的结果的类型必须是返回值的类型!
public static 返回值类型 方法名(参数列表){
方法体;
return 返回的结果;
}
案例代码:
public static int add(int a, int b) {
int c = a+b;
return c;
}
3、 无参无返回值
无参无返回值
public static void 方法名(){
方法体;
}
案例代码:
public static void add() {
System.out.println(100);
}
4、 无参有返回值
无参有返回值 返回的结果的类型必须是返回值类型规定的类型
public static 返回值类型 方法名(){
方法体;
return 返回的结果;
}
案例代码:
public static int add() {
return 100;
}
方法的调用
方法的调用:
返回值类型 变量名 = 方法名(实参列表)
案例代码:
public static void main(String[] args) {
int d = add(100,100);
System.out.println(d);
}
注意:
1、方法必须先定义,后调用,否则程序将报错
2、方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错。方法定义时,多个参数之间使用逗号(,)分隔
- 方法调用时,参数的数量与类型必须与方法定义中的形参相匹配,否则程序将报错
4、只有当方法有返回值时,我们才可以使用变量去接收方法的返回值,如果没有返回值,就不能用变量接收返回值
总结: 每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间栈帧 ,方法内部代码调用完毕之后,会从栈内存中弹栈消失。对应方法中的局部变量也会消失
总之,在Java的世界里,方法就像是武林高手的绝技。啥是方法呢?简单来说,方法就是一段可以被重复调用的代码块。它就像是一个小盒子,里面装着特定的功能。
下面咱们来看一个超级简单的方法定义的代码示例:
public class MethodExample {
public static int add(int num1, int num2) {
return num1 + num2;
}
public static void main(String[] args) {
int result = add(3, 5);
System.out.println("3加5的结果是:" + result);
}
}
在这个代码里,`add`就是我们定义的方法。`public static`是方法的修饰符,这里的`public`表示这个方法可以被其他类访问,`static`表示这个方法是属于类的,不需要创建类的实例就可以调用。`int`是这个方法的返回类型,表示这个方法会返回一个整数。`add`后面括号里的`int num1, int num2`是方法的参数,就像是你给这个绝技输入的“内力”,这个方法会根据输入的参数进行计算,然后返回结果。
public class KungFuMaster {
// 定义方法:无返回值打招呼
public void sayHello() {
System.out.println("(抱拳)在下Java大侠!");
}
// 带参数和返回值的方法
public String attack(String moveName, int power) {
return "发动招式:" + moveName + "!伤害值:" + power * 10;
}
public static void main(String[] args) {
KungFuMaster master = new KungFuMaster();
master.sayHello();
// 调用方法
String result = master.attack("九阴真经", 5);
System.out.println(result); // 输出:发动招式:九阴真经!伤害值:50
}}
**关键点:**
- `void`:无返回值(发招但没结果)
- `return`:有返回值(发招后告诉你伤害值)
- **参数**:招式名(`moveName`)和内力(`power`)是方法的"弹药"
---
方法的好处可多啦。比如说,要是你有很多地方都需要做加法运算,你就不用每次都写一遍加法的代码,只要调用这个`add`方法就好啦,这就像高手不用每次都重新练一遍绝技,直接使出来就行。
🧠 第二章:面向对象思想(OOP)——武学心法!
> **现实世界 = 万物皆对象**
> 猫是对象,手机是对象,连你昨晚点的外卖小龙虾也是对象!
类与对象详解:相亲界的"造人法则"
> 程序员:"类和对象到底啥关系?" > 月老:"类是你的相亲简历模板,对象是打印出来的100份简历!你海投的每一份都是独立对象!" |
🧬 1. 类:婚介所的"会员档案模板"
**类 = 属性(资料) + 方法(技能)**
public class SingleDog {
// ⭐属性:会员资料(对象的状态)
private String name; // 封装:名字不能随便改!
private int charmLevel = 60; // 初始魅力值60分
public String hobby; // 公开爱好(方便匹配)
// ⭐构造方法:创建对象时初始化
public SingleDog(String name, String hobby) {
this.name = name;
this.hobby = hobby;
System.out.println("【新会员】" + name + " 上线!爱好:" + hobby);
}
// ⭐对象方法:会员行为(依赖具体对象调用)
public void sendFlower(SingleDog target) {
System.out.println("💐 " + name + " 给 " + target.name + " 送花!");
target.charmLevel += 10; // 收到花魅力+10
}
// ⭐封装方法:访问私有属性
public void checkCharm() {
System.out.println(name + "当前魅力值:" + charmLevel);
}
}
```
---
#👨💻 2. 对象:拿着简历的"真实会员"
**对象 = 类实例化 + 独立内存空间**
```java
public class DatingApp {
public static void main(String[] args) {
// 创建三个独立对象(三个相亲会员)
SingleDog zhangsan = new SingleDog("张三", "写代码");
SingleDog lisi = new SingleDog("李四", "打游戏");
SingleDog wangwu = new SingleDog("王五", "逛街");
// ⭐属性操作
zhangsan.hobby = "改bug"; // 修改公开属性
// zhangsan.name = "张老三"; // 报错!private属性不能直接改
// ⭐对象方法调用:会员互动
zhangsan.sendFlower(lisi); // 💐 张三 给 李四 送花!
lisi.checkCharm(); // 李四当前魅力值:70
wangwu.sendFlower(zhangsan); // 💐 王五 给 张三 送花!
zhangsan.checkCharm(); // 张三当前魅力值:70
}
}
```
**内存真相**:
```
张三对象:{name="张三", charmLevel=70, hobby="改bug"}
李四对象:{name="李四", charmLevel=70, hobby="打游戏"}
王五对象:{name="王五", charmLevel=60, hobby="逛街"}
```
---
📞 3. 方法调用:相亲互动指南
(1) 普通方法:必须"有对象才能玩"
```java
// 正确 ✔
zhangsan.sendFlower(lisi);
// 错误 ❌
SingleDog.sendFlower(lisi); // 报错!没对象怎么送花?
```
#### (2) 方法传参:对象间的"秘密传递"
```java
public void secretWhisper(String msg, SingleDog target) {
System.out.println("💌 " + name + " 悄悄告诉 " + target.name + ":" + msg);
}
// 使用:
lisi.secretWhisper("张三秃头是假发!", wangwu);
// 输出:💌 李四 悄悄告诉 王五:张三秃头是假发!
```
---
⚡ 4. 类方法(静态方法):婚介所的"公共服务"
**特点:不依赖对象,直接通过类调用 → 像婚介所的自助服务机**
```java
public class SingleDog {
// ... 其他代码 ...
// ⭐静态属性:全平台会员计数(不属于某个对象)
public static int totalMembers = 0;
// ⭐静态方法:婚介所公共服务
public static void printPlatformRule() {
System.out.println("=== 相亲平台黄金法则 ===");
System.out.println("1. 禁止同时交往8个对象");
System.out.println("2. 约会迟到罚款200元");
}
// 构造方法中更新静态属性
public SingleDog(String name, String hobby) {
// ...初始化...
totalMembers++;
}
}
// 使用:
public class DatingApp {
public static void main(String[] args) {
// 调用静态方法(不需要对象!)
SingleDog.printPlatformRule();
new SingleDog("赵六", "健身");
new SingleDog("钱七", "烹饪");
// 访问静态属性
System.out.println("全平台会员数:" + SingleDog.totalMembers); // 输出5
}
}
```
---
❓ 灵魂拷问:什么时候用静态方法?
> **记住这个场景:**
> 当你需要:
> - 查婚介所规则 → `SingleDog.printPlatformRule()`
> - 统计全平台会员 → `SingleDog.totalMembers`
>
> 而不是:
> - 张三送花 → `zhangsan.sendFlower()`(必须具体对象)
---
💡 终极总结:类与对象三定律
1. **对象是活的,类是死的**
`new SingleDog()` 前,类只是硬盘上一段代码
2. **属性是状态,方法是行为**
魅力值(属性)会变,送花(方法)是动作
3. **静态属于类,非静属于对象**
会员统计(静态)属于平台,送花(非静态)属于个人
> 最后一句相亲忠告:
> **"不要学海王——疯狂new对象却不释放内存(渣男行为)!"**
现在,用类造对象,用对象调方法,开启你的代码相亲之旅吧!💘👩💻
面向对象思想详解:Java世界的"相亲大会"
> 程序员:"为什么OOP这么难懂?" > 老司机:"因为你没发现——写Java代码就像在办相亲大会!" |
🧩 **OOP核心思想:万物皆在相亲**
想象你开了一家**婚姻介绍所**(程序),所有客户都是**对象**(Object),而介绍所的工作手册就是**类**(Class)
// 相亲手册(类)
public class SingleDog {
// 会员基本信息(属性)
private String name; // 封装:隐私信息不公开
private int age; // 只有通过认证才能查看
private String hobby;
// 相亲顾问(构造方法)
public SingleDog(String name, int age, String hobby) {
this.name = name;
this.age = age;
this.hobby = hobby;
System.out.println("【新会员】" + name + "(" + age + "岁)爱好:" + hobby);
}
// 互动方法(行为)
public void sendMessage(String msg) {
System.out.println(name + "悄悄说:" + msg);
}
public void date(SingleDog other) { // 对象交互!
System.out.println("💑 " + name + " 和 " + other.name + " 约会中...");
if (this.hobby.equals(other.hobby)) {
System.out.println("🌟 发现共同爱好:" + hobby + "!匹配成功!");
}
}
}
```
---
🔥 **OOP三大特性:相亲潜规则**
1. 封装(Encapsulation)—— 会员隐私保护
> **就像相亲资料表:**
> - 公开栏:姓名、爱好(`public`方法)
> - 保密栏:年龄、收入(`private`属性)
> - 认证通道:资料审核(`setter/getter`方法)
// 保密操作示例
public class SingleDog {
private int salary; // 绝对保密!
// 认证通道(方法封装)
public void setSalary(int money) {
if (money < 5000) {
System.out.println("❌ 收入不足无法注册会员!");
} else {
this.salary = money;
}
}
public String getSalaryLevel() { // 只透露级别
return (salary > 20000) ? "钻石王老五" : "潜力股";
}
}
// 使用:
SingleDog zhangsan = new SingleDog("张三", 28, "滑雪");
zhangsan.setSalary(8000);
System.out.println("他的等级:" + zhangsan.getSalaryLevel()); // 输出:潜力股
```
---
2. 继承(Inheritance)—— 家族式相亲
> **就像豪门联姻:**
> - 富二代继承家族属性(代码复用)
> - 但可以发展自己的特长(方法重写)
// 豪门家族(父类)
public class RichFamily {
protected String familyCar = "劳斯莱斯";
public void showWealth() {
System.out.println("我家有:" + familyCar);
}
}
// 败家儿子(子类)
public class Playboy extends RichFamily {
private String myCar = "兰博基尼"; // 新增属性
@Override // 炫富升级版!
public void showWealth() {
super.showWealth(); // 先展示家族财产
System.out.println("我自己还有:" + myCar);
}
// 子类特有技能
public void flirt() {
System.out.println("💸 撒币撩妹中...");
}
}
// 使用:
Playboy wang = new Playboy();
wang.showWealth(); // 输出:我家有:劳斯莱斯 \n 我自己还有:兰博基尼
wang.flirt(); // 撒币撩妹中...
```
---
3. 多态(Polymorphism)—— 百变相亲秀
> **就像cosplay约会:**
> - 同一个人扮演不同角色(父类引用指向子类对象)
> - 不同角色有不同行为(方法重写实现多态)
```java
// 相亲角色父类
public class DateRole {
public void rolePlay() {
System.out.println("普通约会模式");
}
}
// 具体角色
class PrinceCharming extends DateRole { // 白马王子
@Override
public void rolePlay() {
System.out.println("🦄 骑马出场:公主跟我走吧!");
}
}
class Zombie extends DateRole { // 丧尸
@Override
public void rolePlay() {
System.out.println("🧟 拖着腿:脑...子...");
}
}
// 相亲现场
public class DatingApp {
public static void main(String[] args) {
DateRole role1 = new PrinceCharming(); // 父类引用指向子类对象
DateRole role2 = new Zombie();
startDate(role1); // 🦄 骑马出场
startDate(role2); // 🧟 拖着腿
}
// 关键:同一方法处理不同对象
public static void startDate(DateRole role) {
role.rolePlay(); // 自动调用具体子类方法!
}
}
```
---
多态在实际开发中的应用场景非常广泛,下面我将结合具体代码示例,用幽默风格讲解几个典型场景:
场景1:支付系统——"一码通付"
产品经理:用户要用支付宝、微信、银行卡支付...
程序员:莫慌!多态来也——一个pay()
方法通吃所有支付方式!
// 支付接口(抽象父类)
interface Payment {
void pay(double amount);
}
// 具体支付方式
class Alipay implements Payment {
@Override
public void pay(double amount) {
System.out.println("支付宝支付:" + amount + "元,扫描二维码!");
}
}
class WechatPay implements Payment {
@Override
public void pay(double amount) {
System.out.println("微信支付:" + amount + "元,出示付款码!");
}
}
class CreditCard implements Payment {
@Override
public void pay(double amount) {
System.out.println("信用卡支付:" + amount + "元,请刷卡签名!");
}
}
// 收银台(多态核心)
class CheckoutCounter {
public void checkout(Payment payment, double amount) {
// 不管什么支付方式,调用同一个pay方法
payment.pay(amount);
}
}
// 使用
public class ShoppingMall {
public static void main(String[] args) {
CheckoutCounter counter = new CheckoutCounter();
Payment alipay = new Alipay();
Payment wechat = new WechatPay();
Payment card = new CreditCard();
// 同一收银接口处理不同支付方式
counter.checkout(alipay, 100.0); // 支付宝支付
counter.checkout(wechat, 200.0); // 微信支付
counter.checkout(card, 999.0); // 信用卡支付
}
}
输出:
支付宝支付:100.0元,扫描二维码!
微信支付:200.0元,出示付款码!
信用卡支付:999.0元,请刷卡签名!
场景2:日志系统——"花式记录"
需求:日志要能输出到控制台、文件、短信、甚至鸽子送信...
多态解法:定义Logger
接口,各种实现随意切换
interface Logger {
void log(String message);
}
// 控制台日志
class ConsoleLogger implements Logger {
@Override
public void log(String message) {
System.out.println("[控制台] " + message);
}
}
// 文件日志
class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("[文件记录] 写入日志文件:" + message);
}
}
// 短信日志(伪代码)
class SMSLogger implements Logger {
@Override
public void log(String message) {
System.out.println("[短信提醒] 发送至管理员:" + message);
}
}
// 鸽子送信日志(没错,就是这么秀)
class PigeonLogger implements Logger {
@Override
public void log(String message) {
System.out.println("🕊️ 鸽子带着纸条飞走,内容:" + message);
}
}
// 业务模块(不关心具体日志方式)
class OrderService {
private Logger logger;
public OrderService(Logger logger) {
this.logger = logger;
}
public void createOrder() {
try {
System.out.println("创建订单业务逻辑...");
logger.log("订单创建成功");
} catch (Exception e) {
logger.log("订单创建失败:" + e.getMessage());
}
}
}
// 使用
public class LogSystem {
public static void main(String[] args) {
// 随时切换日志实现
OrderService service = new OrderService(new PigeonLogger());
service.createOrder();
}
}
多态应用总结:
- 支付系统:统一支付接口处理不同支付渠道
- 日志系统:可插拔的日志实现
多态的精髓:
"写代码时面向接口(父类)编程,运行时执行具体实现(子类)"
💡 **OOP终极法则:对象社交四步曲**
1. **找对象** → `new SingleDog()`
2. **传消息** → `zhangsan.sendMessage("约吗?")`
3. **搞关系** → `lisi.date(zhangsan)`
4. **生新对象** → 生个`BabyDog`(新对象)
// 对象社交实战
public class DatingSimulator {
public static void main(String[] args) {
// Step1: 找对象
SingleDog lisi = new SingleDog("李四", 25, "代码");
SingleDog wangwu = new SingleDog("王五", 30, "旅游");
// Step2: 传消息
lisi.sendMessage("听说你也喜欢Java?");
wangwu.sendMessage("不,我只爱Python!");
// Step3: 搞关系
lisi.date(wangwu); // 💑 李四 和 王五 约会中...
// ❌ 共同爱好匹配失败!
// Step4: 生新对象(业务扩展)
BabyDog baby = new BabyDog("Java小崽");
baby.cry(); // 👶 哇~我要学OOP!
}
}
class BabyDog {
public BabyDog(String name) {
System.out.println("🎉 新对象诞生:" + name);
}
}
```
---
🌟 **OOP哲学总结**
> 用相亲视角理解面向对象:
> - **类** = 相亲档案模板
> - **对象** = 真实相亲会员
> - **封装** = 资料隐私保护
> - **继承** = 豪门家族联姻
> - **多态** = cosplay角色扮演
最后送你一句相亲(编程)箴言:
> **"不要当舔狗——反复new对象却不保留引用(广撒网重点捕捞)!"**
现在,用面向对象的思想去组织你的代码相亲大会吧!💘👩💻👨💻好了,Java江湖的小菜鸟们,今天咱们就学到这里。掌握了方法的定义、面向对象思想和类与对象的知识,你们就已经迈出了成为“大侠”的重要一步。继续加油,在Java江湖中不断修炼,相信你们很快就能成为一代宗师!