新手小白学JAVA 面向对象之多态( 三 )


public static void main(String[] args) {
Fruit f = new Fruit();
Apple a = new Apple();
Orange o = new Orange();
get(f);
get(a);
get(o);
}
//只需要创建一个方法 , 就可以执行截然不同的效果
//忽略子类对象的差异统一看作父类类型
public static void get(Fruit f){
f.clean();
}
}
class Fruit{
public void clean(){
System.out.println("水果要洗洗再吃");
}
}
class Apple extends Fruit{
@Override
public void clean(){
System.out.println("苹果需要削皮");
}
}
class Orange extends Fruit{
@Override
public void clean(){
System.out.println("橙子需要剥皮");
}
}
7.3 静态变量和实例变量的区别在语法定义上的区别:静态变量前要加static关键字 , 而实例变量前则不加 。
在程序运行时的区别:实例变量属于某个对象的属性 , 必须创建了实例对象 , 其中的实例变量才会被分配空间 , 才能使用这个实例变量 。静态变量不属于某个实例对象 , 而是属于类 , 所以也称为类变量 , 只要程序加载了类的字节码 , 不用创建任何实例对象 , 静态变量就会被分配空间 , 静态变量就可以被使用了 。总之 , 实例变量必须创建对象后才可以通过这个对象来使用 , 静态变量则可以直接使用类名来引用 。
7.4 向上转型和向下转型在JAVA中 , 继承是一个重要的特征 , 通过extends关键字 , 子类可以复用父类的功能 , 如果父类不能满足当前子类的需求 , 则子类可以重写父类中的方法来加以扩展 。
那么在这个过程中就存在着多态的应用 。存在着两种转型方式 , 分别是:向上转型和向下转型 。
向上转型:可以把不同的子类对象都当作父类来看 , 进而屏蔽不同子类对象之间的差异 , 写出通用的代码 , 做出通用的编程 , 统一调用标准 。
比如:父类Parent,子类Child
父类的引用指向子类对象:Parent p=new Child();
说明:向上转型时 , 子类对象当成父类对象 , 只能调用父类的功能 , 如果子类重写了父类中声明过的方法 , 方法体执行的就是子类重过后的功能 。但是此时对象是把自己看做是父类类型的 , 所以其他资源使用的还是父类型的 。
比如:花木兰替父从军 , 大家都把花木兰看做她爸 , 但是实际从军的是花木兰 , 而且 , 花木兰只能做她爸能做的事 , 在军营里是不可以化妆的 。
向下转型(较少):子类的引用的指向子类对象 , 过程中必须要采取到强制转型 。这个是之前向上造型过的子类对象仍然想执行子类的特有功能 , 所以需要重新恢复成子类对象
Parent p = new Child();//向上转型 , 此时 , p是Parent类型
Child c = (Child)p;//此时 , 把Parent类型的p转成小类型Child
其实 , 相当于创建了一个子类对象一样 , 可以用父类的 , 也可以用自己的
说明:向下转型时 , 是为了方便使用子类的特殊方法 , 也就是说当子类方法做了功能拓展 , 就可以直接使用子类功能 。
比如:花木兰打仗结束 , 就不需要再看做是她爸了 , 就可以”对镜贴花黄”了




推荐阅读