多态
- 同一方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用(一般是父类或者有关系的类)的类型有很多
- 多态存在条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- 注意:多态是方法的多态,属性没有多态性
- instanceof (类型转换)引用类型,判断一个对象是什么类型
- 动态编译:类型:可扩展性
instanceof
package com.oop.demo09;
public class Application {
public static void main(String[] args) {
//a instanceof A : 判断对象a是否是类A的实例
//Object>String
//Object>Person>Teacher
//Object>Person>Student
//定义的object,真正指向的是Student
Object object=new Student();//当前的对象是一个Student,Object的实际类型是一个Student
/*
//判断能不能编译通过,取决于X跟Y是否存在父子关系,若存在父子关系,则可编译
编译通过后,判断true/false,X引用指向的对象是不是Y的子类,若是,则为true
*/
// 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 new的是一个Student,而 Teacher和Student是同一级的
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);//编译报错
System.out.println("==================================");
Student student=new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person);//true
System.out.println(student instanceof Object);//true
// System.out.println(student instanceof Teacher);//编译报错 没有继承关系
//System.out.println(person instanceof String);//编译报错
}
}
类型转换
package com.oop.demo09;
public class Application {
//instanceof要求对应的两个类有包含关系
public static void main(String[] args) {
//类型之间的转换:父类 子类
//Person:高 Student:低
Person obj = new Student();//低转高 不需要强制转换
//student将这个对象转换为Student类型 ,就可以使用Student类型的方法
// student.go();
// Student student = (Student) obj;
// student.go();
((Student) obj).go();
//子类转换为父类可能会丢失自己本来的一些方法
Student student1 = new Student();
student1.go();
Person person = student1;//student1比person低 低转高
}
}
/*多态
1.父类引用指向子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型:强制转换
4.方便方法的调用,减少重复的代码。简洁
抽象:封装、继承、多态 抽象类 接口
*/
package com.oop.demo09;
public class Student extends Person {
public void go(){
System.out.println("go");
}
}
///*
// //a instanceof A : 判断对象a是否是类A的实例
// //Object>String
// //Object>Person>Teacher
// //Object>Person>Student
// //定义的object,真正指向的是Student
// Object object=new Student();//当前的对象是一个Student,Object的实际类型是一个Student
//
// /*
// //判断能不能编译通过,取决于X跟Y是否存在父子关系,若存在父子关系,则可编译
// 编译通过后,判断true/false,X引用指向的对象是不是Y的子类,若是,则为true
// */
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 new的是一个Student,而 Teacher和Student是同一级的,都继承Person
// 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);//编译报错
//
// System.out.println("==================================");
//
// Student student=new Student();
// System.out.println(student instanceof Student);//true
// System.out.println(student instanceof Person);//true
// System.out.println(student instanceof Object);//true
// // System.out.println(student instanceof Teacher);//编译报错 没有继承关系
// //System.out.println(person instanceof String);//编译报错
//
// */
package com.oop.demo09;
public class Teacher extends Person{
}
package com.oop.demo08;
public class Person {
public void run(){
System.out.println("run");
}