Java基础-面向对象4
目标
- 理解多态的概念、作用以及使用方式
- 理解对象的类型转换父子之间
- 熟练掌握instanceof关键字
- 理解父类作为方法形参实现的多态
- 理解父类作为返回值实现的多态
多态
多种形态,即为多态,一个行为根据对象的不同,产生不同的操作
两种形式
- 使用夫类型作为方法的形参实现多态
- 使用父类型作为返回值实现多态
为什么使用多态
-
应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
//继承
-
派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性
//多态的真正作用,
注意事项
- 多态是方法的多态,属性没有多态
- 父类和子类有联系,否则会出现类型转换异常
- 多态存在条件:1.存在继承关系 2. 方法需要重写 父类引用只想子类 Fahte f1=new Son();
- 无法重写的方法
- static
- final
- private
小结
- Java中的多态存在于父子类之间
- 必须存在继承关系
- 必须包含方法覆盖
- 父类变量指向子类对象
- 向上转型当使用多态的方式定义变量时,该变量:
- 只能使用父类中定义的方法和属性*
- 不能使用子类中新增的属性和方法*
- 向上转型多态方式定义的变量,在访问重名的变量时,会访问父类的变量。而不使用子类的变量
- 向上转型 多态方式定义的变量,在调用覆盖的方法时,会执行子类覆盖后的方法,而不执行父类的方法
以父类类型当作方法的返回值类型
package javalearning.kkb7oob5Test.DemoReturn;
/**
* @author chenxu
* @date 2020/10/28 - 0:01
*/
public class Master {
public Father ppp(int a){
if (a==2){
return new Dog();
}else if (a==0)
{
return new Cat();
}
else {
return null;
}
}
public static void main(String[] args) {
Master master = new Master();
Father xx = master.ppp(2);
xx.play();
}
}
向上转型
Pet p1=new Dog(); Pet是父类,而Dog是子类
- 父类与子类成员变量名相同时,输出成员变量时,调用父类的的成员变量
2.只能调用父类子类拥有共同的属性和方法时,当子类重写后,调用的是子类重写后的方法
向下转型
-
目的:调用子类特有的属性 和方法。
-
向下转型前提必须先向上转型才能实现
Pet p1=new Dog(); Dog d1=(Dog)p1;
抽象类概述和语法
- 抽象类只能被继承不能被实例化
- 抽象类中可以声明普通和抽象方法
- 抽象方法
- 抽象方法没有方法体:public abstract void eat();
- 此方法在抽象类中无含义,重写有意义;
- 抽象方法必须在子类中被重写,除非子类也是抽象类
- 如果一个类中定义了抽象方法,那么这个类必须修改成抽象类
接口
-
接口中只能包含常量和抽象方法,且必须在实现类中被重写
-
成员变量默认修饰符:public static final
-
接口中的抽象方法可以省略关键字abstract,所有方法默认为抽象方法
-
接口中不能声明变量 普通方法以及构造方法
抽象类中可以存在构造方法,但是抽象类无法实例化,只有在被子类继承实例后才能调用父类的抽象方法
-
接口不能实例化,只能被类实现
-
接口至今啊是extends继承关系
接口与抽象类
- 相同点
- 都可以定义抽象方法
- 都不能直接实例化来创建对象
- 继承抽象类的类以及实现接口的类都必须重写抽象方法,除非该类为抽象类
- 不同点
- 抽象类可以定义构造方法、属性、普通方法,接口不行
- 接口与类之间是实现,抽象类与类之间是继承
- 一个类只能继承一个抽象类,但是可以继承多个接口