java继承之四(多态)
多态:实现动态编译,也就代码的类型只有在执行的时候才能确定,在写代码阶段确定不了,这样可以让代码的可扩展性更强。
同一方法,可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态的存在条件:
有继承关系
子类重写父类方法
父类引用指向子类对象
注:属性没有多态
public class Main { public static void main(String[] args) { //一个对象的实际类型是确定的,如: //new Studed //new Person //但是可以指向的引用类型就不确定了 ,父类的引用指向子类 //下面的实际类型是Studed(),这是确定的,但是他的引用类型可以指向他任意父的类 //Studed:能调用的方法都是自己的或者继承父类的 Studed s1=new Studed(); //Person:父类型,可以指向子类,不能调用子类独有的方法 Person s2=new Studed(); Object s3=new Studed(); //正常情况下我们要调用父类的方法要使用s2的方式去调用 s2.run();//子类不重定父类方法时,这个s2调用的时父类的方法,但是当我们子类重写父类的方法时,他们调用的是子类的方法 s1.run();//调用子类的run方法 //总结:当我们父类(Person)和子类(Studed)有一样的方法时,s2调用的时子类的,当我们父类(Person)有的方法子类没有时,那s2调用的是父类的方法 //而当子类有的方法父类没有时,s2是不能去调用的,所以对象能执行那些方法,主要看左边有那些类,和右边的对象类型关系不大 //如:Person s2=new Studed();这个对象,我们即可以调用 父类中的方法也可调用子类中的方法,只不过当子类有重写父类方法中,s2调用的就变成了的方法了 } } //子类 class Studed extends Person{ public void run(){//重写父类方法 System.out.println("run()1"); } public void shoe(){ System.out.println("shoe()"); } } //父类 class Person { public void run(){ System.out.println("run()"); } }

多态的注意事项:
1.多态是方法的多态,属性没有多态。
2.父类和子类,有联系 类型转换异常 ClassCastException!
3.存在的条件:存在继承关系,方法要重写,父类引用指向子类对象,详解:当我们父类(Person)和子类(Studed)有一样的方法时,s2调用的时子类的,当我们父类(Person)有的方法子类没有时,那s2调用的是父类的方法,而当子类有的方法父类没有时,s2是不能去调用的,所以对象能执行那些方法,主要看左边有那些类,和右边的对象类型关系不大,如:Person s2=new Studed();这个对象,我们即可以调用 父类中的方法也可调用子类中的方法,只不过当子类有重写父类方法中,s2调用的就变成了的方法了
3.1:不能重写的方法:static :属于类的,不属于实例
3.2:finol :常量,不可改变的
3.3:private方法:这三种修饰符修改的方法是不能被重写的,所以也就不能实现多态。
多态:
理解多态性:可以理解为一个事物的多种形态


何为多态性:对象的金矿性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)。
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法------虚拟方法调用
对象的多态性只适用于方法,不适用于属性,属性是不存在多态性(编译和运行都看左边),而方法的时候是(编译看左边运行看右边)
个人理解:多态就是先创建一个父类和一个或多个子类,子类继承父类并重写父类方法,然后在测试类中创建父类的形参方法,并调用父类中的需要输出的方法,并在测试类的main方法中调用,就可以调用任意子类
注:在使用多态的时候,子类继承了父类,但没有重写父类的方法,他只能调用用父类方法:比如:你的父类定义了一htip()的方法,但子类没有重写htip()这个方法,在测试类中调用htip()方法,他只能调用用父类中的htip(),但果子类重写了htip()的方法测试类中就会调用子类重写的方法

如果没有多态,上面的例子就要造很多重载的方法

浙公网安备 33010602011771号