5.1子类与父类
1.子类:由继承而得到的类
Class 子类名 extends 父类名 {
、、、、、、
}
父类:被继承的类
Java不支持多重继承,即子类只能有一个父类
2.类的树形结构
(1)如果C是B的子类,B又是A的子类,习惯上称C是A的子孙类
(2)Java的类按继承关系形成树形结构(将类看做树上的结点),在这个树形结构中,根结点是Object类
(3)任何类都是Object的子孙类,每个类(除了Object类)有且仅有一个父类,一个类可以有多个或零个子类
(4)如果一个类(除了Object类)的声明中没有使用extends关键字,这个类被系统默认为是Object的子类,即类声明“class A”与“class A extends Object”是等同的
5.2子类的继承性
在java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法
1.子类和父类在同一个包中的继承性
子类自然地继承了其父类中不是private的成员作为自己的成员
Class A {
private int x;
}
Class B extends A {
void f( ) {
X=10;
}
}
2.子类和父类不在同一包中的继承性
子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量
(private和友好访问权限的成员变量不会被子类继承)
继承的格式和使用
格式:class 子类 extends 父类 { }
继承的好处:1.提高代码复用性,提高软件开发效率;
2.继承的出现让类之间产生了关系,提供了多态的前提;
在类的继承中需注意:1.在Java中,类只支持单继承,不允许多继承,一个类只能有一个直接父类;
2.多个类可以继承一个父类
3. 在java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类;
4.在java中,子类和父类是一种相对概念,也就是一个类是某个类父类的同时也可以是另一个类的子类
5.3子类与对象
1.子类对象的特点
子类对象可以调用继承的方法,操作没有继承的成员变量
2.关于instanceof运算符
instanceof运算符是java独有的双目运算符,其左面的操作元是对象,右面的操作元是类,当左面的操作元是右面的类或其子类所创建的对象时,instanceof运算的结果是true,否则是false
tom instanceof A //2>3
5.4成员变量的隐藏和方法的重写
1.成员变量的隐藏
声明的成员变量的名字和从父类继承来的成员变量的名字相同(声明类型可以不同)时,子类就会隐藏所继承的成员变量
(1)子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量
(2)子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,即子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量
2.方法重写
子类重写的方法:如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法
子类中定义一个方法,这个方法的类型和父类的方法的类型一致并且这个方法的名字、参数个数、参数类型和父类的方法完全相同
重写方法即可操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法
3.重写注意事项
重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限(访问限制修饰符按访问权限从高到低的排列顺序:public、protected、友好的、private)
5.5 super关键字
1.用super操作被隐藏的成员变量和方法
(1)子类隐藏继承的成员变量,子类创建的对象就不在拥有该变量,该变量将归关键字super所拥有
(2)子类隐藏了继承的方法,子类创建的对象就不能调用被隐藏的方法,该方法的调用由关键字super负责
(3)如果在子类中想使用被子类隐藏的成员变量或方法就需要使用关键字super,比如super.x、super.play( )就是访问和调用被子类隐藏的成员变量x和方法play( )
2.使用super调用父类的构造方法
由于子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有:super();
5.6 final关键字
Final关键字可以修饰类、成员变量和方法中的局部变量
1.final类
可以使用final将类声明为final类。Final类不能被继承,既不能有子类。
2.final方法
如果用final修饰父类中的一个方法,那么这个方法不允许子类重写,也就是说,不允许子类隐藏可以继承的final方法(老老实实继承,不许做任何篡)
3.常量
如果成员变量或局部变量被修饰为final,那它就是常量。由于常量在运行期间不允许再发生变化,所以要求程序在声明常量时必须指定该常量的值
class A {
final int x = 23;
int y;
}
A a = new A ( ); a.y=a.x+100;
不允许对final变量进行更新操作
5.7 对象的上转型对象
上转型对象:A a;
B b = new B ( );
a = b;
1.上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法(失掉一些行为)继承的体系
2.上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法
注意:
1.不要将父类创建的对象和子类对象的上转型对象混淆
2.可以将对象的上转型对象在强制转换的一个子类对象,这时,该子类对象又具备了子类所有的属性和功能
3.不可以将父类创建的对象的引用赋值给子类声明的对象
4.如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法
上转型对象特点(如下图所示)
5.8 继承与多态
多态性:指父类的某个方法被其子类重写时,可以各自产生自己的功能行为
5.9 abstract类和abstract方法
用关键字abstract修饰的类被称为abstract类(抽象类)如:
abstract class A {
abstract int min(int x,int y); //抽象方法
}
用关键字abstract修饰的方法称为abstract方法(抽象方法)如:
abstract int min(int x,int y);
1.abstract类中可以有abstract方法
2.abstract类不能用new运算符创建对象
A a;
3.abstract类的子类
(1)如果一个非abstract类是abstract类的子类,它必须重写父类的abstract方法,即去掉abstract方法的abstract修饰并给出方法体
(2)如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法
class B extends A {
int min (int x,int y);
}
4.abstract类的对象作上转型对象
A a;
a = new B( );
a.min(12,45);
5.理解abstract类
抽象类中的抽象方法可以由子类去实现,即行为标准的实现由子类完成;注重行为的标准,而不是细节,细节留给子类
不允许使用final和abstract同时修饰一个方法或类,也不允许使用static修饰abstract方法,即abstract方法必须是实例方法
5.10 面向抽象编程
面向抽象编程:指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,二不是具体类声明的对象