Java类和对象的使用
对象
就是从一类事物中抽象出来的对象
这里我们将狗抽象出来为一个对象
每个对象都会有对应的信息,这些是属于静态的,称为属性
而每个对象不止这些简单的属性,还有依赖于属性的行为动作称为方法
这里我们可以看到狗所对应的属性及动作
类
我们不能将一个具体的对象执委成一个类,例如一只狗不能将其称之为狗类,狗也有很多的品种,品种的不同,可能行为,属性等等也会有所不同,所以类只是共通属性和行为的一类事物,类其实可以看作是对象的载体
而将这些封装起来也就成了一个类
面向对象三大特性:
- 封装
- 继承
- 多态
封装
将数据(行为和方法)封装在一起,尽可能隐藏其实现的细节,只对外提供一些可以操作数据的接口。
就像我们可以只需要知道手机是怎么用就可以,而不需要去知道它是怎么去实现的
继承
继承可以利用特定对象之间的共有属性对现有类基础之上进行扩展,可以获得超类的除private的所有属性和方法。
例如所有的Animal都有eat()这个行为,那么但我们定义狗、猫等等类的时候如果没有特别需求的话就可以不用重写该方法,而使用动物这个超类中的eat()方法,再在狗、猫类中继续扩展属于自己独有的属性和行为
上面这个图 可以很明显的看到作为动物 eat()行为(当然这里可以去重写父类的eat()方法,毕竟每个动物吃的都不一样)是所有动物共有的,所以我们可以共用父类的方法来实现复用,而不用在基类中再写一个eat()方法。每个动物的行为方法上也有所不同。
多态
多态可以分为运行时多态和编译时多态
- 编译时多态指方法的重载(静态绑定,在程序编译期间就已经确定类型)
- 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定(动态绑定,运行时确定类型)
运行时多态有三个条件:
- 继承
- 覆盖(重写)
- 向上转型
综上其实就是将子类类型的指针指向父类类型的指针
当覆盖父类方法后,父类根据运行时赋值的子类指针来调用
在多态机制中最好的实现便是接口,这样一个接口规定了一个统一风格。子类只需要对应自己类来实现其中的细节,当需要维护的时候只需要修改接口中的方法即可,会大大的降低维护成本,也就是后面会接触到的面向接口编程
例子:
import java.util.ArrayList;
import java.util.List;
public class Animal{
private String name;
public void eat() {
System.out.println("动物类吃东西");
}
public static void main(String[] args) {
List<Animal> animalList = new ArrayList();
animalList.add(new Cat());
animalList.add(new Dog());
/**
* 猫类吃东西
* 狗类吃东西
*/
for (Animal animal : animalList) {
animal.eat();
}
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫类吃东西");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗类吃东西");
}
}