面向对象的特征有哪些方面?
抽象(Encapsulation):封装的目的是为了保证变量的安全性,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员 如果不进行封装,类中的实例变量可以直接查看和修改,可能给整个代码带来不好的影响 因此在编写类时一般将成员变量私有化,外部类需要同getter和setter方法来查看和设置变量。
继承(Inherit):继承实际上也是为了提高代码的复用性和可扩展性,在定义不同类的时候存在一些相同属性,为了方便使用可以将这些共同属性抽象成一个父类,在定义其他子类时可以继承自该父类,减少代码的重复定义,子类可以使用父类中非私有的成员。
继承中需要注意:
-
父类可以不知道他有哪些子类,但是子类必须明确他有哪些父类
-
子类在重写父类时,如果想在父类功能基础上增加新的功能,可以用super实现
-
不能作为继承的子类:
-
存取控制
-
使用final修饰符,防止父类方法被重写一般就是添加final修饰符
-
只有private构造方法
-
-
子类的参数的个数和类型要和父类完全一致,返回类型要兼容
-
子类中方法的存取权限只能改为更低,不能高于父类中方法的存取权限 (里氏代换原则)
封装:封装是把一个对象的属性私有化,隐藏内部的实现细节,同时提供一些可以被外界访问属性的方法。通过封装可以使程序便于使用,提高复用性和安全性。
多态(Polymorphism):是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态的3要点:
-
1.多态是方法的多态,不是属性的多态(多态与属性无关)
-
2.多态的存在有三个必要条件:继承,方法重写,父类引用指向子类对象。
-
3.父类引用指向子类对象后,用该父类引用调用子类重写方法,此时多态就出现了。
多态性分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载(overload):发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写(override):发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。