面向对象具有:继承、封装、和多态 3 个核心特性。
1、封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
2、继承
提高代码复用性。
3、多态
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,提高了程序的拓展性。
封装
1.封装定义
在面向对象程式设计方法中,封装(Encapsulation)隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
封装最主要的作用在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。
2.封装特性
- 良好的封装能够减少耦合;
- 类内部的结构可以自由修改;
- 可以对成员变量进行更精确的控制;
- 隐藏信息,实现细节。
3.封装实现
1)修改属性的可见性来限制对属性的访问(一般限制为 private);
/** * 面向对象封装 * @author mikechen * */ public class Person { private String name; private String phone; }
可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏,java提供了三种访问权限,准确的说还有一种是默认的访问权限,加上它一共四种:
- private 在当前类中可访问
- default 在当前包内和访问
- protected 在当前类和它派生的类中可访问
- public 公众的访问权限,谁都能访问
2)对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问。
/** * 面向对象封装 * @author mikechen * */ public class Person { private String name; private String phone; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
4.封装总结
java是面向对象的语言,为了让类的内部数据不被随意的访问修改,我们会用private访问修饰符对成员变量进行修饰。
例如我们经常看见的实体类,然后提供getter、setter方法,这样外部就不能直接访问该类的成员变量了,只能通过get、set方法访问。
总的来说封装就是我们用权限修饰符private对其方法和成员变量进行修饰,不让外部随意访问。
继承
1.继承定义
继承性是面向对象的第二大主要特征,继承就是子类继承父类的特征和行为,使得子类对象具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2.继承特性
- 子类拥有父类非 private 的属性、方法;
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展;
- 子类可以用自己的方式实现父类的方法;
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
3.继承实现
现实中的例子:狗和猫都是动物,如果将狗、猫作为类,它们可以继承动物类很多的共同特性和行为。
1)动物类
/** * 面向对象:继承 * @author mikechen * */ class Animal{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } }
2)狗类
/** * 面向对象:继承 * @author mikechen * */ class Dog{ private String name; private String sound; public void setName(String name){ this.name = name; } public void setSound(String sound){ this.sound = sound; } public String getName(){ return this.name; } public String getSound(){ return this.sound; } }
3)引入继承
/** * 面向对象:继承 * @author mikechen * */ class Animal{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } } class Dog extends Animal{} public class Test{ public static void main(String[] args){ Dog dog= new Dog(); dog.setName("狗"); System.out.println(dog.getName()); } }
我们可以看出,子类可以在不扩展操作的情况下,使用父类的属性和功能。
多态
1.多态定义
多态(Polymorphism)按字面的意思就是“多种状态”,在面向对象语言中,接口的多种不同的实现方式即为多态。
2.多态特征
- 减耦合;
- 增强可以替换性;
- 可扩展性;
- 灵活性等。
3.多态实现
使用多态必须满足三个必要条件。
- 继承
- 重写
- 父类引用指向子类
现实中的例子:举一个手机扫码支付的例子,二维码并不知道客户是通过何种方式进行支付,只有通过二维码后才能判断是走哪种支付方式执行对应流程。
/** * 面向对象:多态 * @author mikechen * */ public abstract class Pay { abstract public String pay(); } /** * 支付宝支付 */ public class AliPay extends Pay { @Override public String pay() { System.out.println("支付宝pay"); return "success"; } } /** * 微信支付 */ public class WeixinPay extends Pay { @Override public String pay() { System.out.println("微信Pay"); return "success"; } } public static void main(String[] args) { /** * 支付宝支付多态应用 */ Pay pay = new AliPay(); pay.pay(); /** * 微信支付多态应用 */ pay = new WeixinPay(); pay.pay(); }
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》