复习之java基础---->多态:向上转型
2017-02-24 10:49
302 查看
1.什么是多态,什么是向上转型
java的多态:允许将子类变量赋值给父类对象(参考百度百科)
向上转型:父类对象引用了子类变量(和多态一个意思的)
2.不知道我在说什么?请看以下代码
father f=new son(); (father指的是父类 son指的是子类)
3.作用是啥?
父类可以调用子类中覆盖父类的方法.
4.听不懂我在说什么?
看代码!
一.
package try1;
父类
class father{
public father() {
System.out.println("我是爸爸");
}
public String name="林世杰";
public String age="30岁";
public void money() {
System.out.println("老爸身家10元");
}
public void caharacter() {
System.out.println("勤劳刻苦");
}
}
子类
class son extends father{
public son() {
System.out.println("我是儿子 ");
}
public String name="林困困";
public String age="15";
@Override//这个是一个mark annotation类型,用作标注方法.说明了被他标注的方法是已经重载了父类中的方法,(重载仅限于方法当中,属性不存在重载),并起到断言作用.当我们视图覆盖父类方法时却又写错了方法名,此时由于@override的存在,方法名会报错.
public void money() {
System.out.println("儿子身家100元");
}
public void bycar() {
System.out.println("儿子有汽车");
}
}
测试类
public class one{
public static void money(father f1) {
f1.money();
}
public static void main(String[] args) {
//我给出两组(以money为例:因为money是被子类覆盖掉的):
//第一组没有采用向上转型
father f=new father();
f.money();
//第二组采用了向上转型
father f1=new son();//这就是向上转型:父类变量引用了子类对象
f1.money();
}
}
结果图
第一组没有采用多态:连子类的构造函数都没有输出来
第二组:采用了多态:首先父类的构造和子类的构造都输出来了,而且父类方法变成了被子类覆盖掉的方法.
二.接下来:我只是初始化son类和父类,也没有使用多态看效果!
public class one{
public static void money(father f1) {
f1.money();
}
public static void main(String[] args) {
//接下来:我只是初始化son类和父类,也没有使用多态看效果!
//第一组没有采用向上转型
4000
System.out.println("第一组结果:");
son s=new son();
s.money();
System.out.println("----------分割线------------");
//第二组采用了向上转型
System.out.println("第二组结果:");
father f1=new son();//这就是向上转型:父类变量引用了子类对象
f1.money();
}
}
结果是和使用了多态一样的效果.但是单纯使用子类实例化比使用多态的功能更多:比如子类本身拥有的单独方法和属性
三,另外还有人这么使用多态
将拥有返回值的静态方法中放入父类对象,在输出的时候放入子类对象,结果也是一个多态表现
看一下代码: 我为上述例子爸爸类添加了身高,妻子;但设定儿子有身高方法,没有妻子(即没有妻子方法)------>子类中覆盖了父类方法和没有覆盖父类方法的区别
package try1
class father{
public father() {
System.out.println("我是爸爸");
}
public String name="林世杰";
public String age="30岁";
public void money() {
System.out.println("老爸身家10元");
}
public void character() {
System.out.println("勤劳刻苦");
}
public void hight() {
System.out.println("老爸身高1.75m");
}
public void wife() {
System.out.println("老爸有个漂亮的老妈");
}
}
class son extends father{
public son() {
System.out.println("我是儿子 ");
}
public String name="林困困";
public String age="15";
@Override
public void money() {
System.out.println("儿子身家100元");
}
@Override
public void character() {
System.out.println("勤劳刻苦+聪明能干");
}
@Override
public void hight() {
System.out.println("儿子身高1.8m");
}
public void nowife() {
System.out.println("还是条单身狗");
}
}
运行类
public class one{
public static void money(father f1) {//此处用静态方法引入父类对象
f1.money();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
public static void main(String[] args) {
son s=new son();
money(s);//此处用子类变量替代父类对象,以达到多态效果
}
}
结果图:
结果确实达到了多态方法效果,如果你还没有看明白,我再给你一次对比效果:使用一次显示多态和这个静态方法引用多态做一个对比
测试类
public class one{
public static void money(father f1) {
f1.money();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
public static void main(String[] args) {
son s=new son();
money(s);
System.out.println("--------分割线---------");
//使用一次显示的多态
father f1=new son();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
}
结果图
你看:参数中引用父类对象,实际应用中放入子类变量却也是一种多态.
四.总结:总之记住一句话:父类变量引用子类对象就是一种多态. (引用百度百科的原话:简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针)
今天的多态学习到此!
java的多态:允许将子类变量赋值给父类对象(参考百度百科)
向上转型:父类对象引用了子类变量(和多态一个意思的)
2.不知道我在说什么?请看以下代码
father f=new son(); (father指的是父类 son指的是子类)
3.作用是啥?
父类可以调用子类中覆盖父类的方法.
4.听不懂我在说什么?
看代码!
一.
package try1;
父类
class father{
public father() {
System.out.println("我是爸爸");
}
public String name="林世杰";
public String age="30岁";
public void money() {
System.out.println("老爸身家10元");
}
public void caharacter() {
System.out.println("勤劳刻苦");
}
}
子类
class son extends father{
public son() {
System.out.println("我是儿子 ");
}
public String name="林困困";
public String age="15";
@Override//这个是一个mark annotation类型,用作标注方法.说明了被他标注的方法是已经重载了父类中的方法,(重载仅限于方法当中,属性不存在重载),并起到断言作用.当我们视图覆盖父类方法时却又写错了方法名,此时由于@override的存在,方法名会报错.
public void money() {
System.out.println("儿子身家100元");
}
public void bycar() {
System.out.println("儿子有汽车");
}
}
测试类
public class one{
public static void money(father f1) {
f1.money();
}
public static void main(String[] args) {
//我给出两组(以money为例:因为money是被子类覆盖掉的):
//第一组没有采用向上转型
father f=new father();
f.money();
//第二组采用了向上转型
father f1=new son();//这就是向上转型:父类变量引用了子类对象
f1.money();
}
}
结果图
第一组没有采用多态:连子类的构造函数都没有输出来
第二组:采用了多态:首先父类的构造和子类的构造都输出来了,而且父类方法变成了被子类覆盖掉的方法.
二.接下来:我只是初始化son类和父类,也没有使用多态看效果!
public class one{
public static void money(father f1) {
f1.money();
}
public static void main(String[] args) {
//接下来:我只是初始化son类和父类,也没有使用多态看效果!
//第一组没有采用向上转型
4000
System.out.println("第一组结果:");
son s=new son();
s.money();
System.out.println("----------分割线------------");
//第二组采用了向上转型
System.out.println("第二组结果:");
father f1=new son();//这就是向上转型:父类变量引用了子类对象
f1.money();
}
}
结果是和使用了多态一样的效果.但是单纯使用子类实例化比使用多态的功能更多:比如子类本身拥有的单独方法和属性
三,另外还有人这么使用多态
将拥有返回值的静态方法中放入父类对象,在输出的时候放入子类对象,结果也是一个多态表现
看一下代码: 我为上述例子爸爸类添加了身高,妻子;但设定儿子有身高方法,没有妻子(即没有妻子方法)------>子类中覆盖了父类方法和没有覆盖父类方法的区别
package try1
class father{
public father() {
System.out.println("我是爸爸");
}
public String name="林世杰";
public String age="30岁";
public void money() {
System.out.println("老爸身家10元");
}
public void character() {
System.out.println("勤劳刻苦");
}
public void hight() {
System.out.println("老爸身高1.75m");
}
public void wife() {
System.out.println("老爸有个漂亮的老妈");
}
}
class son extends father{
public son() {
System.out.println("我是儿子 ");
}
public String name="林困困";
public String age="15";
@Override
public void money() {
System.out.println("儿子身家100元");
}
@Override
public void character() {
System.out.println("勤劳刻苦+聪明能干");
}
@Override
public void hight() {
System.out.println("儿子身高1.8m");
}
public void nowife() {
System.out.println("还是条单身狗");
}
}
运行类
public class one{
public static void money(father f1) {//此处用静态方法引入父类对象
f1.money();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
public static void main(String[] args) {
son s=new son();
money(s);//此处用子类变量替代父类对象,以达到多态效果
}
}
结果图:
结果确实达到了多态方法效果,如果你还没有看明白,我再给你一次对比效果:使用一次显示多态和这个静态方法引用多态做一个对比
测试类
public class one{
public static void money(father f1) {
f1.money();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
public static void main(String[] args) {
son s=new son();
money(s);
System.out.println("--------分割线---------");
//使用一次显示的多态
father f1=new son();
f1.character();
f1.hight();
f1.wife();//儿子是单身狗没有wife
}
}
结果图
你看:参数中引用父类对象,实际应用中放入子类变量却也是一种多态.
四.总结:总之记住一句话:父类变量引用子类对象就是一种多态. (引用百度百科的原话:简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针)
今天的多态学习到此!
相关文章推荐
- java语言基础(37)——面向对象(多态中的向上转型和向下转型)
- 2.25 Java基础总结 ①多态②向上向下转型③instanceof
- 黑马程序员_Java基础_03面向对象思想(对象转型注意事项、多态、抽象类、final关键字等)
- java的多态与向上转型
- Java中多态以及向上转型和向下转型
- Java基础复习:初识多态
- Java基础<六>---> 面向对象与java特性(封装、继承、多态
- java 向上转型之后调用子类的同名变量/方法的问题(多态)
- java多态_向上转型的讨论
- java 从零开始,学习笔记之基础入门<抽象类_接口_多态>(十三)
- 再学 JAVA基础(5)对象转型,多态。【子类对象的实例化过程】
- Java 多态部分 向上转型 向下转型
- 【Java基础】——变量向上转型后的实例变量与方法的访问
- Java多态 向上转型 向下转型
- 黑马程序员<java基础<面向对象(封装,继承,多态,抽象)>>
- JAVA基础知识再学习(5)理解多态&向上转型&向下转型
- 黑马程序员 Java基础<二>---> 继承、内部类与多态,包
- Java编程:多态和向上转型
- 黑马程序员 JAVA基础<二> 面向对象之封装 继承 多态
- 关于java的向上转型和多态