第十章:接口、继承与多态
(一)类的继承
继承思想:
类的继承是基于父类的扩展,指定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加的原来父类所不具备的属性和方法,或者直接重写父类中的某些放法
例子:
分析:
1)在子类中可以连同初始化父类构造方法来完成子类初始化操作,既可以在子类的构造方法中使用super()语句调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法等。
2)子类没有权限调用父类中被修饰为private的方法,只可以调用父类中修饰为public或protected的成员方法。
3)继承还可以重写父类的成员方法,就是在子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改成员方法的储存权限,或是修改成员方法的返回值类型。
注意: 当重写父类方法时,修改方法的修饰权限只能从小的范围到大的范围改变
在实例化子类对象时,Java编译器会在子类的构造方法中自动调用父类的无参构造方法,例如:
运行结果:
说明:在实例化子类对象时,父类无参构造方法将被自动调用,但有参构造方法并不能被自动调用,只能依赖于super关键字显式地调用父类的构造方法
(二)Object类
public class ObjectInstance{
public String toString(){ //重写toString()方法
return "在"+getClass().getName()+"类中重写toString()方法";
}
public static void main(String[] args){
System.out.println(new ObjectInstance()); //打印本类对象
}
}
运算结果:
在ObjectInstance类中重写toString()方法
(三)对象类型的转换
1.向上转型:把子类对象赋值给父类类型的变量
运算结果:
分析:如果在四边形类的draw()方法中根据不同的图形对象设置不同的处理,就可以做到在父类中定义一个方法完成各个子类的功能
2.向下转型:将父类对象赋予子类对象,并强制转换为子类型
class Quadrangle{
public static void draw( Quadrangle q){
//SomeSentence
}
}
public class Parallelogram extends Quadrangle{
public static void main(String[] args){
draw(new Parallelogram());
Quadrangle q=new Parallelogram(); //向上转型
Parallelogram p=(Parallelogram) q; //向下转型
}
}
(四)使用instanceof操作符判断对象类型
instanceof的语法格式:myobject instanceof ExampleClass
注: myobject 是某类的对象引用;ExampleClass是某个类
例:
class Quadrangle{
public static void draw( Quadrangle q){
//SomeSentence
}
}
class Square extends Quadrangle{
//SomeSentence
}
class Anything{
//SomeSentence
}
public class Parallelogram extends Quadrangle{
public static void main(String[] args){
Quadrangle q=new Quadrangle(); //实例化父类对象
//判断父类对象是否为parallelgram子类的一个实例
if(q instanceof parallelogram){
Parallelgram p=(Parallelgram) q; //向下转型
}
//判断父类对象是否为Square子类的一个实例
if(q instanceof Square){
Square s=(Square) q; //进行向下转型操作
}
//由于q对象不为Anything类的对象,所以下面这条语句是错误的
//System.out.println(q instanceof Anything);
}
}
(五)方法的重载
说明:构造方法的名称由类名决定,所以构造方法只有一个名称,但如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成,为了让方法名相同而形参不同的构造方法同时存在,就必须用到“方法重载”
运算结果:
定义不定长参数方法确定重载关系:
语法:返回值 方法名(参数数据类型… 参数名称)
例:
public static int(int...a){ //定义不定长参数方法
int s=0;
for(int i=0;i<a.length;i++)
s+=a[i];
return s;
}
运算结果:
(六)多态
运行结果:
(七)抽象类与接口
1.抽象类:1)在解决实际问题中,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理 。 2)使用abstract关键字定义的类为抽象类,而使用这个关键字的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承。3)抽象类被继承后需要实现其中所有抽象方法,也就是保证相同的方法名称、参数列表、和相同返回值类型创建出非抽象方法,也可以是抽象方法
定义抽象类语法如下:
public abstract class Test{ //定义抽象类
abstract void testAbstract(); //定义抽象方法
}
2.接口:1)接口是抽象类的延伸,可以将接口看作是纯粹的抽象类,接口中所有方法都没有方法体。2)一个类可以使用接口实现多重继承,因为一个类可以同时实现多个接口,可以将所有需要继承的接口放置在implements关键字后面并用逗号隔开
定义接口语法如下:
public interface drawTest{ //定义接口
void draw(); //定义接口类的方法,省略abstract关键字
}
实现多重继承语法如下:
class 类名 implements 接口1,接口2,接口3,....接口n
注意: 使用接口实现多重继承可能会造成在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中的所有方法