面向对象编程:从“人类观察学”到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骚操作!