多态
-
一个对象的实际类型是确定的,但可以指向的引用类型就不确定了:父类可以指向子类
-
能调用的方法都是自己的或者继承父类的
-
一切类都继承与Object
-
父类型可以指向子类,但是不能调用子类独有的方法
-
子类重写父类的方法后,通过子类调用出来的这个方法是被重写后的方法
-
对象能执行哪些方法,主要看对象左边的类型,和右边的对象关系不大
-
类型异常转化:有时会强制将父类转化为子类,调用子类中独有的方法
-
有static、final、private等关键字的方法都不能重写
instanceof & 父类强制类型转换
-
instanceof:instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。通俗点理解就是,用这个关键字来判断左边的这个对象是否是右边这个类的一个实例。
-
父类强制转换为子类:
-
此类转换为向下转型,需要强制转换(向上转型则不需要强制转换)
-
强制转换后便可以调用子类中特有的方法
-
package Test1; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub Person a = new Student(); a.run();//run方法被子类Student重写,因此调用的是在子类重写后的方法。 System.out.println(); a.eat(); System.out.println(); ((Student)a).homework();//强制转换,将Person类型转换成Student类型, System.out.println();//因为方法homework是Student独有的,父类无法调用子类中独有的方法。 int d; d = ((Student)a).Weight(); System.out.print(d); System.out.println(); System.out.println("=================="); Person b = new Person(); b.run();//这里因为new的是Person,所以调用的是父类中原来的方法. System.out.println(); System.out.println("=================="); Person s = new Person(); System.out.println(s instanceof Student);//显然,s是属于Person的,不一定是Student的一个实例。 System.out.println(s instanceof Person); System.out.print(s instanceof Object);//所有的类都继承与Objiect,所以返回的布尔值为true。 } } public class Person { int age; int weight; int height; public void eat() { System.out.print("人要吃东西"); } public void run() { System.out.print("人会跑步"); } } public class Student extends Person{ public void run() { System.out.print("学生会跑步"); } public void homework() { System.out.print("学生得写作业"); } public int Weight() { weight = 100; return weight; } }
输出结果:
-
即同一方法可以根据发送的对象不同而采用不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
-
多态存在的条件
-
有继承关系
-
子类重写父类方法
-
父类引用指向子类对象
-
-
注意:多态是方法的多态,属性没有多态性