day09 面向对象03 : 接口,多态 -> java基础大神进阶学习总结之19天(知识点全面覆盖,细节)

java基础总结


day09 面向对象03 : 接口,多态

1.接口的定义与基本使用

接口的定义:

  • 接口的作用为用来规范某些(个)特定方法的编写

    防止多个程序员开发导致方法的命名规范不同而使可读性低下

  • 接口是一种约定规范,是多个抽象方法的集合。仅仅只是定义了应该有哪些功能,本身不实现功能,至于每个功能具体怎么实现,就交给实现类完成。

  • 接口中的方法是抽象方法,并不提供功能实现,体现了规范和实现相分离的思想,也体现了组件之间低耦合的思想。

接口的基本使用:

 public	interface  接口名{
//抽象方法1();
//抽象方法2();
//抽象方法2();
}

接口中的方法都是公共的抽象方法,等价于

public interface IWalkable {
	public abstract void walk();
}

拓展: 从Java8开始, Java支持在接口中定义有实现的方法, 如:

public interface IWalkable {
	public abstract void walk();//抽象方法
    

    default void defaultMethod(){
        System.out.println("有默认实现的方法, 属于对象");
    }
    static void defaultMethod(){
        System.out.println("有默认实现的方法, 属于类");
    }

}

接口实现类用法:

public class 类名 implements 接口名{
	//覆盖接口中抽象方法
}

注意:

  • 根据方法覆盖原则:子类方法的访问修饰符必须大于等于父类方法的访问修饰符,接口中的方法都是public修饰的,所以实现类中的方法只能使用public修饰。
  • 实现类可以继承父类,也可以同时实现多个接口

2.多态的定义与基本使用

关于多态–龙哥的经典语录:

  • 什么是多态:对象具有多种形态,对象可以存在不同形式
  • 多态的特点:把子类对象赋给父类变量,在运行时期会表现出具体的子类特征
  • 多态的作用:当把不同的子类对象都当作父类对象来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,以适应需求的不断变化。

面向接口多态编程思想:真正开发项目时,将实现类赋给接口,接口引用变量调用方法,举列子;鱼继承了游泳的接口,游泳的引用变量执行很多子类方法,当要修改功能,将鱼改为鲸鱼,此时只需要改变引用变量,其他变量名以及方法名不需要改。

多态的定义:

​ 一个类具有多个类的状态,一个父类除了具有自己的状态字段,还具有当时运行类型的对象状态方法

多态的产生:

Dog 	d 	= 	new Dog();  	//创建一只狗对象,赋给子类类型变量
Animal  a  	=	new Cat();    	//创建一只猫对象,赋给父类类型变量

Animal a = new Cat(); //创建一只猫对象,赋给父类类型变量

此时对象(a)具有两种类型:

  • 编译类型:声明对象变量的类型——>Animal

  • 运行类型:对象的真实类型 ——>Dog

当编译类型和运行类型不一致的时候,此时多态就产生了:

注意:编译类型必须是运行类型的父类或接口。

所谓多态,表示一个对象具有多种形态。

Animal	a = null;
a   =  new    Dog();	//	a此时表示Dog类型的形态
a   =  new    Cat();	//	a此时表示Cat类型的形态

a = new Dog(); // a此时表示Dog类型的形态

a = new Cat(); // a此时表示Cat类型的形态

多态的前提,可以是继承关系(类和类),也可以是实现关系(接口和实现类),在开发中,一般都指接口和实现类之间的关系,什么是多态?

一言以蔽之:父类引用变量指向于子类对象,调用方法时实际调用的是子类的方法。

多态操作:

​ 操作继承关系(开发中不是很多):

父类 变量名 = new 子类();java
变量名.方法();

操作实现关系(开发中最频繁):

接口 变量名 = new 实现类();
变量名.方法();

多态的运行流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZxjFVFP-1596873967032)(img\多态运行流程.png)]

3.多态的好处

面向接口编程,体现的就是多态,其好处:把实现类对象赋给接口类型变量,屏蔽了不同实现类之间的实现差异,从而可以做到通用编程

4.类型转换和instanceof运算符

自动类型转换:把子类对象赋给父类变量(多态)

Animal a = new Dog();
Object  obj = new Dog();	//Object是所有类的根类

强制类型转换:把父类类型对象赋给子类类型变量(前提:该对象的真实类型应该是子类类型)

当多态时要使用子类特有的方法时用强转

Animal a = new Dog();
Dog	d = (Dog) a;	//正确
Cat c = (Cat) a;	//错误

instanceof 运算符:判断该对象是否是某一个类的实例,在开发中运用不是很多

语法格式:boolean b = 对象A   instanceof  类B;  //判断 A对象是否是 B类的实例?如果是,返回true

代码如下:

Animal a = new Dog();
System.out.println(a instanceof Animal);	//true
System.out.println(a instanceof Dog);		//true
System.out.println(a instanceof Cat);		//false

猜你喜欢

转载自blog.csdn.net/weixin_41340417/article/details/107881262