`

类的继承与多态

阅读更多

                                                               类的继承

继承和多态是面向对象语言的基本特性,以下是我关于继承和多态的理解和总结,可能有些表述不准确的地方,请大家指正:

1.继承指的是子类继承父类的属性和方法且一个类只能有一个父类,它可以减少重复代码的编写和对代码实现拓展。

2.理论上父类的所有属性和方法都能被子类继承,但父类的私有成员和构造函数是不能在子类中直接调用的,要访问父类的私有属性,必须要用get方法。

3.继承的两种情况

在同一包内继承:子类及子类创建的对象能访问父类的public,protect以及默认的属性和方法;

在不同包的继承:子类能访问父类的public,protect的属性和方法,而子类创建的对象只能问public的属性和方法。

 

private只能在自己类中访问,public能在所有类中访问,defaut默认的能在同一个包内访问,protect能在同一包内及子类中访问。而这些都能在自己类中访问。

  作用域       当前类    同一package     子孙类       其它package   
   public          true          true               true            true
   protected    true          true               true            false
   defaut         true          true               false            false
   private         true         false              false             false

 

注: 对于default类型修饰词,如果其子孙类与父类如果是位于同一个包内,则子孙类中的方法可以访问无修饰词修饰的父类方法;如果子孙类与父类是位于不同的包内,则子孙类中的方法无法访问父类中的无修饰词修饰的父类方法。

4.在子类中可以重写父类的方法(函数名,返回类型,参数都要一样),也可以在子类中对父类的方法进行重载,但子类重写后调不到父类的方法了,自能在类内部使用关键字super调用,而子类的对象调不到。

注意:

1.只有可被继承的方法才能被重写,否则写出来的方法是一个新方法。

2.重写的方法访问权限不能低于被重写的方法(public不能重写为protected),但抛出的异常范围不能高于被重写方法。

3.重写只能用在非静态方法之间(不能用非静态方法重写静态方法,也不能用静态方法重写非静态方法,这些编译都会报错),静态方法重写静态方法(编译不会报错但达不到重写的目的了,所以不叫重写)。因为:
static/final 方法的调用使用的静态绑定策略,在编译阶段,编译器就可以根据引用类型A来确定需要调用A中的getMember()。
而普通方法的调用采用的是动态绑定策略(在运行阶段需要考虑引用类型和实际类型(new)),这里就不多说了。

4.静态方法和数据域(有static关键字的),子类方法重写没有进行覆盖而是隐藏了,形成隐藏域子类可以用super关键字和类名进行调用。

 

5.自动转型(向上转型):这是实现多态的机制。父类的创建的对象但用了子类的构造函数例如Animal a = new cat(),或将子类创建的对象feed(cat)作为参数传给形参为父类类型的函数  feed(Animal a).是自动转型的两种形式。且子类一旦自动转型为父类,就只能调用父类中已定义的方法(但执行的是子类重写后的方法)而不能调用子类中自己独有的方法。

强制转换(向下转型):这是使用(子类)进行强制转换,但必须要是子类,可用instanceof先做判断,从而提高代码健壮性。

 

 

6.重写函数的调用:一个对象是调用父类的函数还是子类重写的方法看他实例化对象时是用的谁的构造函数,那么就调用谁的方法。

 

7.构造方法链:在实例化子类是默认先调用父类的无参构造方法(用super关键字可调用有参构造方法)。一个类若没有声明构造方法,默认有一个无参构造方法,若声明了有参的构造方法,则无参构造方法被覆盖,所以类要拓展时最好声明一个无参构造方法,避免编译出错。

8.super关键子:可用来调用父类的方法,但是不可super.super.A(),这样连续调用。

 9.多态:

使用多态的原因
    使用多态的程序的可维护性和可扩展性增强
多态分类
    静态多态:
        静态多态也称编译时多态,即在编译时决定调用哪种方法;
        静态多态一般指方法重载;
        只要构成了方法重载,就可以认为形成了静态多态的条件;
        静态多态与是否发生继承没有必然联系
    动态多态:
        动态多态也称运行时多态,即在运行时才能决定调用哪个方法;
        必须要有继承关系存在(父类可以是抽象类,普通类,甚至子类可以实现接口);
        在继承中必须要有方法的覆盖;
        必须由父类的应用指向子类的实例,并且通过父类的引用调用被覆盖的方法(实现的是子类重写后的方法)

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics