网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
public void fly(){ System.out.println(age+"fly"); } public Bird(String name,int age,String wing){ super(name,age); this.wing = wing; }
}
public class TestDemo{
public static void main(String[] args) {
//Dag dag = new Dag(“HAHAH”,12);
//Animal animal = dag;
Animal animal1 = new Dag(“HAHAH”,12);
}![](https://img-blog.csdnimg.cn/525985b166b74f37ad03cf15f75be4c5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-eos-mHjQ==,size_20,color_FFFFFF,t_70,g_se,x_16) 什么情况下会发什么向上转型: 1、直接赋值 2、方法传参 3、方法返回 直接赋值的方式我们已经演示了. 另外两种方式和直接赋值没有本质区别 方法传参: ![](https://img-blog.csdnimg.cn/40716fef8db049e4889c627f505209a1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-eos-mHjQ==,size_20,color_FFFFFF,t_70,g_se,x_16) 此时形参 animal 的类型是 Animal (基类), 实际上对应到 Dag (父类) 的实例 方法返回: ![](https://img-blog.csdnimg.cn/3601fc4d9785449fafdb21884a820846.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAS-eos-mHjQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
动态绑定:
动态绑定:
两个前提:
1、父类引用,引用子类的对象
2、通过这个父类引用,调用父类和子类同名的覆盖方法
同名的覆盖方法,术语:重写
重写:
1:方法名相同
2:参数列表校相同(个数+类型)
3:返回值相同
重写必须在父子类的情况下
动态绑定是多态的基础
// Animal.java public class Animal { protected String name; public Animal(String name) { this.name = name; } public void eat(String food) { System.out.println("我是一只小动物"); System.out.println(this.name + "正在吃" + food); } } // Bird.java public class Bird extends Animal { public Bird(String name) { super(name); } public void eat(String food) { System.out.println("我是一只小鸟"); System.out.println(this.name + "正在吃" + food); } } // Test.java public class Test { public static void main(String[] args) { Animal animal1 = new Animal("圆圆"); animal1.eat("谷子"); Animal animal2 = new Bird("扁扁"); animal2.eat("谷子"); } } // 执行结果 我是一只小动物 圆圆正在吃谷子 我是一只小鸟 扁扁正在吃谷子
此时, 我们发现:
animal1 和 animal2 虽然都是 Animal 类型的引用, 但是 animal1 指向 Animal 类型的实例, animal2 指向 Bird 类型的实例.
针对 animal1 和 animal2 分别调用 eat 方法, 发现 animal1.eat() 实际调用了父类的方法, 而 animal2.eat() 实际调用了子类的方法
因此, 在 Java 中, 调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引 用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为 动态绑定
注意事项:
1、方法不可以是static的
2、子类的访问修饰限定符,要大于等于父类的访问修饰限定符
3、private方法,不能重写
4、被final修饰的方法,不能被重写
另外, 针对重写的方法, 可以使用 @Override 注解来显式指定
// Bird.java public class Bird extends Animal { @Override private void eat(String food) { ... } }
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新