多态
即同一方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)
多态存在的条件
- 有继承关系
- 父类重写子类方法
- 父类引用指向子类对象
**注意:**多态是方法的多态,属性没有多态性
Application.java
package com.oop;
import com.oop.demo03.Person;
import com.oop.demo03.Student;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的,但可以指向的引用类型就不确定了
//子类能调用的方法都是自己的或者继承父类的
Student s1 = new Student();
//父类可以指向子类,但不能调用子类独有的方法
Person s2 = new Student();//父类的引用指向子类
Object s3 = new Student();
//对象能执行哪些方法主要看对象左边的类型,和右边关系不大
s2.run();//子类重写了父类的方法,执行子类的方法,输出son
s1.run();
//s2.eat();s2无法调用子类独有的方法
}
}
Person.java
package com.oop.demo03;
public class Person {
public void run(){
System.out.println("run");
}
}
Student.java
package com.oop.demo03;
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
这个关键字可以判断两个类之间有没有父子关系
package com.oop;
import com.oop.demo03.Person;
import com.oop.demo03.Student;
public class Application {
public static void main(String[] args) {
// System.out.println(X instanceof Y);//能不能编译通过看X与Y之间是否存在 父子关系
// 结果是否为true看X所指向的类型是不是Y的子类型
Object object = new Student();
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);//编译报错
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(student instanceof String);//编译报错
}
}
类型转换实例
public class Application {
public static void main(String[] args) {
//类型之间的转化
//子类转换为父类可能会丢失自己本来的一些方法
//高 低
Person s1 = new Student();
Person s2 = new Student();
//将student这个类型转换为Student类,就可以使用Student类型的方法了
Student student = (Student) s1;
student.eat();
//或
((Student)s2).eat();
}
}
类型转换的注意事项:
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型,会丢失一部分自己的方法
- 把父类转换为子类,向下转型,强制转换
- 方便方法的调用,减少重复的代码