多态
-
动态编译 :类型,可拓展性
-
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
-
一个对象的实际类型是确定的,但可以指向的引用类型有很多(父类或者有关系的类)
-
多态存在的条件
-
有继承关系
-
子类重写父类方法
-
父类引用指向子类对象
-
-
注意:多态是方法的多态,属性没有多态性
package oop.Dome06; public class Applacation { public static void main(String[] args) { /* 一个对象的实际类型是确定的 new Student(); new Person(); 可以指向的引用类型就不确定了:父类的引用指向子类 */ //Student能调用的方法都是自己的或者继承父类的 Student s1 = new Student(); //Person父类,可以指向子类,但不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行那些方法,主要看对象左边的类型,右边的关系不大 // s2.eat;报错,是因为子类里面有的方法在父类里面不存在 ((Student)s2).eat();//强制转换将Person类转换为Student类型 s2.run();//子类重写了父类的方法,就执行子类的方法 s1.run(); } }/* 多态的注意事项 1.多态是方法的多态,属性没有多态 2.父类和子类,有联系,类型转换异常 ClassCastException 3.存在条件:继承关系,方法需要重写,父类引用指向子类Father f1 = new son(); 不能重写 1.static 方法,属于类,他不属于实例 2.final 常量 3.private 方法 */
package oop.Dome06; public class Person { public void run(){ System.out.println("run"); } }
package oop.Dome06; public class Student extends Person { @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } }
eat son son Process finished with exit code 0
-
instanceof 类型转换>引用类型判断一个对象是什么类型
package oop.Dome06; public class Teacher extends Person{ }
package oop.Dome06; public class Student extends Person { }
package oop.Dome06; public class Person { public static void main(String[] args) { } }
package oop.Dome06; public class Applacation { public static void main(String[] args) { //Object>String //Object>Person>Teacher //Object>person>Student Object object = new Student(); //System.out.println(X instanceof Y); 能不能编译过,取决于Y是否属于X System.out.println(object instanceof Student);//ture System.out.println(object instanceof Person);//ture System.out.println(object instanceof Object);//ture 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);//ture System.out.println(person instanceof Person);//ture System.out.println(person instanceof Object);//ture System.out.println(person instanceof Teacher);//false //System.out.println(person instanceof String);//编译报错 System.out.println("===================================================="); Student student = new Student(); System.out.println(student instanceof Student);//ture System.out.println(student instanceof Person);//ture System.out.println(student instanceof Object);//ture //System.out.println(student instanceof Teacher);//编译报错 //System.out.println(person instanceof String);//编译报错 } }
-
package oop.Dome06; public class Student extends Person { public void go(){ System.out.println("go"); } }
package oop.Dome06; public class Person { public void run(){ System.out.println("run"); } }
package oop.Dome06; public class Applacation { public static void main(String[] args) { //类型之间的转换: 基本类型的转换 父>子 //高 低 Person bbj = new Student();//自动转换 //student 将这个对象转换为Student类型,我们就可以使用Student类型的方法了 Student student = (Student) bbj; student.go(); ((Student)bbj).go(); //子类转换为父类,可能丢失自己本来的一些方法 Student student1 = new Student(); student1.go(); Person person1 = student1; } } /* 1.父类的引用指向子类的对象 2.把子类转换为父类,向上转型;自动转换 3.把父类转化为子类,向下转换;强制转换,会丢失一些方法(丢失精度) 4.方便方法调用,减少重复的代码,简洁 */
go go go Process finished with exit code 0
-