1 封装
即隐藏对象的属性和实现细节,仅对外公开接口。例如,我们将类的属性定义为private,只提供给用户使用属性的public方法。
作用:(1)更安全的访问 (2)提供统一的访问接口
2 继承
继承就是子类继承父类的特征和行为。
最重要的是能够实现多态。
3 多态
接口的多种不同的实现方式即为多态。简单来说,即一个对象具有不同的形态。
Animal a=new Bird();
鸟这个对象具有动物形态。
Bird b=new Bird();
鸟这个对象具有鸟形态。
3.1 多态的两个重要的原则
(1)子类可以当作父类对象来看,我们一旦这样做了,那么子类就只能使用父类的方法和属性。
Animal a=new Bird();编译器会主观的认为Bird对象是Animal,如果让a使用鸟的方法a.sing(),编译会出错
(2)如果子类覆盖了父类的方法,我们把子类当作父类对象来看,去调用这个方法的时候,调用的是子类的方法。我们知道编译器主观的认为Bird是动物,但是,运行的时候JVM(上帝)是具体的知道鸟这个对象就是鸟。
我们知道鸟吃虫子,狮子吃肉这种自然规律。我们让鸟吃肉,狮子吃虫子是实现不了的。因此,鸟和狮子类都重写了eat(),JVM会主动调用子类的eat()。
3.2 子类如何获取父类形态
JAVA提供了语法规则:(1)任何子类都有构造方法 (2)任何子类生成对象都要调用父类的构造方法
子类对象使用了父类的一些属性和方法,因此,必须通过父类的构造函数来初始化。子类对象也因此获得了父类的形态。
4 接口和抽象类的区别
区别:
(1)接口没有构造方法,而抽象类有构造方法
(2)接口可以多继承,而抽象类只能单继承
(3)接口中的方法都是抽象的,而抽象类中的部分方法是可以在抽象类中是实现的。
(4)子类实现了接口,那么子类必须实现接口中提供的所有方法。而抽象类中的方法,可以在抽象类中默认实现,也可以在子类中继续定义为抽象方法。
简单来说,抽象类是亲爹,而接口是干爹。亲爹只有一个,而干爹可以有多个。子类既可以继承亲爹的财产,也可以继承干爹的财产。但是,亲爹和干爹的有个本质的区别,那就是血缘关系,这种血缘关系是通过构造方法来体现的。子类对象的创建必须调用父类的构造方法。