当前位置: 首页 > Web前端 > JavaScript

Java的封装、继承、多态

时间:2023-03-27 15:54:48 JavaScript

一、前言今天总结一下Java的三大特性,封装、继承、多态。其实这三大特性对于程序员来说是基本的。毕竟只要接触Java,就需要先了解这些,后面我会系统的总结一下。二、封装先说一个特性:封装2.1、什么是封装封装是面向对象方法的一个重要原则,即将对象的属性和操作(或服务)组合成一个独立的整体,并且尽可能隐藏对象的内部实现细节。类的一些信息隐藏在类内部,不允许外部程序直接访问调用。通过该类提供的方法实现对隐藏信息的操作和获取。隐藏对象信息。留出对外接口进行访问。举一个比较通俗的例子,比如我们的USB接口。如果我们需要外设,只需要将设备连接到USB接口上,那么它内部如何工作对用户来说并不重要。USB接口是对外提供的访问接口。说了这么多,为什么要用封装呢?2.2、封装的特性实现了对成员变量更精确的控制。封装可以隐藏内部程序实现的细节。良好的封装可以降低代码之间的耦合度。外部成员不能修改打包后的程序代码。它便于数据检查,有助于保护对象信息的完整性,也提高了程序的安全性。易于修改,提高了代码的可维护性。2.3、封装的使用使用private修饰符表示最小访问权限。对于成员变量的访问,统一提供了setXXX和getXXX方法。我们来看一个Student实体对象类:;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetSex(){returnsex;}publicvoidsetSex(Integersex){this.sex=sex;}}分析:对于上面的实体对象,我想大家已经很熟悉了。对象中的成员变量是私有化的,不能被外部程序访问。但是我们对外提供访问方法,就是set和get方法。对于这样的实体对象,外部程序只有赋值和取值的权限,不能修改内部的。因此,我们也可以在内部进行一些逻辑判断来满足我们的业务需求。至此,我们应该明白封装对于我们程序的重要性了。现在让我们谈谈继承。3.继承3.1什么是继承继承是指子类继承了父类的特性和行为,使子类对象(实例)具有父类的实例字段和方法,或者说子类继承了父类的方法类,使子类具有与父类相同的行为。当然,如果你在父类中有私有属性(private修饰),子类是不能被继承的。3.2.继承的特点1.继承注意事项:只支持单继承,即一个子类只允许有一个父类,但可以实现多级继承,子类有唯一的父类,而父类类也可以被继承。子类可以拥有父类的属性和方法。子类可以有自己的属性和方法。子类可以覆盖父类的方法。2.继承的特点:提高代码的复用性。父类的属性和方法可以在子类中使用。可以轻松定义子类。使设计应用程序变得容易。3.3、继承的使用1、在父子类关系继承中,如果成员变量重名,在创建子类对象时有两种访问方式。A。通过子类对象直接访问成员变量等号左边的先用谁,没有就往上查找。b.通过成员方法间接访问成员变量。该方法属于谁将首先使用它。如果没有,请向上看。publicclassFU{intnumFU=10;intnum=100;publicvoidmethod(){System.out.println("父类成员变量:"+numFU);}publicvoidmethodFU(){System.out.println("父类成员方法!");}}publicclassZiextendsFU{intnumZi=20;intnum=200;publicvoidmethod(){System.out.println("子类成员变量:"+numFU);}publicvoidmethodZi(){System.out.println("子类方法!");}}publicclassExtendDemo{publicstaticvoidmain(String[]args){FUfu=newFU();//父类父类的实体对象只能调用父类的成员变量System.out.println("父类:"+fu.numFU);//结果:10Zizi=newZi();System.out.println("调用父类Class:"+zi.numFU);//结果:10System.out.println("子类:"+zi.numZi);//Result:20/**输出结果为200,证明在重名的情况下,如果子类中存在,则优先使用。*如果不存在,就去父类中找,但是如果父类不存在,那么编译的时候就会报错。*/System.out.println(zi.num);//Result:200/***通过成员方法调用成员变量*/zi.method();//结果:10}}2、类似的:member方法也一样。谁创建了对象就先使用,没有对象就直接往上查找。注意:无论是成员变量还是成员方法,如果没有成员变量,则向上查找到父类,永远不会向下查找到子类。3.在继承关系中,关于成员变量的使用:局部成员变量:直接使用本类的成员变量:this。成员变量父类成员变量:super.父类成员变量intnumZi=10;publicvoidmethod(){intnumMethod=20;System.out.println(numMethod);//访问局部变量System.out.println(this.numZi);//访问该类的成员变量System.out.println(super.numFu);//访问本类的成员变量}3.4、覆盖、重载Override(覆盖)是指子类重写允许访问父类的方法的实现过程,返回值和形参不能改变。即外壳不变,核心重写!classAnimal{publicvoidmove(){System.out.println("Animalswalk!");}}classDogextendsAnimal{publicvoidmove(){System.out.println("Dogscanrunandwalk");}}publicclassTestDog{publicstaticvoidmain(Stringargs[]){Animala=newAnimal();//动物对象Animalb=newDog();//Dog对象a.move();//执行Animal类的方法b.move();//执行Dog类的方法}}重写规则:1.参数列表必须相同作为重写的方法。2.访问权限不能低于父类中重写方法的访问权限(public>protected>(default)>private)。3.父类成员的方法只能被其子类覆盖。4.final修饰的方法不能被重写。5.构造方法不能重载(overload)是在一个类中,方法名相同,只是参数不同。返回类型可以相同或不同。每个重载方法(或构造函数)都必须有一个唯一的参数类型列表。最常用的地方就是构造函数的重载。公共类重载{publicinttest(){System.out.println("test1");返回1;}publicvoidtest(inta){System.out.println("test2");}//以下两个参数类型顺序不同publicStringtest(inta,Strings){System.out.println("test3");返回“returntest3”;}publicStringtest(Strings,inta){System.out.println("test4");返回“returntest4”;}publicstaticvoidmain(String[]args){重载o=newOverloading();System.out.println(o.test());o.test(1);.out.println(o.test(1,"test3"));System.out.println(o.test("test4",1));}}重载规则:1、重载的方法参数列表必须改变(不同数量或类型的参数)。2.重载方法可以改变返回类型。3.重载方法可以改变访问修饰符。3.5、this、super关键字super()关键字的用法1、在子类的成员方法中,访问父类的成员变量。2.在子类的成员方法中,访问父类的成员方法。3.在子类的构造方法中,访问父类的构造方法。this关键字的用法:1.在本类的成员方法中,访问本类的成员变量。2.在本类的成员方法中,访问本类的另一个成员方法。3.在本类的构造方法中,访问本类的另一个构造方法。注意:this关键字和super一样,必须是构造方法的第一条语句,并且是唯一的。this和super不能同时存在。3.6、Constructor在继承关系中,父子类构造方法的访问特点:1.有一个默认隐含的super();在子类构造方法中调用,所以必须先调用父类构造方法,再调用子类构造方法。2.子类构造可以使用super();调用父类的重载构造。(重载)3.super();父类调用构造函数必须在子类构造函数的第一行,也就是以first结尾的元素;号码,并且只能调用一次。3.7.继承注意事项:1、Java语言是单继承的,一个子类只能有一个父类。2.Java语言可以多级继承。子类有父类,父类也可以有父类。3、一个子类只有一个父类,但是一个父类可以有多个子类。四、多态性4.1、什么是多态性多态性是指同一行为具有多种不同表现形式或形式的能力。4.2.多态的特点1.消除类型之间的耦合关系,实现低耦合。2.灵活性。3.可扩展性。4.可更换性。4.3、多态体现继承父类引用子类重写注意:在多态中,向左编译向右运行publicclassMultiDemo{publicstaticvoidmain(String[]args){//多态引用是向上转型的Animals狗=新狗();狗.吃();动物猫=newCat();猫.吃();//如果要调用父类中不存在的方法,必须往下走TransformDogdogDown=(Dog)dog;dogDown.watchDoor();}}classAnimals{publicvoideat(){System.out.println("Animalseat!");}}classDogextendsAnimals{publicvoideat(){System.out.println("狗正在吃骨头!");}publicvoidwatchDoor(){System.out.println("狗在看门!");}}classCatextendsAnimals{publicvoideat(){System.out.println("猫在吃鱼!");}}4.4、向上转化1、格式:父类名对象名=new子类名();意思:在右侧创建一个子类对象,把它作为父类使用。注意:向上转型必须是安全的。缺点:一旦向上转型,子类中原有的unique方法就不能再调用了。5.界面最后,关于界面的细节,不同版本之间的差异。问题描述:现在需要从接口中提取一个public方法来解决默认方法中代码重复的问题。但是这个公共方法不能被实现类实现,所以应该设置为private。JDK8后:1、default修改,接口中允许定义default方法,但也可以覆盖重写default方法。2.接口中允许定义静态方法。JDK9之后:1.普通私有方法,解决多个默认方法之间代码重复的问题。2.静态私有化,解决多个静态方法之间的代码重复问题。接口注意事项:1、接口中的静态方法不能通过接口的实现类对象调用。正确语法:接口名调用静态方法。接口中常量的使用:1、接口中定义的常量:publicstaticfinal可以省略。2、接口中定义的常量:必须赋值。3、接口中定义的常量:常量的名称要全部大写,多个名称之间用下划线分隔。使用接口注意事项:1.接口没有静态代码块和构造方法2.一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。3、如果实现类没有重写接口中所有的抽象方法,那么实现类一定是抽象类。4.如果实现类实现了多个接口,并且有重复的抽象方法,那么只需要重写一次就可以了。5、在Java中,如果实现类的直接继承父类与实现接口冲突,则父类的优先级高于接口。接口之间的关系:1、多个接口之间存在继承关系。2.如果默认方法在多个父接口之间重复,子接口必须覆盖默认方法。6.总结Java的特点基本总结出来了,当然还有一些细节没有完善。其实这些Java基础是必须要掌握和背诵的,因为这和我们实际开发是息息相关的。只有良好的编码习惯才能创造出好的产品,才能得到社会的认可。