多态
一、什么是多态:父类引用指向子类对象(父类型声明的引用类型变量可以找到子类的对象,也就是子类对象的地址给到了父类引用类型的变量)
多态又叫向上转型
二、多态是发生在赋值的时候,多态发生的几种形式:
1、直接多态(直接声明的多态) 父类 变量=new 子类();
2、形参和实参多态 方法参数定义时,使用父类定义,调用方法时,传递子类对象
3、返回值多态 返回值类型定义为父类,返回数据的时候返回子类对象
三、多态的优缺点:
缺点:丢失子类特有的属性,无法调用子类特有的属性,特有属性需要向下转型后,再进行访问
优点:把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,以适应需求的不断变化
四、多态发生的前提条件:必须是在有继承关系的体系中
五、多态调用属性的规则:
1、如果调用的是父类没有的,直接报错,访问不了
2、如果调用的是子类没有的,都访问父类的
3、如果调用的是父类和子类都有的,那么除了成员方法调用子类的之外,其他的都调用父类的,因为成员方法可以覆写。
六、多态如何使用?
1、直接多态 若Animal是父类,Cat是子类,那么Animal a1=new Cat();是直接多态
2、实参形参多态 若Animal是父类,Cat是子类,那么实参形参多态为
Cat c1=new Cat();
m1(c1);
public static void m1(Animal a){
}
相当于Animal a=Cat c1
3、返回值多态
Animal a2=m2();
public static Animal m2(){
return new Cat();
}
4、隐式多态
this类型是当前类类型,也就是this在哪个类中出现,this的类型就是这个类
那么 这里的this 就等于是 SupClass this 那么 this的引用 是子类对象,再结合this 是当前类类型 所以成了这样 SupClass this = new SubClass();
下面的main方法中执行subClass.m1()时,m1方法中的this发生了多态
七、Instanceof与向下转型
多态又叫向上转型,可以看做自动类型转换,从子类到父类
向下转型,可以看做强制类型转换,从父类到子类,必须先发生向上转型
instanceof 判断该对象是否有某个类实例化而来
抽象类
八、Abstract
抽象类往往用来表示设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:动物,它只是一个抽象的概念,并没有一个 “东西”叫做 “动物”。所以,它并不能代表一个实体,这种情况下,我们就适合把它定义成抽象类。
使用abstract 修饰的类,是抽象类, 抽象类的目的 : 该类不能被实例化对象,只能被继承
使用abstract 修饰的方法,是抽象方法,抽象方法没有方法体,只有功能 定义,没有功能实现,用于让子类实现
实现抽象方法,就是给抽象方法加上方法体,去掉abstract修饰
抽象方法一定在抽象类中,但是抽象类中一定有抽象方法是不成立的,也可以没有,如果就想让某个类不能创建对象,也可以把该类创建类抽象类
final与abstract
- final修饰的类不能被继承,
- final修饰的成员方法不能被覆写
而 抽象类 就是用于被继承的,抽象方法就是用于被实现覆写的,所以 final 和 abstract 不能同时出现
- 一个非抽象类如果要继承一个抽象类,必须要实现该类的所有抽象方法
- 一个抽象类如果要继承一个抽象类 ,可以实现 0~N个抽象方法
以下是代码示例:
接口
九、interface
-
接口是一种引用数据类型,可以看做是一种特殊的类,是java为了解决没有多继承引起的功能变弱的问题
-
一个类只能有一个父类,但是可以实现N个接口
-
创建接口的方式 由 class 变成了 interface 而 父子关系 用 extends 变成了 implements
-
类和类 使用extends,并且单继承
-
类和接口 使用 implements 多实现 多个以逗号隔开,比如 class A implements V,C,D
-
并且 非抽象类实现接口后,必须实现所有的抽象方法
-
抽象类实现接口后 可以实现 0~N个抽象方法
-
接口和接口 使用 extends,并且是多继承 比如 interface A extends B,C,D
-
语法 :
public interface 接口名{}
-
1 接口中 所有的变量 默认都是 public static final 的 也就是常量 ,而且 public static final 可以省略
-
2 接口中的方法 默认都是 public abstract 的 也就是抽象方法,而且 public abstract 可以省略
-
3 接口中没有构造方法,不能被实例化对象
-
从 java1.8开始 接口中 可以有 默认方法和 静态方法
-
接口可以看做是一个特殊的抽象类,所以很多时候 接口和抽象类都能做到某一件事
-
优先使用接口,因为 类和接口之间是多实现, 当使用接口之后,还可以保留类的继承
接口如何使用呢?
以下是代码实现:
十、接口和抽象类