java面向对象1-继承与多态
1.子类可以调用父类public、protected、包权限的方法
但是父类不可以调用子类的特有方法(子类的特殊性)
public class Manager extends Employee{
private double bonus;
public void setBonus(double bonus){
this.bonus = bonus;
}
public static void main(String[] args) {
Manager boss = new Manager(); //纯子类变量(同理:纯父类变量左右都是父类)
Employee staff = boss; //上转型变量(左边是父类,右边是子类),staff和boss引用同一个变量,但是编译器将staff看成一个Employee对象
boss.setBonus(100); //OK。子类调用子类方法
staff.setBonus(100); //ERROR。setBonus方法是子类独有的,不能通过上转型对象和父类对象调用,只能通过子类对象调用。
}
}
2.静态绑定与动态绑定
以调用x.f(arg)为例,隐式参数x为类C的一个对象。
①静态绑定(编译阶段绑定)
如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道调用哪个方法。
此时调用方法只用考虑x的类型(若在类C中找不到f 方法,则向其父类中找),不需要考虑类C的子类(因为这几种修饰的方法都不能被继承)
只有静态绑定成功,即编译通过了,才能进入运行阶段
②动态绑定(运行阶段绑定)
如果调用的方法依赖于隐式参数的实际类型,那么必须在运行时使用动态绑定
虚拟机必须调用与x所引用对象的实际类型对应的那个方法
例如:x的实际类型是D,它是C类的子类
1 C x = new D()
如果:D类定义了方法f(String),就直接调用它;
否则:将在D类的超类(父类)中寻找f(String),以此类推。
3.阻止继承:final类和方法
4.父类子类转换
①向上转型:子类型->父类型,又被称为自动类型转换
②向下转型:父类型->子类型,又被称为:强制类型转换
进行强制类型转换的唯一原因是:
在暂时忽视对象的实际类型之后,使用对象的全部功能。
1 Employee[] staff = new Employee[3];
2
3 staff[0] = new Manager(); //上转型对象
4 staff[1] = new Employee(); //父类对象
5 staff[2] = new Employee();
6
7 Manager boss = (Manager) staff[0]; //下转型对象,强制类型转换,使用对象的全部功能, 上转型对象staff[0]不能使用Manager类中的setBonus方法
8
9 //但是不能将父类对象强制类型转换为子类对象
10 Manager boss2 = (Manager) staff[1]; //ERROR
11
12 //可以在将超类转换为子类之前,使用instanceof进行检查
13 if(staff[1] instanceof Manager){
14 boss2 = (Manager) staff[1];
15 }
在一般情况下,应该尽量少用强制类型转换和instanceof运算符。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)