19-oop多态
多态
-
动态编译(可扩展性)
-
即同一方法可以根据发送对象的不同而采取多种不同的行为方式。
-
一个对象的实际类型是确定的,但是可以指向对象的引用类型有很多(父类,有关系的类)
public class Person {
public void run(){
System.out.println("run");
}
}
public class Student extends Person{
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
/*
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了: 父类的引用指向子类
Student s1 = new Student(); //Student 能调用的方法都是自己的或父类的
Person s2 = new Student(); //Person 父类型,可以指向子类,但是不能调用子类独有的方法
Object s3 = new Student();
//这就是多态,都是学生可以表现多种状态(Student、Person、Object)
//对象能执行哪些方法,主要看对象左边类型(能否执行看引用类型,执行内容看实际类型)
s2.run();//子类重写了父类的方法,执行子类的方法 输出son
((Student) s2).eat();//强制转换,,Person———》Student 然后就可以调用eat方法
s1.run();//son
}
*/
多态注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系(才能类型转换) 不然会类型转换异常(ClassCastException)
- 存在条件: 继承关系,方法需要重写,父类引用指向子类对象 Father f1 = new Son();
不能被重写的方法:(也就没有多态)
- static 方法,属于类,它不属于实例
- final 常量 (在常量池)
- private 方法
instanseof 和 (类型转换) 引用类型
- instanceof:可以判断两个类之间是否存在父子关系(有关系为true)
- "X instanceof Y" X与Y之间是否有继承关系
/*
Student extends Person
Teacher extends Person
*/
public static void main(String[] args) {
//Object > Person > Student
Object object = new Student();
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
//类型之间的转换 父 子
//Object > Person > Student
//高 低
Person student = new Student();
//将student这个对象转换会Student类型,就可以使用Student类型方法了
((Student)student).go();//高类型 转 低类型 -->强制转换
- 把子类转换成父类,向上转型
- 把父类转换为子类,向下转型:强制转换(可能丢失一些方法)
- 方便方法的调用,减少重复的代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现