目录
一、多态
-
多态的使用场景
解析:
1.在继承关系中,当多个子类有相同的行为方法时,调用者并不确定具体的对象,此时我们可以使用多态来解决。
2.Java实现多态有 3 个必要条件:继承、重写和向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中的某些方法进行重写,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
特别注意:上述三步缺一不可,不然就不构成多态体系。
二、Java中的抽象的概述:
-
抽象类的概述:
解析:
1.一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。
2.一个类被abstract关键字修饰,那么这个类就是一个抽象类。
3.一个抽象类可以含有或者不含有抽象方法。
-
抽象类的语法定义:
语法定义:
public abstract class 类名字 {
}
-
抽象方法的概述:
解析:
1.一个方法使用 abstract 来修饰,则说明该方法是抽象方法,抽象方法只有声明没有实现,也就是没有方法体。
特别注意: abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。
-
抽象方法的语法定义:
语法定义:
修饰符 abstract 返回值类型 方法名 (参数列表);
代码演示:
public abstract void add();
-
使用抽象类与抽象方法的注意事项:
抽象类使用注意事项:
解析:
1.抽象类不能创建对象,如果创建,编译无法通过。只能创建其抽象子类的对象。
2.抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
4.抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过。
5.抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。
6.抽象类中不一定有抽象方法,但是有抽象方法的类必被定义为抽象类。
抽象方法的使用注意事项:
解析:
1.抽象方法没有方法体。
2.抽象方法必须存在于抽象类中。
3.子类重写父类时,必须重写父类所有的抽象方法。
4.抽像方法必存在于抽象类中,而抽象类中不一定有抽象方法。
5.在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。
-
抽象类与抽象方法的使用场景:
解析:
1.当所属类中有抽象方法时,就必须使用抽象类。
2.当父类中的某些方法,必须要子类进行方法重写时,可使用抽象类与抽象方法
3.使用抽象的前提是两个类之间必须存在继承关系。
三、模板模式思想
-
模板模式的概述及作用:
解析:
1.由抽象类延伸而来的一种思想模式。
2.模板顾名思义就是用来做模板的,它的作用就像是我们所学的各类计算公式,体现的是一个通用性。
特别注意:在使用模板时切记要使用抽象类,迫使其子类必须重写其中的抽象方法,否则就将毫无意义。
-
模板模式的代码演示:
案例:在动物世界中有猫类与犬类,他们的生存方式都大体一致,只有细节上的不统一,我们可以动物看做一个抽象类,里面有属性name,type,age,行为方法:生存方法,吃饭方法。使用模板模式实现具体代码如下:
Animal动物抽象类:不同的动物吃的东西不一样子,因此将其定义为抽象方法,让其子类重写。
package com.feisi.week3.day2;
/**
* @author 14491
* @version 1.0.0
* @description TODO
* @date 2022/7/26 16:48
*/
public abstract class Animal {
String name;
String type;
int age;
public Animal() {
}
public Animal(String name, String type, int age) {
this.name = name;
this.type = type;
this.age = age;
}
// 动物的生存方法
public void survival() {
System.out.println(name +" " + type +" "+ "年龄为:" +age);
System.out.println("睡觉,休息");
eat();
System.out.println("繁衍");
}
// 吃饭的抽象方法
public abstract void eat();
}
两个子类:Dog与Cat
package com.feisi.week3.day2;
/**
* @author 14491
* @version 1.0.0
* @description TODO
* @date 2022/7/26 17:00
*/
public class Dog extends Animal{
public Dog() {
}
public Dog(String name, String type, int age) {
super(name, type, age);
}
// 重写父类方法
@Override
public void eat() {
System.out.println(name+"吃骨头!!!");
}
}
package com.feisi.week3.day2;
/**
* @author 14491
* @version 1.0.0
* @description TODO
* @date 2022/7/26 17:03
*/
public class Cat extends Animal{
public Cat() {
}
public Cat(String name, String type, int age) {
super(name, type, age);
}
// 重写父类抽象方法eat()
@Override
public void eat() {
System.out.println(name+"吃鱼");
}
}
测试类:
package com.feisi.week3.day2;
/**
* @author 14491
* @version 1.0.0
* @description TODO
* @date 2022/7/26 17:05
*/
public class AnimalTest {
public static void main(String[] args) {
// 创建猫类对象 并向上转型
Animal cat = new Cat("小花猫","猫科动物",5);
DuoTai(cat);
// 创建狗类对象 并向上转型
Animal dog = new Dog("二哈","犬科动物",2);
DuoTai(dog);
}
// 由传入的参数对象 决定调用的子类方法 体现多态思想
public static void DuoTai(Animal animal){
animal.survival();
}
}
运行结果:
-
模板方法总结:
解析:
1.由上述案例可以看出,模板模式的优势是,模板已经定义了通用架构,使用者只需要关心自己需要实现的功能即可!非常的强大!