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()(此为向上转型)
多态的使用场景 :
如果方法的参数是一个父类类型的, 我们传递一个子类对象, 当然是可以的, 因为子类就是一个父类.这样的设计简化了程序的编写.
程序中如果创建了一个子类对象, 我们可以使用父类的引用进行接收, 程序编译不受影响. 提高了代码的灵活性.
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、静态方法:与成员方法调用相似,类方法分父类和子类。
父类.方法名——如果父类中存在该方法,则编译通过
子类.方法名——如果父类和子类中都不存在该方法名,编译报错,如果都存在,编译通过且运行时执行子类中的静态方法;如果父类中存在该方法编译通过,运行时执行父类中的静态方法;
总结 : 关于属性,编译和运行都需要看其真正接收存储的类型.而方法,在继承体系中,子类可以重写父类的方法的特性,因此,编译时期如果使用父类引用接收,需要看父类中是否真实存在该方法,运行时则看子类是否有重写该方法,如果有重写,调用子类该方法,如果没有重写,则调用父类该方法.