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运算符。

 

posted @   草莓小甜心  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示