第七章继承,多态,抽象类与接口

继承和多态是面向对象开发中非常重要的一组概念。继承和多态使用得当,整个程序的架构将变得非常有弹性,同时可以减少代码的冗余性。继承机制下,用户可以复用一些定义好的类,减少重复代码的编写。多态机制下,用户可以动态调整对象的调用,降低对象之间的依存关系。为了优化继承与多态,一些类除了可继承父类,还需要使用接口的形式。Java中的类可以同时实现多个接口,接口被用来建立类与类之间关联的标准。正因为具有这些灵活、高效的机制,Java语言才更具有生命力。

7.1类的继承

集成在面向对象开发思想中是一个非常重要的概念,它使整个程序架构具有一定的弹性。在程序中复用一些已经完善的类,不仅可以减少软件开发周期,也可以提高软件的可维护性和扩展性。

继承extends

Java语言每个子类只能继承一个父类

继承 extends

父类和普通类写法相同

public class父类类名{

}

子类

public class子类类名 extends父类类名{

}

所有类的构造方法第一行都有一个隐藏的"super();”

作用是在执行该构造方法之前调用其父类构造方法

7.2Object类

在开始学习使用class关键字定义类时,就应用到了继承原理,因为在Java中所有的类都直接或间接继承了java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。用户创建一个类时,除非已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的。Java中的每个类都源于java.lang.Object类,如String类、Integer类等都是继承于Object类。除此之外,自定义的类也都继承于Object类。由于所有类都是 Object 类的子类,所以在定义类时可省略 extends等价于 Object在Object 类中,主要包括 clone()、finalize()、equals()、toString()等方法,其中常用的两个方法为equals()和 toString()方法。由于所有的类都是 Object 类的子类,所以任何类都可以重写Object类中的方法。

注意
Object 类中的getClass0、notifyO、notifyAll0)、waitO等方法不能被重写,因为这些方法被定义为 final 类型。
下面详细讲述Object类中的几个重要方法。
1. getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的 Class 实例,然后使用此实例调用 getNameO方法可以取得类的名称。语法如下:
getClass()getname();
可以将getClass()方法与toString0方法联合使用。
2. toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个 String实例。在实际的应用中通常重写toString0)方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。

所有类的父类

方法重写

返回参数相同, 方法名相同 ,传入参数相同 ,方法体不同,就近原则用子类

7.3对象的类型转换

向上转型:

将子类对象赋值给父类引用

Animal a=new Dog();

自动类型转换

向下转型:

将父类对象赋值给子类引用

强制类型转换

Dog a=(Dog) new Animal();

7.5方法的重载

在第6章中我们曾学习过构造方法,知道构造方法的名称由类名决定,所以构造方法只有一个名称。如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到方法重载。虽然方法重载起源于构造方法,但它也可以应用到其他方法中。本节将讲述方法的重载。
方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。为了更好地解释重载

子类重写父类方法

返回参数相同 方法名相同 传入参数相同 只有方法体不同

重载

方法名相同 参数不同

7.6final关键字

final修饰变量——不可以被修改(常量)

final修饰方法——不可以被重写

  

final修饰类——不可继承

7.4使用instanceof关键字判断对象类型

当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,发ClassCatException异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的这个判断通常使用instancof关字成。使用instanceof关键字判是否一个类实现了某个口(行),也可以用来判断一个实例对象是否属于一个类。

使用instanceof关键字的表达式返回值为布尔值。如果返回值为true,说明myobject对象为 ExampleClass的实例对象;如果返回值为false,说明myobject对象不是ExampleClass的实例对象。
误区警示
instanceof是Java语言的关键字,Java 语言中的关键字都为小写。

对象名instanceof类名

判断该对象是否属于该类或者子类

7.7多态

利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。在7.3节中已经习过子类对象可以作为父类的对象实例使用,这种将子类对象视为父类对象的做法称为“向上转假如现在要编写一个绘制图形的方法draw,如果传入正方形对象就绘制正方形,如果传入圆对象就绘制圆形,这种场景可以使用重载来实现

抽象方法

修饰符 abstract 返回参数 方法名(传入参数);

抽象类 由抽象方法的类一定是抽象类

修饰符 abstract class 类名{ 

父类是抽象类,子类是普通类,如果子类继承父类的方法就是重写方法,抽象方法的作用就是这段方法必须存在。

接口 所有方法都是抽象方法

修饰符 interface 接口名{

}

java语言可以实现多个接口

实现  implements

修饰符 class 类名 implements 接口1,接口2.....{

}

一个接口里面有好多抽象方法,在普通类中只重写一部分,要么继续把接下来的方法重写,要么将该类改为抽象类

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值