多态
概念: 指的"对象"的多种形态
前提:
1.必须有继承|实现关系
2.要有方法重写
3.父类引用指向子类对象
成员的访问特点
成员变量:编译看左边,运行看左边.
成员方法:编译看左边,运行看右边.
class Fu{
public int number = 10;
public void methodFu(){
sout("!!!!");
}
}
class Zi extends Fu{
public int number = 20;
public int number1 = 20;
public void methodZi(){
sout("???");
}
public void methodFu(){
sout("-----");
}
}
Fu fu = new Zi();
sout(fu.number1);//错误, 因为父类中没有number1,
sout(fu.number);//正确, 10
fu.methodFu();//正确的
``class Fu{
private int number = 10;
int getNumber(){
return number;
}
public void methodFu(){
sout("!!!!");
}
}
class Zi extends Fu{
public int number = 20;
public int number1 = 20;
public void methodZi(){
sout("???");
}
int getNumber(){
return number;
}
public void methodFu(){
sout("-----");
}
}
Fu fu = new Zi();
int number = fu.getNumber();//10
多态的好处和弊端
1.提高程序扩展性:让父类作为方法参数,可以接受这个父类下的任何子类对象
2.弊端:不能再使用子类特有的方法
解决方案:
1.向上转型.多态本身就是向上转型,子类看成父类的过程.
2.向下转型:卸妆的过程,将其从父类转成子类
格式:子类 变量名=(子类)父类的引用;
eg. Animal a = new Dog();
Dog d = (Dog)a;
向下转型一定是一个还原的操作,否则会报类型转换异常(ClassCaseException),
抽象(abstract)
abstract修饰类,称为抽象类,不能直接使用
abstract修饰方法,称为抽象方法,不能有方法体,是一个残缺的方法,必须在抽象类或者接口中.
特点:
1.抽象类中可以有非抽象方法
2.抽象方法必须在抽象类或接口中
3.抽象类不能实例化
4.我们可以定义抽象的子类,重写抽象类的所有抽象方法,使用子类,如果子类不想重写,子类必须定义为冲向累
使用场景:当我们在编写一个方法的时候,发现边写不下去了,原因又可能有多种实现,建议将方法抽象,让子类各自实现.
作用:定义规则和范围,强制所有子类去按照规则做事
接口
//定义类
publice class 类名 {
//成员变量
//成员方法
//构造函数
}
//定义接口
publice interface 接口名{
//常量 默认被 publice static final修饰
//抽象方法 默认被 publice abstact 修饰
}
常量 默认被 publice static final修饰;
抽象方法 默认被 publice abstact 修饰
接口没有构造函数;类和类发生继承关系,使用extends(继承)类和接口发生关系,用implements(实现).
特点:不能直接实例化,重写其实现方法,然后创建实现类去使用
eg.
//定义接口:
publice interFace A{
publice abstract void method();
}
//定义一个类去实现接口
publice class AImpl implements A{
publice void method(){
sout("重写")
}
}
A a=new AImpl();//
接口 变量名 = new 实现类(); 接口不能直接使用,可以使用接口的实现类