范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

面向对象编程三大特性封装继承多态

  一、封装
  封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。
  对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。使用封装有三大好处:1、良好的封装能够减少耦合。
  2、类内部的结构可以自由修改。
  3、可以对成员进行更精确的控制。
  4、隐藏信息,实现细节。
  封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。 public class Husband {              /*       * 对属性的封装       * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性       */       private String name ;       private String sex ;       private int age ;       private Wife wife;              /*       * setter()、getter()是该对象对外开发的接口       */       public String getName() {           return name;       }          public void setName(String name) {           this.name = name;       }          public String getSex() {           return sex;       }          public void setSex(String sex) {           this.sex = sex;       }          public int getAge() {           return age;       }          public void setAge(int age) {           this.age = age;       }          public void setWife(Wife wife) {           this.wife = wife;       }   }
  封装可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。就可以对成员变量进行更精确的控制。  public void setAge(int age) {        if(age > 120){            System.out.println("ERROR:error age input....");    //提示错误信息        }else{            this.age = age;        }    }   public String getSexName() {            if("0".equals(sex)){                sexName = "女";            }            else if("1".equals(sex)){                sexName = "男";            }            else{               sexName = "人妖";            }            return sexName;        }  二、继承
  2.1 继承综述
  继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
  继承所描述的是"is-a"的关系,如果有两个对象A和B,若可以描述为"A是B",则可以表示A继承B,其中B是被继承者称之为父类或者超类,A是继承者称之为子类或者派生类。
  实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。例如猫有抓老鼠、爬树等其他动物没有的特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫就是这个道理,其实对于这个我们将其称之为"向上转型"。
  诚然,继承定义了类如何相互关联,共享特性。对于若干个相同或者相识的类,我们可以抽象出他们共有的行为或者属相并将其定义成一个父类或者超类,然后用这些类继承该父类,他们不仅可以拥有父类的属性、方法还可以定义自己独有的属性或者方法。
  同时在使用继承时需要记住三句话:1、子类拥有父类非private的属性和方法。
  2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3、子类可以用自己的方式实现父类的方法。(以后介绍)。
  学习继承一定少不了这三个东西: 构造器、protected关键字、向上转型
  2.2 构造器
  通过前面我们知道子类可以继承父类的属性和方法,除了那些private的外还有一样是子类继承不了的---构造器。对于构造器而言,它只能够被调用,而不能被继承。 调用父类的构造方法我们使用super()即可。
  构建过程是从父类"向外"扩散的,也就是从父类开始向子类一级一级地完成构建。而且我们并没有显示的引用父类的构造器,这就是java的聪明之处:编译器会默认给子类调用父类的构造器。
  但是,这个默认调用父类的构造器是有前提的:父类有默认构造器。如果父类没有默认构造器,我们就要必须显示的使用super()来调用父类构造器,否则编译器会报错:无法找到符合父类形式的构造器。
  对于子类而已,其构造器的正确初始化是非常重要的,而且当且仅当只有一个方法可以保证这点:在构造器中调用父类构造器来完成初始化,而父类构造器具有执行父类初始化所需要的所有知识和能力。
  对于继承而言,子类会默认调用父类的构造器,但是如果没有默认的父类构造器,子类必须要显示的指定父类的构造器,而且必须是在子类构造器中做的第一件事(第一行代码)。
  2.3 protected关键字
  private访问修饰符,对于封装而言,是最好的选择,但这个只是基于理想的世界,有时候我们需要这样的需求:我们需要将某些事物尽可能地对这个世界隐藏,但是仍然允许子类的成员来访问它们。这个时候就需要使用到protected。
  对于protected而言,它指明就类用户而言,他是private,但是对于任何继承与此类的子类而言或者其他任何位于同一个包的类而言,他却是可以访问的。
  2.4 向上转型
  在上面的继承中我们谈到继承是is-a的相互关系,猫继承与动物,所以我们可以说猫是动物,或者说猫是动物的一种。这样将猫看做动物就是向上转型。 public class Person {       public void display(){            System.out.println("Play Person...");       }              static void display(Person person){            person.display();       }    }       public class Husband extends Person{        public static void main(String[] args) {            Husband husband = new Husband();           Person.display(husband);      //向上转型        }    }
  在这我们通过Person.display(husband)。这句话可以看出husband是person类型。
  将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。这就是为什么编译器在"未曾明确表示转型"活"未曾指定特殊标记"的情况下,仍然允许向上转型的原因。
  2.5 谨慎继承
  在这里我们需要明确,继承存在如下缺陷:1、父类变,子类就必须变。
  2、继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。
  3、继承是一种强耦合关系。
  所以说当我们使用继承的时候,我们需要确信使用继承确实是有效可行的办法。那么到底要不要使用继承呢?《Think in java》中提供了解决办法:问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。 三、多态
  3.1 多态综述
  所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
  所以对于多态我们可以总结如下:
  指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。
  对于面向对象而言,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
  3.2 多态的实现条件
  在刚刚开始就提到了继承在为多态的实现做了准备。子类Child继承父类Father,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Father对象,也可以处理子类Child对象,当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。
  Java实现多态有三个必要条件:继承、重写、向上转型。
  继承:在多态中必须存在有继承关系的子类和父类。
  重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
  只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
  对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
  3.3 实现形式
  在Java中有两种形式可以实现多态:继承和接口。
  3.2.1、基于继承实现的多态
  基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。
  基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。
  如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。这样我们就可以使用顶层类提供的统一接口来处理该层次的方法。
  3.2.2、基于接口实现的多态
  继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。
  在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。
  继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。
  3.2.3、经典实例分析public class A {       public String show(D obj) {           return ("A and D");       }          public String show(A obj) {           return ("A and A");       }       }      public class B extends A{       public String show(B obj){           return ("B and B");       }              public String show(A obj){           return ("B and A");       }    }      public class C extends B{      }      public class D extends B{      }      public class Test {       public static void main(String[] args) {           A a1 = new A();           A a2 = new B();           B b = new B();           C c = new C();           D d = new D();                      System.out.println("1--" + a1.show(b));           System.out.println("2--" + a1.show(c));           System.out.println("3--" + a1.show(d));           System.out.println("4--" + a2.show(b));           System.out.println("5--" + a2.show(c));           System.out.println("6--" + a2.show(d));           System.out.println("7--" + b.show(b));           System.out.println("8--" + b.show(c));           System.out.println("9--" + b.show(d));             }   }
  运行结果:
  分析如下:
  ①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是"B and B"呢?
  当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)
  在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
  上面程序中的A,B,C,D存在如下关系:
  分析4:
  a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A"。
  分析5:
  a2.show(c),a2是A类型的引用变量,所以this就代表了A,a2.show(c),它在A类中找发现没有找到,于是到A的超类中找(super),由于A没有超类(Object除外),所以跳到第三级,也就是this.show((super)O),C的超类有B、A,所以(super)O为B、A,this同样是A,这里在A中找到了show(A obj),同时由于a2是B类的一个引用且B类重写了show(A obj),因此最终会调用子类B类的show(A obj)方法,结果也就是B and A。
  分析8:
  b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show((super)O),this为b,O为C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),输出为"B and B"。
  按照同样的方法我也可以确认其他的答案。
  当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这我们用一个例子来说明这句话所代表的含义:a2.show(b);
  这里a2是引用变量,为A类型,它引用的是B对象,因此按照上面那句话的意思是说有B来决定调用谁的方法,所以a2.show(b)应该要调用B中的show(B obj),产生的结果应该是"B and B",但是为什么会与前面的运行结果产生差异呢?这里我们忽略了后面那句话"被调用的方法必须是在超类中定义过的",那么show(B obj)在A类中存在吗?根本就不存在!所以这句话在这里不适用?那么难道是这句话错误了?非也!其实这句话还隐含这这句话:它仍然要按照继承链中调用方法的优先级来确认。所以它才会在A类中找到show(A obj),同时由于B重写了该方法所以才会调用B类中的方法,否则就会调用A类中的方法。
  说明:所有的面试题目都不是一成不变的,特别是像一线大厂,上面的面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(777)领取,祝大家更上一层楼!!
  原文作者:jianyuerensheng
  原文出处:https://blog.csdn.net/jianyuerensheng/article/details/51602015

华硕今晚举行新品发布会带来了一系列新品灵耀X双屏Pro,一块15。6英寸4KOLED触摸屏一块14英寸4K触摸副屏,打开笔记本后,副屏会自动抬升9。5度,散热更好操作更舒服,搭载i911900HRTX3080,售价29iPhone13Pro终于挤进了高刷队伍!但玩游戏没有这款机型香今天凌晨,万众期待的iPhone13系列终于发布,整体与此前爆料基本一致,没有很大的惊喜。个人觉得,最大的亮点全系加量不加价,5199元的起售价确实很有诚意,另外一个大卖点应该高配华为5G版Mate40Pro升级鸿蒙后的来电铃声问题各位花粉大家好,不知道你们的华为手机升级鸿蒙后遇到过这样的问题了吗?我的Mate40Pro系统已经更新为鸿蒙OS2。0(168)最新版,鸿蒙系统比以前的系统更顺滑了,待机续航也有了小米11T系列发布,这是否会是红米k40s?主摄一亿像素!快充升级小米11T手机发布了!这个系列手机有点意思,感觉就是小米11的青春版,但可能国内会是红米k40s?应该会是这样的思路吧?简单看看这个手机吧,有点意思!这个手机分为普通版和Pro版!苹果发布会iPhone13全系加大内存,Pro独享高刷,真的十三香喊了一年的十三香终于和大家见面了,但出人意料地是,在手机越卖越贵的今天,苹果居然加量还降价。不仅全系升级了存储,还为两款Pro机型升级了120Hz高刷,而且价格还极具诚意。除此之外制造车间MES系统设计与解决方案写在前面(文中超链接仅在微信公众号智能制造之家有效)大家好,我是小智,智能制造之家号主前面我们介绍了智能制造中的ERPPLMMESMOMSCADADCSPLC工业机器人等等相关行业矿山领域物联网操作系统矿鸿操作系统上线能源人都在看,点击右上角加关注新华社9月15日消息,国家能源集团与华为技术有限公司14日发布矿山领域首个物联网操作系统矿鸿操作系统。操作系统通过软总线技术,将不同设备互联,推动采煤嫌特斯拉ModelY的续航不给力?你或许可以换个轮毂身为新能源车的一种,电动汽车具有行驶安静无污染补给方便等优点。目前,国内较为主流的电动汽车有特斯拉Model3特斯拉ModelY等等。当然,特斯拉仍然有一些不完美的地方。对于广大驾快递驿站怎样做可以让用户更暖心?快递驿站已经渐渐从一个专门只做快递代收发的场所,转变为集零售,社区团购,其他社区服务为一体的综合服务中心。快递驿站想要赢得大家的认可,获得更高的流量,需要持续性提升服务水平。快递驿平板电脑十大品牌排行榜排行榜依托全网大数据,根据品牌评价以及销量评选出了2020年平板电脑十大品牌排行榜,前十名分别是华为HUAWEI苹果APPLE荣耀HONOR联想LenovoPanasonic松下三iPhone13系列有哪些值得关注的亮点和不足?官网的参数往往枯燥且难懂,所以我就来给大家简单的展开说一下官网的这些功能都是啥吧。我们先从我最熟悉的影像开始讲起,先说iPhone13Pro的三颗摄像头的硬件开始讲起1影像硬件参数
全新飞利浦平板M9强悍来袭大屏高配,品质甄选自飞利浦平板M9正式上市推出以来,其一方面在线下平台逐渐成为众多平板需求人士的高性价比之选,另一方面则是源源不断地收获到来自各界的购置需求,因此,全新平板M9线上选购渠道的打通工作飞利浦VTR5102AI。看心声,展现品质骄傲传承经典,拥抱智能飞利浦AI。智能VTR5102正式上新为期两周的预售活动正式于上周结束短短的时间里,层层堆叠的订单,句句实在真心的好评,再一次映证着VTR5102的出彩在线收获众建筑企业工程施工智慧管理解决方案建筑企业工程施工过程中生产安全面临着管理层级多项目难度大管理人员年轻化等诸多难题。虽然企业下大力推进企业生产安全双重预防管理体系建设,制定相应的企业制度规范,但依靠人工管理的方式,新基建加速建筑企业数字化转型升级新基建主要包括5G基站建设特高压城际高速铁路和城市轨道交通新能源汽车充电桩大数据中心人工智能工业互联网七大领域,涉及诸多产业链,是以新发展理念为前提,以技术创新为驱动,以信息网络为建筑业颠覆性变革智慧建造让掌上建造成为可能数百台建筑设备数十万吨钢筋上百万平方米模板上百万吨混凝土最高峰时近万名建筑工人同时施工这就是传说中的智慧工地,现场几十台塔吊高低错落,互相交织。高峰时每天要起吊上千次,但没有发生过2035年城乡建设全面实现绿色发展智慧建造助力建筑业转型昨日国新办举行了关于推动城乡建设绿色发展的意见发布会(以下简称意见)。意见明确要求将绿色发展贯穿城乡建设全过程和各方面,到2035年城乡建设全面实现绿色发展。意见提出要积极推进城乡红米K40Pro和魅族18区别哪个好,参数对比评测红米K40Pro作为目前性价比超高的手机来说,和最近刚发布的魅族18之间相比哪个更划算性价比更高呢,笔者今天就为大家带来了红米K40Pro和魅族18之间的参数对比,这里我做了一张参企业为何要进行规范化流程管理?有什么目的?企业为何要进行规范化流程管理?有什么目的?流程管理是一种以规范化的构造,端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法,常见商业管理教育,如EMBAMBA等盘点世界各地奇葩法律规定,秀恩爱犯法,亲自换灯泡也犯法八个你不知道的各国奇葩规定1。瑞士你若在晚上十点以后在住宅冲马桶,你就得去警察局坐坐了2。丹麦法律规定,餐厅吃不饱可以不付款,直到点的菜吃饱为止3。泰国出门必须穿内裤,千万不要以为继1999后再减1000,小米对粉丝这么豪横,米粉不容错过就在最近,小米又传来一条对消费者的好消息,小米推出教育优惠了,豪横!也就是说,就是小米突然上线新规,买小米手机更便宜了,网友表示这次终于等到了!日前,小米这边就突然上线了一条新规,康辉连线关晓彤,百度世界大会把直播推向前台作为李彦宏亲自站台,百度年度最重要的活动之一,今年的百度世界大会首次与央视新闻联合举办,这场行业盛事显然逐渐被赋予了更多社会价值。此次大会一方面盘点了百度移动生态最新成绩百度APP