JAVA 多态、继承、super关键字 day9

来源:互联网 发布:淘宝网退货地址怎么改 编辑:程序博客网 时间:2024/06/10 04:03

1、继承:

Java,类的继承是指在一个现有类的基础上去构建一个新的类.构建出来的新类被称作子类,现有类被称作父类.子类会 `无条件` 拥有父类全部可继承的属性和方法.继承通过 "extends关键字"实现.

Java .类只支持单继承,不允许多重继承.也就是说一个类只能有一个直接父类.

2、继承的特殊情况:

子父类中定义了相同的变量:如果子类调用父类继承过来的方法访问成员变量,那么系统首先会在父类继承的成员中查找.如果找到,则直接使用.如果没有找到,才会在子类中寻找. 如果子类直接调用自己类中的方法,那么系统首先在子类自己的属性中查找.如果找到则直接拿来使用,如果没有找到.那么才会在父类中进行寻找.


3、单一继承和多重继承

单一继承:一个子类只能有一个父类

多重继承:class A

class B extends class A

class C extends class B

C就拥有了爷爷A和父亲B的功能

4、方法重写:

4.1、重写父类方法(override):

在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改.即对父类的方法进行重写.需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名,参数列表以及返回值类型.

注意:子类重新实现父类的方法,就是方法的重写.执行的时候,如果方法被重写了,那么优先执行子类的方法.

4.2、   继承体系中方法调用的顺序 :

  在子类中,调用一个对象方法.

1.    首先会在子类中查找该方法.

2.    如果子类中没有 那么向上一层父类中查找.

3.    如果上一层父类中也没有 再向上一层爷爷中查找.

4.    直到Object.如果还是没有,直接报错.

·  注意 :如果上面某一层中找到了该方法 那么直接调用,不会再向上查找了.

4.3、子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限(权限从高到低为:Public>protected>默认>private)

5、super关键字

super指代父类:如果子类重写了父类的方法,那么调用的时候必然优先调用子类重写的方法,如果还行调用父类的方法,就用super来调用,如访问父类的成员变量、成员方法和构造方法

6、子父类中构造方法的特点:

构造方法执行的隐士三步:

6.1、super():它是在调用自己的父类空参数构造方法

当用一个子类的构造方法创建一个类的对象时,子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法没有明显的指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。由于子类不继承父类的构造方法,因此子类在其构造方法中需要使用super来调用父类的构造方法,且super必须是子类构造方法中的头一条语句

6.2、给成员变量进行显示赋值

6.3、运行构造代码块

6.4、本构造方法中自己写的代码被执行

注:在定义一个类时,如果没有特殊需求,尽量在类中定义一个无参的构造方法,避免被继承子类创建对象时出错


7、多态:由于参数类型不同而导致执行效果各异的现象就是多态.

Java中为了实现多态,允许使用一个父类类型的变量引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果.(即同一个行为,对于传入不同的“对象”而言,具有完全不同的表现形式)

多态性:多态的基础是继承。类之间先有继承关系之后,才会产生多态的形式(多态性指的是在程序中允许出现重名现象.它指在一个类中定义的属性和方法被其它类继承后,它们可以具有不同的数据类型或表现出不同的行为.这使得同一个属性和方法在不同的类中具有不同的语义.)

8、多态语句在代码中的体现 :父类的引用指向了子类的对象. Father F=new Son()(此为向上转型)

多态的使用场景 :

如果方法的参数是一个父类类型的, 我们传递一个子类对象, 当然是可以的, 因为子类就是一个父类.这样的设计简化了程序的编写.

程序中如果创建了一个子类对象, 我们可以使用父类的引用进行接收, 程序编译不受影响. 提高了代码的灵活性.


9、多态中如何调用子类特有的属性和行为:向下转型(强制类型转换) Son  s=(Son)p——p为父类对象,s.sonFunction()

10、向下转型有风险,容易产生classCaseException的错误,为防止此类错误产生,需要使用instanceof进行判断instanceof 运算符是双元运算符,左面的操作是一个对象,右面是一个类.当左面的对象是右面的类或子类创建的对象时,该运算符运算的结果是true,否则是false.

if(父类引用变量名 instanceof  子类对象所属的类名){}

11、多态中的成员特点:需要考虑编译(只检查语法和格式是否正确,不开辟内存空间)和运行(开辟内存空间,分配内存和变量)两个阶段

11.1、成员变量:直接使用父类引用操作成员变量(Person p=new Son();p.name="xxx")

11.2、成员方法(对象方法):父类类型调用成员方法,编译时期看父类(如果父类中没有test方法,编译报错),运行时期看子类(如果子类重写了父类的方法,则调用子类的,否则调用父类的该方法), 因为继承中方法有重写的特性(p.test();)

11.3、静态方法:与成员方法调用相似,类方法分父类和子类。

父类.方法名——如果父类中存在该方法,则编译通过

子类.方法名——如果父类和子类中都不存在该方法名,编译报错,如果都存在,编译通过且运行时执行子类中的静态方法;如果父类中存在该方法编译通过,运行时执行父类中的静态方法;

总结 : 关于属性,编译和运行都需要看其真正接收存储的类型.而方法,在继承体系中,子类可以重写父类的方法的特性,因此,编译时期如果使用父类引用接收,需要看父类中是否真实存在该方法,运行时则看子类是否有重写该方法,如果有重写,调用子类该方法,如果没有重写,则调用父类该方法.






 





原创粉丝点击