接口
接口:初期理解,可以认为是一个特殊的抽象类
当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
class用于定义类
interface 用于定义接口。
接口定义时,格式特点:
1,接口中常见定义:常量,抽象方法。
2,接口中的成员都有固定修饰符。
常量:public static final
方法:public abstract 接口中没有构造方法 接口中的方法只能是抽象方法/或者是default1(默认)方法、static(静态方法)和private(私有)方法。
default方法:默认方法不是抽象方法,用于接口更新,写入新的方法后,不用修改子类代码,实现类可以重写默认方法。
格式 public default void show(){};
记住:接口中的成员都是public的。
接口:是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。
否则子类是一个抽象类。
接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。
------------------------------------------------------------------------------------------------------
多态
/*
多态的三个条件:
1.要有继承/实现
2.方法重写
3.要有父类/接口引用指向子类对象
*/
public class Demo3 {
public static void main(String[] args) {
Animal a=new Dog(); //这种写法就是多态
Dog d=new Dog(); //这种写法就不是多态
a.eat();
}
}
多态的成员访问特点:
1.成员变量的访问特点
编译看左边(父类),运行时也看左边(父类)
大白话父类有就用父类的,父类没有就报错了
2.成员本方法的访问特点
编译看左边(父类),运行看右边(子类)
大白话:子类复写父类方法,执行子类方法
public class Demo4 {
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.a);//打印结果是父类的10
f.show(); //输出结果是子类的Zi
/*
成员变量:看父类,父类有就用 父类没有就报错
成员方法:看父类有没有,父类没有就报错,父类要有才会去调用子类的方法
*/
}
}
class Fu{
int a=10;
public void show(){
System.out.println("Fu...");
}
}
class Zi extends Fu{
int a=5;
@Override
public void show(){
System.out.println("Zi...");
}
}
多态的好处和弊端:
好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,该方法就可以接受父类的任意子类对象。
弊端 不能引用子类的特有方法
多态的应用:
Animal(new Dog());相当于默认有一个Animal a =new Dog();
Animal(new Cat());相当于默认有 Animal a =new Cat();
--------------------------------------------------------------------------
如果在多态里想运用子类的特有方法 可以向下转型:
Instanceof 关键字:判断引用变量类型具体是什么类型