一、面向对象
面向过程:
主要以结果为导向的思想,至于中间过程的设计不着重考虑,
在整个程序的维护性、可读性、可拓展性都会较差。
- 黑猫白猫抓到老鼠就是好猫
面向对象:
主要以问题的个体角度思考问题,从个体本身(对象)出发,
赋予当前这个个体一些属性和方法,让它自己拥有解决问题的能力。
- 授人以鱼不如授人以渔
我开车
二、面向对象的三大基本特征
封装:将该隐藏的隐藏,该暴露的暴露
在java程序中,是依靠类和方法的方法实现一个个体的封装的(权限限定符 + 包路径)。
继承:是Java中代码复用的重要手段(子类可以调用父类的部分属性和方法),在于为多态奠定了基础。
在java程序中,有另一种代码复用的重要手段,叫做组合。
什么是组合?
class A{
private B b = new B();
b.xxxxx();
}
思考:什么时候该用继承?什么时候该用组合?
需要判断两个类的关系:
如果是"is-a"(是一个)的关系,就需要用继承
如果是"has-a"(有一个)的关系,就需要用组合
多态:一个对象有两种类型,编译时类型和运行时类型,一旦这个对象的编译时类型和运行时类型不同时,就发生了所谓的多态
什么是编译时类型,什么是运行时类型?
A obj = new A();
A就是编译时类型
A就是运行时类型
父类的变量 指向 子类的对象 -> 多态
多态有什么用?
多态是为了提高了代码的维护性(继承保证)
提高了代码的扩展性
三、面向对象实战
/**
从前有一对兔子,到第3个月大时,每过一个月生一对兔子,小兔子到第3个月后,
每过一个月又会生一对兔子,假设兔子都不死,请问第10个月共有多少对兔子?
*/
public class Main1 {
public static void main(String[] args) {
//模拟一个兔笼
List<Rabbit> rabbits = new ArrayList<>();
//模拟10个月中兔子生崽的行为
for (int i = 1; i <= 10; i++) {
if(i == 1){
//第一个月需要往兔笼中添加一对兔子
rabbits.add(new Rabbit());
} else {
//以后,每个月都尝试让兔子生崽
List list = new ArrayList(rabbits);
for (Rabbit rabbit : new ArrayList<>(rabbits)) {
//兔子每个月都要涨岁
rabbit.addAge();
//再让每个兔子尝试生崽
Rabbit son = rabbit.son();
//如果生出了小兔子 就放入兔笼
if(son != null){
rabbits.add(son);
}
}
}
}
System.out.println("10个月后兔子的对数:" + rabbits.size());
}
}
/**
兔子类
*/
class Rabbit{
/**
兔子的属性
*/
private int age = 1;//月龄
/**
兔子的行为
*/
public void addAge(){
this.age++;
}
/**
生崽的行为
*/
public Rabbit son(){
if(age >= 3) {
return new Rabbit();
}
return null;
}
}