《Java学习大冒险:从菜鸟到“大侠”之路》03

《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、方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错。方法定义时,多个参数之间使用逗号(,)分隔

  1. 方法调用时,参数的数量与类型必须与方法定义中的形参相匹配,否则程序将报错

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();
    }
}

多态应用总结:
  1. 支付系统:统一支付接口处理不同支付渠道
  2. 日志系统:可插拔的日志实现

多态的精髓:
"写代码时面向接口(父类)编程,运行时执行具体实现(子类)"

 💡 **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江湖中不断修炼,相信你们很快就能成为一代宗师! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面向Bug编程大师007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值