面向对象上(知识点5:重写和多态)

1. 构造器当中调用另外一个构造器:

this()调用自身的另外一个构造器

super()调用父类的另外一个构造器

必须写在第一行,所以这两个是不可能同时出现的

2. 子类重写父类方法的时候,要遵循“两同两小一大的规则”

两同:方法名相同,形参列表相同

两小:子类方法的返回值类型应该比父类的方法的返回值类型更小或者相等

         子类方法声明抛出的异常应该比父类方法声明的抛出的异常类更小或者相等

一大:子类方法的访问权限应该比父类方法的访问权限大

里氏替换原则:子类中方法的前置条件(形参)必须与超类中被覆写的方法的前置条件相同或者更加宽松

                       重写或实现父类的方法时输出结果可以被缩小

3. 重写的方法要么都是类方法要么都是实例方法,不能一个是类方法,一个是实例方法,如下就是错误的

A类:public static void test();
B类(继承A类):public void test();

但是如果这样就是正确的,但是这样子test就是B类的新方法了,与A没有关系,也不是重写

A类:public void test();
B类(继承A类):public static void test();

4.多态(编译时类型和运行时类型不一致才会有多态),比如下面Sub是Base的子类

Base:成员变量——public int book=6

           方法——public void base()和public void test()

Sub:  成员变量——public String book="xxxxxx"

           方法——public void sub()和public void test()

Base b=new Sub();//编译时类型是Base,运行时类型是Sub

  • b.book   //6
  • b.base()//ok
  • b.sub//不可以调用
  • b.test()//实际运行时调用的是Sub重写过的test

总结:编写代码的时候,只允许调用编译时类型所定义的成员变量和方法

          运行代码的时候,如果子类重写了父类的某个方法,那么调用的将会是被子类重写过的那个方法

          实例变量是不具备有多态性的,总是访问的是编译时类型所定义的成员变量

如果想要在编写代码的时候,让引用变量调用运行时类型的方法,那么要把他强制转换成运行时类型

比如:Base b=new Sub();   Sub s=(Sub)b;

但是如果你这样子写Base b=new Base();   Sub s=(Sub)b;那么就是错的,因为b的编译时类型和运行时类型都是Base,所以如果将父类实例转化成子类实例时,这个对象必须编译时为父类类型,运行时类型为子类类型,否则会有ClassCastException,所以可以使用instanceof运算符。

语法:引用类型变量 instanceof 类/接口。

前面的要是后面的类、子类、实现类的实例才是true





猜你喜欢

转载自blog.csdn.net/weixin_35110513/article/details/80264165