chapter1 -- 对象导论

基本内容:

  • 对象
  • 面向对象的基本特征
  • 继承
  • 多态
  • 封装

1 对象

简单的描述为:具有相同的行为,状态和标识的事物抽象成为一类,而对象是类的具体实例。
猫,狗都是动物,他们也拥有很多相同的状态(如,名称)和行为(如,吃)。这样我们可以以此来抽象出Animal类,代码如下:

//实例化Animal对象后的地址就是他的标识
public class Animal {
    protected String animalName;//属性(状态)

    public void eat() {//方法(行为)
        System.out.println("动物正在吃东西");
    }
}

2 面向对象的基本特征

2.1 基本特征:

  • 继承:继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
  • 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
  • 多态:同一操作用于不同的对象,可以有不同的解释,产生不同的执行结果。

2.2 五个基本原则:

  • 单一职责原则(SRP,Single Responsibility Principle):指类的功能要单一,不可能包含所有东西。
  • 开放封闭原则(OCP,Open-Close Principle):一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
  • 替换原则(LSP,Liskov Substitution Principle):子类应当可以替换父类并出现在父类能够出现的任何地方。
  • 依赖原则(DIP,Dependency Inversion Principle):具体依赖抽象,上层依赖下层。
  • 接口分离原则(ISP, Interface Segregation Principle):模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。

以上内容引用自网络。

3 继承

Animal是多种多样的,我们身边常见的有Cat和Dog,它们都属于Animal,但它们是Animal的一个子类,它们和Animal有相同的状态和行为,但是也有自身独特的状态和行为。
举个例子,猫爱吃鱼,狗爱啃骨头,在Java中我们可以写如下代码:

public class Cat extends Animal {
    //虽然没有显示的声明animalName和eat()方法,但是子类仍旧可以使用父类中可供访问成员变量和方法。
    //但是父类无法使用子类中的成员变量和方法

    //Cat类独有的方法
    public void eatFish(){
        System.out.println("猫正在吃鱼");
    }
}

注意:Java是单根继承结构,也就是说子类只能继承一个父类。

4 多态

Java中实现多态的方法有两种:
- 覆盖(重写):指子类重新定义父类中的方法。
- 重载:指允许有多个重名方法,而这些方法的参数列表不同(参数类型,参数个数有一个以上不同)。
我们来重新定义下Cat类,并添加Dog类,代码如下

public class Cat extends Animal {
    //Cat类覆盖了父类的eat()方法
    public void eat(){
        System.out.println("猫正在吃鱼");
    }
}

public class Dogextends Animal {
    //Cat类覆盖了父类的eat()方法
    public void eat(){
        System.out.println("狗正在啃骨头");
    }
}

接下来我们在方法中调用:

public class TestPolymorphism {
    public static void main(String[] args)(){
        Animal  cat = new Cat();
        Animal  dog = new Dog();

        cat.eat();
        dog.eat();
    }
}

可以观察下控制台的输出。

5 封装

举个例子说明下,具体概念不在讲解。
我们改写下Animal 类,代码如下:

public class Animal {
    private String animalName;

    public String getAnimalName() {
        return animalName;
    }

    public void setAnimalName(String animalName) {
        this.animalName = animalName;
    }    
}

我们将animalName属性设置为private,外部无法看见。但是我们想使用Animal 的animalName怎么办呢?
可以看出我们同时提供了两个方法,getter方法和setter方法,我们可以通过这两个方法获取或者设置animalName。

6.结语

书中这一张其实还介绍了很多内容,但并不是主要内容,而且书中后面的章节也会详细讲解,再次就不多做赘述。
在这片笔记中先简单的介绍下如何抽象出对象,以及面向对象的三大特征和五个基本原则,概念性东西偏多,所以显得很无聊,但是这些又是面向对象编程语言的基础,所以,无论如何还是要理解透彻。

你可能感兴趣的:(《Thinking,in,Java》读书笔记,Java)