您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 13面向对象编程(三)抽象
1.3面向对象编程(三)抽象一、继承的补充继承的好处,能够提高代码的复用性,使代码简洁化,但是继承也有一些弊端。比如,恶意的继承就会打破原有父类的封装。我们知道,子类继承父类,就要去覆写父类中的方法,如果父类中的方法不是共有方法,这个方法只有父类能使用,其他的子类都不能使用,如果子类在不知道的情况下覆盖了这个方法,那么这就将父类中封装的这个方法就暴露出来,就会导致原有功能的错误,这就打破了Java的封装。怎样才能解决这个问题呢?Java中有一个关键字:finalfinal:作为一个修饰符。1,它可以修饰类,可以修饰方法,可以修饰变量。2,final修饰的类是一个最终类,不可以被继承。3,final修饰的方法不可以被覆盖。4,final修饰的变量的是一个常量,只能被赋值一次。这个赋值指的是显示初始化赋值。什么时候将变量修饰成final的呢?通常在程序中会使用一些不会变化的数据。也就是常见的一些常量值。比如3.14那么这个数据直接使用是可以的,但是不利于阅读,所以一般情况下,都会被该数据起个容易阅读的名称。finaldoublePI=3.14;final修饰的常量定义一般都有规范书写,被final修饰的常量名称,所有字母都大写。如果由多个单词所组成,每一个单词间用_连接。二、面向对象编程(三)抽象1、什么是抽象,我们先来看一个例子。abstractclassDemo{abstractvoidshow();//这时这个函数就看不懂了,因为没有方法体。//这个就需要被标识一下成看不懂的函数。需要一个关键字来修饰一下。abstract(抽象)//当类中出现了抽象方法后,该类也必须标识成抽象的。}classDemoAextendsDemo{voidshow(){System.out.println(showa);}}classDemoBextendsDemo{voidshow(){System.out.println(showb);}}-------------------------------------------------------------------------------------------两个类DemoADemoB里面都有共性的功能,可以进行抽取。可是功能的声明相同,但是功能的具体内容不同。这时,我们只对相同的功能声明进行抽取。而抽取功能的内容。抽象类就是子类不断向上抽取而来的,只抽取了子类的功能声明,而没有抽取子类的具体的功能内容。所以功能是抽象的,需要定义在抽象类中。抽象类的特点:1,抽象类和抽象方法必须用abstract关键字修饰。2,抽象方法一定要存放在抽象类中。3,抽象类不可以被实例化。也就是不可以通过该类建立对象。因为抽象类建立对象后,调用抽象方法没意义。4,只有抽象类的子类将抽象类中的抽象方法全都覆盖掉,该子类就可以了建立对象了。如果只是部分覆盖,那么该子类还是一个抽象类。-----------------------------------------------------------------------------------------------抽象与继承,在形式上是差不多的,主要的差别在于父类,因为父类的方法为抽象的方法,所以父类也必须要使用关键字abstract来修饰,抽象的类必须要被继承,否则就没有存在的意义。抽象类什么时候定义?当我们分析事物时,对对象进行描述时,其实就不断把对象中的共性内容向上抽取。在抽取过程中,发现对象具备相同的功能,但是功能的细节不同。这是在定义类时,该功能是没有具体的实现的,是由具体的对象来完成的。那么该功能就是抽象的。/*示例(这是一个很经典的例子)需求:公司中程序员有姓名,工号,薪水,工作内容。项目经理除了有姓名,工号,薪水,还有奖金,工作内容。对给出需求进行数据建模。分析:这里有两个具体事物。1,程序员属性:nameidpay行为:work()2,项目经理。属性:nameidpaybonus行为:work()发现这两个事物具备共性内容。为了提高代码的复用性。两个事物间是不具备继承关系的。因为两个事物不存在谁是谁中一种。但是,可以确定是无论程序员,还是经理,他们都是公司员工。他们都是员工的一种。而且员工都具备一些基本属性和行为。这时就可以将两个事物向上抽取,出一个员工类。该类中定义就是两个事物共性的内容。*/abstractclassEmployee{privateStringname;privateStringid;privatedoublepay;Employee(Stringname,Stringid,doublepay){this.name=name;this.id=id;this.pay=pay;}publicabstractvoidwork();}classManagerextendsEmployee{privatedoublebonus;Manager(Stringname,Stringid,doublepay,doublebonus){super(name,id,pay);this.bonus=bonus;}publicvoidwork(){System.out.println(manage);}}classProgrammerextendsEmployee{Programmer(Stringname,Stringid,doublepay){super(name,id,pay);}publicvoidwork(){System.out.println(code);}}抽象类的一些细节:1,抽象类中是否有构造函数。有。只要是class定义的类,里面肯定有构造函数。抽象类中的构造函数,用于给子类提供实例化。其实抽象类和一般类没什么区别。该怎么描述事物,就怎么描述。只不过,有些功能,该是类中无法确定内容个,所以比普通类多了抽象方法。2,抽象类中是否可以不定义抽象方法。可以的,没有抽象方法的抽象类存在意义仅仅是不让该类创建对象。因为创建的没意义。3,抽象关键字和哪些关键字不可以共存。final:如果方法被抽象,就需要被覆盖,而final是不可以被覆盖,所以冲突。编译提示:非法的修饰符组合:abstract和finalprivate:如果函数被私有了,子类无法直接访问,怎么覆盖呢?编译提示:非法的修饰符组合:abstract和privatestatic:不需要对象,类名既可以调用抽象方法。而调用抽象方法没有意义。编译提示:非法的修饰符组合:abstract和static
本文标题:13面向对象编程(三)抽象
链接地址:https://www.777doc.com/doc-3060834 .html