面向对象的三大特征,封装继承多态的个人理解以及代码分析
Posted ggyc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象的三大特征,封装继承多态的个人理解以及代码分析相关的知识,希望对你有一定的参考价值。
面向过程:我们以前使用的是面向过程编程,你需要清除每个实现步骤,每个步骤每行代码都要仔仔细细的编写,
不知道过程就找不到结果,找到实现过程就可以得到实现结果。
例如: 我们在外打工租房子,我们需要了解每个每个房屋的出租信息,不然是找不到房子的。
面向对象:对象帮我们做事情,找到对应的对象我们就可以得到想要的结果。
例如: 我们找房子不在如此的繁琐,只要找到中介我们就不怕没有地方住,中介会帮你找房子,你只需支付对应的服务费即可。
面向对象的三大特征给我们带了巨大的好处,下面我们就来讲解一下。
1.什么是封装?
1.1 封装是面向对象的三大特征之一。
1.2 它就是把细节信息封装起来,对外提供操作它的对应的方法。
例如:就像一辆车,你从来不关心它是怎么建造的,你只需要懂怎么操作它就可以了。
2.怎么实现封装
2.1 封装的实现方式就是将你需要封装属性提到一个公共的类中,
将属性私有化,对外提供setter,getter方法,对需要重复使用的实现过程进行抽取为方法。
3.封装的好处
3.1 封装使整个软件开发复杂度大大降低。
3.2 将需要重复使用的实现过程进行封装,提高代码的重用性。
3.3 你只需找到其对应的方法即可,无需关系它是怎么实现的。
3.4 私有化数据将数据隐藏,对无需安全考虑的数据通过setter,getter往外提供,对需要考虑安全问题的数据进行私有化。
3.5 你可以对其参数进行限定,适应你的业务范围。
例如:就像年龄一样,你声明的参数类型为int,int是可以为负值的,
但是在我们的现实生活中,
年龄是没有负值的,这时你可以将年龄对应的setter方法内添加一个
if-else if-else来限制它的范围
1 package com.jq; 2 3 /** 4 * 封装 5 */ 6 public class PackageDemo { 7 /** 8 * 将抽象的事物共有的属性进行私有化 9 */ 10 private String name; 11 private int age; 12 /** 13 * 将不需要对外提供的属性进行私有化。 14 */ 15 private String phone; 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 /* 29 可以对传入参数进行限定来适应业务需求 30 */ 31 public void setAge(int age) { 32 if(age<0){ 33 this.age = 1; 34 }else if(age>1000){ 35 this.age=1000; 36 }else{ 37 this.age = age; 38 } 39 } 40 41 /* 42 * 无需关注代码细节,只需调用即可 43 */ 44 public void eat(){ 45 System.out.println("吃东西"); 46 } 47 /* 48 提高代码的重用性 49 */ 50 public Object add(Double numa,Double numb){ 51 return numa+numb; 52 } 53 54 public static void main(String[] args) { 55 //直接调用方法实现功能,降低了代码的复杂度,也无需关系代码的实现过程 56 System.out.println(new PackageDemo().add(1d,2d)); 57 } 58 }
1.什么是继承
1.1 继承就是将共有特征或者行为进行向上抽取,将其共有的东西进行实现或者抽象化。
例如:小明跟小丽都有年龄、性别和名字,人类也有这三个特征,
人类的范畴比小明小丽这个特有个体的范围大,所以可以将年龄、
性别和名字这三个特征向上抽取。
小明跟小丽都是人,都有吃东西这个功能,所以可以向上抽取,
但是小明可能是南方人,小丽可能是北方人,一个是吃面食,一个是吃水稻的。
所以可以将这个共有的行为抽象化。让小明小丽这个特有的个体来进行实现。
2.怎么样继承
2.1 只需将共有的特征或者行为封装为对象,然后使用extends这个关键字进行继承即可。
如有抽象方法需要对抽象方法进行实现。
3.继承的好处
3.1 继承的好处是对共有的属性或者行为进行向上提取,降低了代码的复杂度。
3.2 继承为实现多态提供了前提,没有继承就没有多态。
4.注意事项
4.1 继承时子类共有方法会覆盖父类的共有方法。
例如:子类父类都有吃东西的方法,子类是吃饭,而父类是吃东西,
在使用多态类创建对象( Fu fu = new Zi() )时,调用eat方法是时,会是吃东西而不是吃饭。
4.2 继承时子类属性不会覆盖父类的属性。
package com.jq; /** * 继承 */ abstract class human { //抽取共有特征 String name; int age; //抽取共有方法,特有行为让其子类实现 public abstract void eat(); @Override public String toString() { return "human{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } } class XiaoMing extends human{ public XiaoMing() { super.name="小明"; super.age=25; } public void eat() { System.out.println("吃面"); } } class XiaoLi extends human{ public XiaoLi() { super.name="小丽"; super.age=18; } public void eat() { System.out.println("吃面"); } } public class ExtendsDemo { public static void main(String[] args) { System.out.println(new XiaoMing()); System.out.println(new XiaoLi()); } }
1.什么是多态
1.1 多态就是同一个事物但是他具有多种形态。
例如: 一只二哈,二哈是一只狗,二哈是犬科动物,二哈是一直动物,这就是多态。
2.怎么实现多态
2.1 只需具有继承关系,然后进行类型转换即可。
3.多态的好处
3.1 多态切换多种形态来使用特有的方法。
4.多态的弊端
4.1 只能使用本形态下的属性和方法。
4.2 如果在使用数组或者没有使用泛型的集合内的对象时,需要用到子类特有的方法,必须用instanceof这个关键字来进行类型判断,
否则有可能会出现ClassCastException这个异常。
package com.jq; /** * 多态 */ class Dog { String name="二哈"; public void call(){ System.out.println("汪汪汪汪"); } } class erha extends Dog { public void eat(){ System.out.println("吃的一手好狗粮"); } } class xiaomao { public void call(){ System.out.println("喵喵喵"); } } public class PolymorphicDemo { public static void main(String[] args) { Object[] animal = {new erha(),new xiaomao()}; for (Object o : animal) { /*Dog dog =(Dog)o; dog.call(); 以上代码会抛异常 java.lang.ClassCastException: com.jq.xiaomao cannot be cast to com.jq.Dog */ if(o instanceof Dog){ Dog dog =(Dog)o; dog.call(); }else if(o instanceof xiaomao){ xiaomao cat =(xiaomao)o; cat.call(); } } } }
以上是关于面向对象的三大特征,封装继承多态的个人理解以及代码分析的主要内容,如果未能解决你的问题,请参考以下文章