一、继承
继承是一种由已有类创建新类的机制。
利用继承,可以先定义一个共有属性的一般类。根据该一般类再定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加它自己新的属性和行为。
例子:
Java不支持多重继承,即子类只能有一个父类。class 子类名 extends 父类名 {}
class Student extends People {}
二、子类的继承性
子类的成员变量中有一部分是子类自己声明定义的,另一部分是从子类的父类继承的。
什么叫继承?
所谓子类继承父类的成员变量作为子类的一个成员变量,就好像这个变量是在子类中直接声明一样,可以被子类中自己定于的任何实例方法操作。
所谓子类继承父类的方法作为子类的一个方法,就像它们是在子类中直接定义一样。可以被子类中定义的任何方法调用。
子类和父类在同一包中的继承性:
子类自然继承了其父类中不是private的成员变量和方法,继承的成员变量或方法的访问权限保持不变。
子类和父类不在同一包中的继承性:
父类中的private和友好访问权限的成员变量和方法不会被子类继承,子类只继承弗雷中的protected和public访问权限的成员变量和方法。
Protected的作用和说明:
一个类A中的protected成员变量和方法可以被它的子孙类继承,比如B是A的子类,D又是C的子类,那么B,C和D类都继承了A类的protected成员变量和方法。
如果用D类在D本身创建一个对象,那么该对象总是可以通过 “ . ” 运算符访问继承的或自己定义的protected变量和protected方法。
如果在另一个类中:
在Other类中用D类创建一个对象object,(1)对于子类D自己声明的protected成员变量和方法,只要Other类和D类在同一个包中,Object对象就可以访问这些protected成员变量和方法。(2)对于子类D从父类继承的protected成员变量或protected方法,需要追溯到这些protected成员变量或方法所在的"祖先"类,比如可能是A类,只要Other类和A类在同一包中,object对象能访问继承的protected变量和protected方法。
三、子类与对象
当用子类的构造方法创建一个子类的对象时,不仅子类中的成员变量被分配了内存,而且父类的成员变量被分配了内存空间,但只将其中一部分,即子类继承的那部分成员变量,作为分配给子类对象的变量。
父类中的private成员变量尽管分配了内存空间,也不作为子类对象的变量,即子类不继承父类的私有成员变量。
如果子类和父类不在同一个包中,父类的友好变量分配内存空间,但不作为子类对象的变量。
子类中还有一部分方法是从父类继承的,这部分方法却可以操作这部分未继承的变量。
instanceof 运算符
instanceof是Java独有的双目运算符
对象 instanceof 类
当左边的操作元是右边类或其子类所创建的对象时,instanceof运算的结果是true,否则是false。成员变量的隐藏和方法重写
1、成员变量的隐藏
在编写子类时,仍然可以声明成员变量,一种特殊的情况就是,所声明的成员变量的名字和从父类继承的成员变量和名字相同。
在这种情况下,子类就会隐藏所继承的成员变量:(1)子类重新声明这个成员变量(2)子类对象仍然可以调用从父类中继承的方法操作用被子类隐藏的成员变量。
也就是说,自类继承的方法所操作的成员变量,一定是被子类继承或隐藏的成员变量。
子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量。
2、方法重写
如果子类可以继承父类的某个方法,就可以重写这个方法。
子类定义一个方法,这个方法的类型和父类的方法类型一致,并且这个方法的名字、参数个数和参数类型,以及返回值类型和父类的方法完全相同。
子类通过方法的重写可以把父类的状态和行为改变为自身的方法和行为。
重写方法既可以调用继承的成员变量、调用继承的方法。也可以操作子类新声明的成员变量,调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。
注意:重写父类方法时,不允许降低方法的访问权限,但可以提高访问权限。
子类重写方法的方法类型,可以是父类方法类型的子类型。
注意:小心出现季成后方法重载错误。
四、super和final关键字
1、Super关键字的使用
用super操作被隐藏的成员变量和方法:
子类一旦隐藏了继承的成员变量和方法,那么子类创建的对象就不再拥有该变量,不能调用该方法。
被隐藏的成员变量和方法由关键字super负责。
当super调用被隐藏的方法时,该方法中出现的的成员变量是被子类隐藏的成员变量或继承的成员变量。
使用super调用父类的构造方法:
当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法。
由于子类不继承父类的构造方法,因此子类在其构造方法中使用super来调用父类的构造方法,
而且super必须是子类构造方法的头一条语句,如果没有明显写出super关键字来调用父类中的某
个构造方法,默认的有:super(); ( 调用父类的不带参数的构造方法 )
使用super(a,b,c) 调用父类的构造方法
使用this(a,b,c) 可以调用本类另外的构造方法
2、final关键字
final关键字可以修饰类、成员变量和方法中的局部变量。
可以使用final将类声明为final类,final类不能被继承,即不能有子类。
用final修饰父类的一个方法,那么这个方法不允许子类重写。
被修饰为final的成员变量和局部变量为常量。
常量没有默认值,在声明时必须指定该常量的值。
五、对象的上转型对象
子类与父类的关系是“ is - a ” 关系,当说到老虎是动物时,老虎将失掉老虎独有的属性和功能。
对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。
(1)上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法;
(2)上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的子类重写的方法。
上转型对象操作子类继承或重写的的实例方法,其作用等价于子类对象去调用这些方法。
因此,如果子类重写了父类某个实例方法后,当对象的上转型对象调用这个实例方法时,一定调用了子类重写的实例方法。
注意:
(1)父类创建的对象不等于子类对象的上转对象;
(2)可以将对象的上转型对象再强转换到一个子类对象,这时,该子类对象又具有了所有的属性和功能;
(3)不可以将父类创建的对象的引用赋值给子类声明的对象。
如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。
继承与多态:
当一个类有很多子类时,并且这些子类都重写了父类中某个方法。
当把子类创建的对象实例的引用放到一个父类的对象中时,就得到该对象的一个上转型对象,那么这个上转型对象在调用这个方法时就可能具有多种形态。
因为不同的子类在重写父类的方法时可能产生不同的行为。
多态性是指父类的某个方法被子类重写,可以各自产生自己的功能行为。
五、abstract类和abstract方法
用关键字abstract修饰的类称为abstract类(抽象类)。
用关键字abstract修饰的方法称为abstract方法(抽象方法)。
对于abstract方法,只允许声明,不允许实现(没有方法体),而且不允许使用final和abstract同时修饰一个类,也不允许使用static修饰abstract方法,即abstract方法必须是实例方法。
1、abstract类中可以有abstract方法
abstract类中可以有abstract方法(非abstract类中不可以有abstract方法),也可以有非abstract方法。
2、abstract类不能使用new运算符创建对象
如果一个抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,所以不允许用final和abstract同时修饰一个方法或类。
3、abstract类的对象作为上转型对象
可以使用abstract类声明对象,不能用new运算符创建对象,但该对象可以成为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法。
注意:
abstract类也可以没有abstract方法。
如果一个abstract类是abstract类的子类,它可以重写abstract方法,也可以继承父类的abstract方法。