Java的多态浅谈

摘要: Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态。其中,抽象,封装,继承能够说多态的基础,而多态是封装,继承的具体表现。若是非要用专业术语来描述什么是多态的话 多态是指程序中定义的引用变量所指向具体类型和经过该引用变量发出的方法调用在编译的时候并不肯定,而是程序运行期间才肯定,就是说一个引用变量到底指向哪个类的实例对象,该引用变量发出的方法调用哪个类的中的方法,必须在程序运行期间才能肯定。编程

概述设计模式

Java的四大基本特性:抽象,封装,继承和多态。其中,抽象,封装,继承能够说多态的基础,而多态是封装,继承的具体表现。若是非要用专业术语来描述什么是多态的话

多态是指程序中定义的引用变量所指向具体类型和经过该引用变量发出的方法调用在编译的时候并不肯定,而是程序运行期间才肯定,就是说一个引用变量到底指向哪个类的实例对象,该引用变量发出的方法调用哪个类的中的方法,必须在程序运行期间才能肯定。
记得大学时老师讲多态举的一个例子:上课铃响了,同窗们都回各自教室上课,这就是多态。这就完了?若是是刚接触编程的同窗来讲,估计都懵逼了,咱们那时就是这种状态。接下来咱们用代码实现下老师说的意思。
多态实例
//上课铃响了
public class Ring
{
[Java] 纯文本查看 复制代码
?函数

public void ringSound()/size/color{设计

System.out.println("我是铃声!!!");

}code

}
1班的同窗听到铃声回去上语文课
public class ClassRoom1 extends Ring
{
[Java] 纯文本查看 复制代码
?对象

public void ringSound()
{继承

System.out.println("classRoom1的同窗听到铃声上语文了!!!");

}
}
2班的同窗听到铃声回去上英语课
public class ClassRoom2 extends Ring
{
[Java] 纯文本查看 复制代码
?编译

public void ringSound()
{class

System.out.println("classRoom2的同窗听到铃声上英语了!!!");

}
}
Main类
public class Main
{
[Java] 纯文本查看 复制代码
?基础

public static void main(String[] args)
{

Ring ring = new ClassRoom1();
Ring ring1 = new ClassRoom2();
ring.ringSound();
ring1.ringSound();

}
}
输出
classRoom1的同窗听到铃声上语文了!!!
classRoom2的同窗听到铃声上英语了!!!
这就是一个简单的的多态例子,咱们从中不难发现,多态存在的几个关键点,
有继承关系(extends)
子类重写父类方法(ringSound)
父类引用指向子类对象 Ring ring = new ClassRoom1()
如今咱们改下例子,看出现什么状况
public class Ring
{
[Java] 纯文本查看 复制代码
?

public static void ringSound()/size/color{

System.out.println("我是铃声!!!");

}

[Java] 纯文本查看 复制代码
?

}

这时发现ClassRoom1 和 ClassRoom2 都报错了,那咱们也给他们都加上static

public class ClassRoom1 extends Ring
{

[Java] 纯文本查看 复制代码
?

public static void ringSound()
{

System.out.println("classRoom1的同窗听到铃声上语文了!!!");

}

}
ClassRoom2类
public class ClassRoom2 extends Ring
{
[Java] 纯文本查看 复制代码
?

public static void ringSound()
{

System.out.println("classRoom2的同窗听到铃声上英语了!!!");

}
}
预编译没报错了,那么输出应该是刚才的结果,main函数跑起来,输出
我是铃声!!!
我是铃声!!!
能够发现,结果并非咱们所想的那样。咱们能够得出一个结论:在Java中static修饰的函数不能被子类重写。
其实Java中,父类含有一个静态函数,并且在他的子类也一样有一个返回类型,函数名,参数列表都相同的静态函数,子类实际上只是将父类中的该同名函数进行隐藏,而非重写,他们两个是彻底没有关系的函数,因此他们的行为并不具备多态性。
注意:就是被final修饰的父类函数是没法被重写和private修饰的父类函数没法被继承。这是Java的规定,就不在举例说明
多态的做用
说了这么多,多态有什么做用
解耦,各类设计模式大可能是基于多态实现的
复用性,子类处理父类便可
扩充和维护
多态缺点:不能使用子类的特有属性和行为。
多态分类
为了肯定执行多态函数的哪个,因此有两种状况:编译时多态,运行时多态
函数重载都是编译时多态,根据实际参数的数据类型,个数和顺序,Java在编译时就可以肯定执行重载函数中的哪个。
函数重写表现出两种多态性,当对象引用本类实例时,为编译时多态,不然为运行时多态。
public class Ring
{
[Java] 纯文本查看 复制代码

public void ringSound()
{

System.out.println("我是铃声!!!");

}
花木兰替父亲花弧从军。那么这时候花木兰是子类,花弧是父类。花弧有本身的成员属性年龄,姓名,性别。花木兰也有这些属性,可是很明显两者的属性彻底不同。花弧有本身的非静态成员方法‘骑马杀敌’,一样花木兰也遗传了父亲同样的方法‘骑马杀敌’。花弧还有一个静态方法‘自我介绍’,每一个人均可以问花弧姓甚名谁。同时花木兰还有一个本身特有的非静态成员方法‘涂脂抹粉’。可是,如今花木兰替父从军,女扮男装。这时候至关于父类的引用(花弧这个名字)指向了子类对象(花木兰这我的),那么在其余类(其余的人)中访问子类对象(花木兰这我的)的成员属性(姓名,年龄,性别)时,其实看到的都是花木兰她父亲的名字(花弧)、年龄(60岁)、性别(男)。当访问子类对象(花木兰这我的)的非静态成员方法(骑马打仗)时,其实都是看到花木兰本身运用十八般武艺在骑马打仗。当访问花木兰的静态方法时(自我介绍),花木兰本身都是用她父亲的名字信息在向别人做自我介绍。而且这时候花木兰不能使用本身特有的成员方法‘涂脂抹粉’。 -----------多态中的向上造型
那么终于一将功成万骨枯,打仗旗开得胜了,花木兰告别了战争生活。有一天,遇到了本身心爱的男人,这时候爱情的力量将父类对象的引用(花弧这个名字)强制转换为子类对象原本的引用(花木兰这个名字),那么花木兰又重新成为了她本身,这时候她彻底是她本身了。名字是花木兰,年龄是28,性别是女,打仗依然那样生猛女汉子,自我介绍则堂堂正正地告诉别人我叫花木兰。OMG!终于,终于可使用本身特有的成员方法‘涂脂抹粉’了。今后,花木兰彻底回到了替父从军前的那个花木兰了。而且和本身心爱的男人幸福的过完了一辈子。 ------多态中的向下转型
花弧
public class HuaHu
{
[Java] 纯文本查看 复制代码
?

int age = 60;/size/color
String name = "花弧";

String sex = "男";

public void horseKillEnemy()
{

System.out.println("骑马杀敌");

}

public static void suggest()
{

System.out.println("我叫花弧");

}
}
花木兰
public class HuaMuLan extends HuaHu
{
[Java] 纯文本查看 复制代码
?

String name = "花木兰";

int age = 28;

String sex = "女";

public void horseKillEnemy()
{

System.out.println("花木兰骑马杀敌");

}

public void Prettify()
{

System.out.println("花木兰涂脂抹粉");

}
}
替父从军
public class Main
{
[Java] 纯文本查看 复制代码
?

public static void main(String[] args)
{

//替父从军
HuaHu huaHu = new HuaMuLan();
System.out.println("姓名:" + huaHu.name + ",年龄:" + huaHu.age + ",性别:" + huaHu.sex); //其余人

huaHu.horseKillEnemy();

huaHu.suggest();  //用她父亲的名字信息在向别人做自我介绍

//huaHu.Prettify() //没法使用

//  战争结束了
HuaMuLan huaMuLan = (HuaMuLan)huaHu;
//花木兰变回本身
System.out.println("姓名:" + huaMuLan.name + ",年龄:" + huaMuLan.age + ",性别:" + huaMuLan.sex);
//本身特有函数
huaMuLan.Prettify();

System.out.println("幸福的过完了一辈子");

}}输出姓名:花弧,年龄:60,性别:男花木兰骑马杀敌我叫花弧姓名:花木兰,年龄:28,性别:女花木兰涂脂抹粉幸福的过完了一辈子

相关文章
相关标签/搜索