Java从入门到精通 第十章 接口、继承与多态

本文深入探讨Java中的接口、继承与多态,解析面向对象设计如何减少代码冗余,重点讲解方法重载、重写规则,类与接口的区别,以及多态机制在父类与子类类型转换中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总算把java基础篇的整完了,接下回顾下java中最重要的核心技术篇. 接口 继承与多态.接口/继承/多态 是面向对象思维设计的一种具体表现,它可以有效的减少代码的冗余性,springMVC中 控制层及业务层 的具体实现就是面向接口开发的,同时通过这一章的学习发现,方法的重载及方法的重写都可以减少代码冗余,同时还有一些细节的问题没有注意到,比如方法的重载中 形参不同+方法名相同即可实现重载.修饰词 返回类型这些相不相同并不影响方法的重载,可见java中是以方法名+形参来加以区分数据的不同的.对于方法的重写继承重写的方法 修饰符一定要比父类的大或者相同,因为重写的东西肯定是越来越具体的。返回的类型也一定要是 父类方法中返回类型的类型或者该类的子类.

类的继承
继承做为面向对象设计的特性之一,在减少代码冗余上有着不小的作用.如通过继承就可以将一些公用的类方法放到公共类中,另外一些不是所有子类通用的接口则 放到接口里面取实现就好了.
在重写父类中方法的时候需要注意2点:

  1. 重写方法的修饰词 必须大于或等于父类方法的修饰权限,否则编译器报错。
  2. 重写方法的返回类型,必须是父类方法返回类型或其类型的子类,否则编译器报错
    在这里插入图片描述

第一种在这里插入图片描述
第二种:在这里插入图片描述

  1. 同时有一点需要注意的是为什么子类对象实例 能够继承父类对象中成员变量及方法,主要原因在于创建子类对象实例的时候,无参构造方法中存在着一个super关键字 默认调用父类无参构造方法,所以子类对象实例才能够调用父类对象中的成员变量及方法.

  2. 同时像finilize方法是用于对象回收处理的方法。所以如果我们创建的是子类对象实例,使用finilize回收对象内存之前,先要把父类对象的finlize()进行对象回收,所以继承的本质上就是父类和子类对象都创建了,回收的时候父类先回收子类再回收的过程.
    Object类(所有类的爸爸)
    Object类时所有类的父类,都有直接或者间接继承了Object类。比如java.lang.math.BigDecimal类是继承自Number类,Number类创建的会默认extend继承Object类.

  3. Object类可以被继承重写的方法.toString().equals().finilze().clone().clone()方法是用于对象复制的.

  4. 其中getClass()+notify()+notifyAll()+wait()方法因为被final修饰 不可以重写.子类可以调用 却没有办法重写,调用都不给调用的那种.
    在这里插入图片描述
    对象类型转换
    对象类型转换主要面向对象那个设计中多态机制的体现。根据不同的转换方式分为向上造型及向下造型.向上造型的意思就是子类对象实例 向上造型转换为父类对象(肯定可以成功 可以这么理解平行四边形一定是四边形).向下造型称为父类对象实例向下造型转换为子类对象(不一定成功,需要保证父类对象实例是 子类对象实例才行 可以通过instanceof实现判断,在进行向下造型的时候 应该养成良好的习惯,确保父类实例是子类实例对象才能向上造型,否则会报错的).

  5. 向上造型:子类对象赋值给父类类型变量,称为向上造型。安全的

  6. 向下造型:父类对象赋值给子类类型变量,向下造型。需要显示强转.

在这里插入图片描述
instanceof
就是为了解决父类对复制给子类类型变量时 向下造型出现的问题。通过instanceof关键字 判断是否为该类对象的实例,是的话返回true,不是的话返回false。在这里插入图片描述
方法的重载
方法的重载是指的方法名相同,方法的参数类型或个数不同称为 方法的重载.
需要注意的是方法的重载对重载方法的修饰符与返回类型并没有说明.(如何参考具体例子的话:比方说 同一个支付,根据方法参数类型的不同,可以分为微信支付+组合支付+积分支付三种类型)

package interfaceandextendsandpolymorphic;

public class OverLoadTest {
	public static int add(int a, int b) {// 定义一个方法
		return a + b;
	}

	/**
	 * 数值相加add方法的重载
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static double add(double a, double b) {
		return a + b;
	}

	/**
	 * 方法重载 参数个数不同
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static int add(int a) {
		return a;
	}

	public static double add(double a, int b) {
		return a + b;
	}
}

从上面书写的过程中发现,类中方法判断是否是同一个 是通过方法名及 方法形参来判断的.同时在方法重载写的过程中发现有个不定长度int …a,说白了就是等价于int[] a,但是参数长度没定下来.

多态机制

向上造型向下造型2种方式,说白了就是父类与子类之间在类型转换上的过程,一般来讲 如果父类就能够满足方法中参数的要求,直接创建父类更好,这样如果子类对象作为参数传入的时候,可以减少同个方法重载,减少代码的冗余性。比如讲阿里巴巴JSON解析组件JSON.parse(Object o)在解析类对象的过程中就是放入Obejct类或者Object都是可以的。

抽象类和接口

  1. 抽象类指的是包含使用abstract修饰的抽象方法的抽象类,可以包含变量常量及普通方法
  2. 接口:接口中只包含抽象方法及常量。没有普通方法和变量。是一种更加纯粹的抽象类。同时也是对抽象类的一种补充,由于抽象类是对行为的抽象描述,有些子类在继承实现抽象方法的时候,有一些抽象方法不需要实现。为了减少单继承造成的抽象类 需要创建多个情况。出现了多实现的接口,对于公共的特性使用抽象类或者类封装,对于个别子类需要用到的功能放到接口。使用interface关键字修饰。

抽象类和接口的区别

  1. 抽象类中存在抽象方法和普通方法,接口只包含抽象方法
  2. 抽象类包含变量及常量,接口只包含常量
  3. 抽象中包含抽象方法及常量变量,而接口只能包含抽象方法和变量
  4. 抽象使用abstract修饰,接口使用interface关键字修饰。抽象类由子类继承重构,接口有其他类实现。
  5. 抽象类是对类别的抽象,接口是对功能的抽象
  6. 抽象类和接口都是对事物描述的一种抽象,但接口的抽象级别更高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值