简介:多态

在继承/实现的基础上的一种多种表现,可以是对象多态、行为多态。

package d1;
public class Test {
public static void main(String[] args) {
People p1 = new Student();//对象多态
p1.run();//行为多态
}
}
package d1;
public class Student extends People{
public void run()
{
System.out.println("Student run!");
}
}
package d1;
public class People {
public void run()
{
System.out.println("People run!");
}
}
前提:
注意:多态是针对于方法来说的,并不针对于变量

package d1;
public class Test {
public static void main(String[] args) {
People p1 = new Student();//对象多态
p1.run();//行为多态
System.out.println(p1.name);
}
}
输出结果


缺点:多态下不能直接调用子类的独有功能。

为了解决上面说的多态缺点,提供下面方法。
方法解决:需要调用子类单独的方法时候,进行强制类型转换


可以通过instanceof来进行判断强转哪个类型:

package d2;
public class Test {
public static void main(String[] args) {
People p1 = new Student();//好处1:右边的类型可以随时更换
p1.run();//行为多态
System.out.println(p1.name);
//好处2:可以使用父类作为形参,进而接受所有子类的形参
People p2 = new Teacher();
go(p1);
go(p2);
//正常的强制类型转换
//(Student)p1.study();
Student s1 = (Student)p1;
s1.study();
//崩溃
//People p = new Teacher();
//Student s = (Student)p;// 实际上p是老师类,转换为学生类与原类型不符,报错
}
public static void go(People p)
{
System.out.println("p.name(这个地方提供函数即可)" + "go");
}
}
instanceof的使用:
package d2;
public class Test {
public static void main(String[] args) {
People p1 = new Student();//好处1:右边的类型可以随时更换
if(p1 instanceof Student)
{
Student s2 = (Student)p1;
s2.study();
}
else
{
Student t2 = (Student)p1;
t2.study();
}
}
public static void go(People p)
{
System.out.println("p.name(这个地方提供函数即可)" + "go");
}
}
输出结果







抽象类的引入是为了更好的去支持多态这一语法。
我们常用来给父类设置为抽象类,然后用子类去重写父类的方法,这样可以支持子类的不同行为。多态的原则是编译看左边,运行看右边,而抽象类的引入是为了让编译过掉,而不至于报错,当然抽象类仅仅是解决这一问题的一种方案。
实例:


作用:用来大量解决方法代码重复问题。

举例:写一篇作文《我的爸爸》,首尾相同,正文不同。

注:模板方法+final修饰,可以防止该方法被重写从而导致模板失效问题。

Java提供了一个特殊关键字:interface,用来定义接口。
语法格式:

注:接口不能实例化创建对象,接口是用来被实现类实现的。

接口不能创建对象;接口是用来被类实现的,实现接口的类被称为实现类。

不同于类的继承,一个类可以实现多个接口,必须重写所有接口的全部抽象方法,或者实现类定义为抽象类也可以。

弥补了类单继承的不足,一个类可以同时实现多个接口。

让程序员面向接口编程,让程序员更加灵活的切换各种业务实现。


学生类

学生管理类

学生操作接口

学生操作1类

学生操作2类


默认方法可以在Test中通过类对象的方式调用,也可以在实现类中使用。

私有方法只能在A中的默认方法和A中的其他私有方法中使用。

类方法可以在Test和子类和自己中都可以使用,不过得用类名的方式进行调用。

增强了接口的权限,便于对大量的接口实现类进行维护。




EOF