前面我们介绍了面向对象一些 封装 ,继承。今天我们继续介绍面向对象最后一个大块,多态。什么是多态,多态是一种事物的多种形态 | 多种表现形式。多态的前提是:类的继承 | 接口实现;所以多态就是父类类型的引用指向子类的对象:
public class Test{
public static void main(String[] args){
Person p = new Student();//父类对象的引用指向子类的对象;
p.test();//输出结果是 "这是子类的方法"
}
}
class Person{
String name;
int age;
public void test(){
System.out.println("这是父类的方法");
}
}
class Student extends Person{
public void test(){
System.out.println("这是子类的方法");
}
}
上面代码最终输出的结果是"这是子类的方法";所以在多态中如果子父类中重写方法,多态调用的是子类中重写的方法。注意的是父类引用对子类的新增内容不可见;当调用的时候只看引用的类型是否存在,存在就能够使用,不存在就报错。
多态调用的是成员:
1.成员变量:
编译运行看父类 : 既代码在编译的时候如果父类中没有的成员变量就报错,同样运行的时候不管子类中有无该同名变量都是运行的是父类。
2.成员方法:
编译看父类,运行看子类
抽象类 被abstract修饰的类
抽象方法被abstract修饰的方法.
可以没有方法体
必须在抽象类中
public abstract class Test02{//抽象类
public abstract void test03(); //抽象方法
}
注意:
1.抽象乐力不能被实例化 | 不能创建对象
2.抽象类使用
具体子类:重写所有的抽象方法 + 按需新增
抽象子类: 抽象子类需要通过具体的子类使用
3.一个抽象方法,一旦被重写过就不需要在重写了
4.抽象类中可以存在普通方法,可以存在抽象方法
5.abstract,不能和private final static native 一起使用
接口 interface
接口特殊的抽象类
interface 接口的有点:
1.接口是功能体的集合
2.是一个引用数据类.多实现
3.解耦。
4.规定开发规范。
JDK在1.7及以前只有
属性:公共的静态的变量
public static final 可以选择省略(默认是)
方法:public abstract 返回值类型 方法名();修饰符也可以省略(默认)
注意:接口的实现与类的继承非常想,但是不一样,子类继承父类就可以直接使用父类的内容,实现类去实现接口的也有用接口中的能力,但是需要实现类自己去实现。implements关键字
2.类只能单继承,接口多实现,一个类需要继承父类后实现接口(也就是一个类同时继承和实现接口的时候 继承要写在接口前面)
3.接口不能实例化
4.接口的使用智能hi通过实现类:
具体的实现类:重写所有抽象方法 + 按需新增
抽象的实现类: 按需重写抽象方法 + 按需新增
5.接口和类之间只能是类去实现接口
6.接口和接口之可以继承 ,类和接口之间只能实现.接口之间可以继承,类和接口之间多实现
7.接口可以实现多态,父接口指向子类对象
public interface interface01 extends interface02,interface03{//接口的多继承
int age = 99;
void play();
}
interface interface02 {
int age = 99;
void study();
}
interface interface03 {
int age = 99;
void rest();
上面代码是接口 ,下面是接口实现
public class Demo01 implements interface01{//实现接口
@Override
public void study() {//对抽象发现的实现
System.out.println("学习使我快乐,活到"+age+"学到"+age);
}
@Override
public void rest() {
System.out.println("休息一下,马上回来!");
}
@Override
public void play() {
System.out.println("在玩游戏!!");
}
}
abstract class Demo02 implements interface01{//实现接口
@Override
public void study() {
System.out.println("学习让我强大");
}
}
class Demo03 extends Demo02{//继承
@Override
public void play() {
System.out.println("玩下游戏");
}
@Override
public void rest() {
System.out.println("休息下");
}
}
代码测试
public class Test {
public static void main(String[] args) {
Demo01 demo01 = new Demo01();
demo01.study();
demo01.play();
demo01.rest();
System.out.println(interface01.age);
System.out.println("================我是分割线===================");
Demo02 demo02 = new Demo03();
demo02.play();
demo02.rest();
demo02.study();
}
}