多态
- 即同一方法可以根据发送对象的不同而采取多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(父类或者有关系的类)
例如:你的妈妈让你买点水果回来,不管买回来的是香蕉还是西瓜,只要是水果就行,这个就是多态。
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
-
注意:多态是方法的多态,属性没有多态性。
父类引用指向子类对象,如:Person p = new Student();
多态中,编译看左边,运行看右边。
实例:
Application:
package com.oop.demo02; import com.oop.demo05.Person; import com.oop.demo05.Student; public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 //可以指向的引用类型就不确定了 : 父类的引用指向子类 //Student 能调用的方法都说自己的或者继承父类的! Student s1 = new Student(); //Person 父类型:可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行那些方法,主要看对象左边的类型,和右边关系不大! s2.run();//子类重写了父类的方法,执行子类的方法 s1.run(); } }
Person:
package com.oop.demo05; public class Person { public void run(){ System.out.println("run"); } } /* 多态注意事项: 1、多态是方法的多态,属性没有多态 2、父类和子类,有联系 类型转换异常! ClassCastException 3、存在条件:继承关系,方法需要重写,父类的引用指向子类对象! Father f1 = new Son(); 那些方法不能被重写: 1、static方法,属于类,他不属于实例 2、final常量 3、private方法; */
Student:
package com.oop.demo05; public class Student extends Person{ @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } }
-
多态的注意事项
1、多态是方法的多态,属性没有多态
2、父类和子类,有联系 类型转换异常! ClassCastException
3、存在条件:继承关系,方法需要重写,父类的引用指向子类对象! Father f1 = new Son(); -
那些方法不能被重写:
1、static方法,属于类,他不属于实例
2、final常量
3、private方法;
-
-
instanceof类型转换(引用类型)
示例:
Application:
package com.oop.demo02; import com.oop.demo05.Person; import com.oop.demo05.Student; import com.oop.demo05.Teacher; public class Application { public static void main(String[] args) { //Object > String //Object > Person >Student Object object = new Student(); // System.out.println(X instanceof Y);//能不能编译通过! System.out.println(object instanceof Student);//true System.out.println(object instanceof Person);//true System.out.println(object instanceof Object);//true System.out.println(object instanceof Teacher);//false System.out.println(object instanceof String);//false System.out.println("============================"); Person person = new Student(); System.out.println(person instanceof Student);//true System.out.println(person instanceof Person);//true System.out.println(person instanceof Object);//true System.out.println(person instanceof Teacher);//false // System.out.println(person instanceof String);//编译报错! } }
Person:
package com.oop.demo05; public class Person { public void run(){ System.out.println("run"); } }
Teacher:
package com.oop.demo05; public class Teacher extends Person{ }
Student:
package com.oop.demo05; public class Student extends Person{ public void go(){ System.out.println("go"); } }
实例2:
Application:
package com.oop.demo02; import com.oop.demo05.Person; import com.oop.demo05.Student; public class Application { public static void main(String[] args) { //类型之间的转换:父 --》 子 //高 //低 Person obj = new Student(); //student将这个对象转换为Student类型,我们就可以使用Student类型的方法了! // ((Student) obj).go(); Student student = (Student) obj; student.go(); //子类转换为父类,可能丢失自己的本来的一些方法! Student student1 = new Student(); student1.go(); Person person = student1; } } /* 1、父类引用指向子类的对象 2、把子类转换为父类,向上转型; 3、把父类转换为子类,向下转型:强制转换 4、方便方法的调用,减少重复代码!简洁 */
小结
1、父类引用指向子类的对象
2、把子类转换为父类,向上转型;
3、把父类转换为子类,向下转型:强制转换
4、方便方法的调用,减少重复代码!简洁