java中向上转型,向下转型以及多态

先在文章开头简明扼要地提一下:重写=复写=覆盖(关于重写,其实子类的返回类型和父类的不一致有时候也能行,比如协变(子类的返回类型是父类方法返回类型的子类)),它们仨是一回事,和多态有关;隐藏是另一回事,和子父类有关,隐藏只有一种情况,就是子类和父类有相同的静态方法;重载是第三回事,上述提到的限制都没有
在这里插入图片描述
参考资料:Java向上转型的作用(有详细代码介绍)
先来讲一下向上转型,向下转型下次再补充
1.向上转型的格式父类名 父类对象名=new 子类对象()


2.此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法。但是调用的属性还是父类的属性。


3.此时通过父类引用变量无法调用子类特有方法。


4.静态方法和属性都可以被继承和隐藏而不能被重写,因此不能实现多态。非静态方法可以被继承和重写,因此可以实现多态。


5.一句话:访问属性(字段)和静态方法看声明,访问非静态方法看实际对象类型(new出来的类型)


6.简单理解一下动态绑定:在运行时根据对象的类型调用恰当的方法


7.今天做题遇到了一道以前没接触过的题目:

class A {
    void draw() { System.out.println("A.draw()"); }
    A() {
        System.out.println("A() before draw()");
        draw();
        System.out.println("A() after draw()");
    }
}

class B extends A {
    private int b = 1;
    B(int b) {
        this.b = b;
        System.out.println("B(), b = " + this.b);
    }
    void draw() {
        System.out.println("B.draw(), b = " + this.b);
    }
}

public class Test {
    public static void main(String[] args) {
        new B(5);
    }
}

本来以为会输出:

A() before draw()
A.draw()
A() after draw()
B(), b = 5

其实真正的输出为:

A() before draw()
B.draw(), b = 0
A() after draw()
B(), b = 5

这是解释:
1111父类构造器先于子类构造器被调用,所以会先输出A() before draw();
1111调用run()时,虽然子类对象还没生成,但是这里的draw()方法仍然是动态方法,即后期绑定,所以调用的还是子类的draw()方法。另外由于创建对象时,是分配空间+初始化空间的,所以此时b的值为0,于是输出:B.draw(), b=0;除非这个b属性是静态属性而且是声明的时候就已经赋值过了,那么输出的b就不是0了,而是初始赋的那个值。
1111然后接着运行父类构造器,输出A() after draw();
1111最后运行子类构造器,此时子类的各属性都已经被初始化,所以b被赋值,输出:B(), b=5
这是另外一篇讲得比较完整的博文


8.重写(复写):是子类的方法覆盖父类的方法,要求方法名和参数相同
重载:重载是在同一个类中有两个以上的方法,拥有相同的方法名,但是参数不同,对返回值没有要求。最常见的重载例子就是类的构造函数

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值