面向对象编程:从“人类观察学”到Java世界的奇幻冒险

170 阅读5分钟

面向对象编程:从“人类观察学”到Java世界的奇幻冒险

“世界是由什么构成的?”
物理学家说是原子,化学家说是元素,画家说是颜色,而程序员说:世界是由类和对象构成的!

一、万物皆对象,程序员的世界观

如果你是个Java开发者,恭喜你,你已经自动获得了“分类学家”称号。你看,植物类、动物类、哺乳类、爬行类……这不就是我们写代码时的“类”嘛!

是什么?它是你脑海中对一类事物的抽象,比如“人类”这个类。
对象又是什么?它是你身边的张三、李四、王麻子,是类的具体实例。

面试官:类和对象是什么关系?
你:类是对象的模板,对象是类的一个实例。
面试官:你很有对象!(不是这个意思)

二、如何优雅地“造人”——类的定义

在Java里,定义一个类就像造人:

  • 属性:姓名、性别、身份证号(静态特征)
  • 方法:学习、吃饭、打游戏(动态特征)
public class Person {
    String name;
    String gender;
    String id;
    void eat() { ... }
    void playGame() { ... }
}

你看,代码和生活一样简单(才怪)。

三、属性、方法和访问修饰符的“江湖规矩”

Java的世界里,访问修饰符就像武林门派的规矩:

  • public:谁都能用,江湖公开课
  • protected:自己人和亲戚能用(同包、子类)
  • 默认(省略):同村的能用(同包)
  • private:自家小黑屋,谁都别想进

面试官:四种访问修饰符的区别?
你:本类、同包、子类、其他,谁能用一目了然!

四、构造方法:对象的“出生证明”

每个对象出生都要有个“出生证明”——构造方法。
构造方法的名字必须和类名一样,不能有返回值(连void都不行),可以重载(参数不同即可)。

public class Student {
    String name;
    int age;
    public Student() { ... }
    public Student(String name) { ... }
    public Student(String name, int age) { ... }
}

Java的构造方法就像开盲盒,参数不同,出生体验也不同。

五、this和super:家族里的“我”和“我爸”

  • this:当前对象自己
  • super:我的“亲爹”——父类对象

this可以用来区分“我”和“别人”,比如局部变量和成员变量重名时,this.name就是“我”的名字。

super则用来“继承家业”,比如调用父类的构造方法或属性。

注意:this()和super()只能在构造方法的第一行出现,毕竟“出生”只能有一次,不能反复横跳。

六、static:全村共享的“村口大喇叭”

static修饰的属性和方法,属于“全村共享”,不管你new多少个对象,大家都用同一个。

  • 静态属性:类变量,省内存
  • 静态方法:类方法,可以直接用“类名.方法名”调用
  • 静态代码块:类加载时执行一次,适合初始化“村规民约”

面试官:static有什么用?
你:省内存、方便调用、全村共享,谁用谁知道!

七、三大特性:封装、继承、多态

1. 封装:给数据穿上“防弹衣”

属性私有化(private),对外提供get/set方法。
这样别人不能随便改你家“存款”,必须走“银行窗口”。

public class Phone {
    private String type;
    public void setType(String type) { ... }
    public String getType() { ... }
}

2. 继承:代码复用的“家族企业”

extends关键字继承父类,子类自动拥有父类的非私有资源。
Java只支持单继承,但可以多重继承(爷爷、爸爸、我)。

public class Animal { ... }
public class Dog extends Animal { ... }

3. 多态:同一个接口,不同的“表演”

父类引用指向子类对象,调用同名方法时,执行的是子类的实现。

Animal a = new Dog();
a.eat(); // 实际执行Dog的eat方法

多态就像“变形金刚”,同一个外壳,不同的灵魂。

八、抽象类和接口:规范与约定的“祖师爷”

1. 抽象类

  • 不能实例化
  • 可以有普通属性、方法和构造方法
  • 有抽象方法必须是抽象类,抽象类不一定有抽象方法
public abstract class Animal {
    public abstract void eat();
}

2. final关键字

  • 修饰类:不能被继承
  • 修饰方法:不能被重写
  • 修饰属性:常量,赋值后不能改

面试官:abstract和final能一起用吗?
你:不能,一个让你重写,一个不让你重写,矛盾体!

3. 接口

  • 关键字interface
  • 所有属性默认public static final
  • 所有方法默认public abstract
  • 支持多继承(接口和接口),类和接口是“多实现”
public interface USB {
    void connect();
}
public class Mouse implements USB {
    public void connect() { ... }
}

JDK 1.8后,接口还能有静态方法和默认方法,简直“逆天”!

九、函数式接口和Lambda表达式:Java的“骚操作”

  • 函数式接口:只包含一个抽象方法的接口,用@FunctionalInterface标注
  • Lambda表达式:简化匿名内部类写法,代码更优雅
@FunctionalInterface
public interface MyFunction {
    void test();
}

MyFunction f = () -> System.out.println("Hello Lambda!");
f.test();

还能用方法引用:

MyFunction f = System.out::println;

Lambda表达式让Java也能“装一把Python的文艺范儿”。

十、结语:面向对象,人生如戏

面向对象编程就像人生:

  • 你有属性(身高、体重、余额)
  • 你有方法(吃饭、睡觉、打豆豆)
  • 你有家族(继承)
  • 你有多重身份(多态)
  • 你有规矩(封装)
  • 你有祖训(抽象类、接口)

学会面向对象,代码世界任你遨游。下次面试官再问你“类和对象的关系”,你就可以自信地说:“类是对象的模板,对象是类的实例。就像我妈是我模板,我是她的实例——不过我比她更会写代码!”


如果你觉得这篇文章有趣又有用,欢迎点赞、收藏、关注我!以后带你解锁更多Java骚操作!