Java的多态

Java的多态

Java的多态


继承是多态的实现基础



Java的多态


引用类型转换:
1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换。
如:Dog dog=new Dog();Animal animal=dog;//正确,自动类型提升,向上类型转换
2.向下类型转换(强制类型转换),是大类型到小类型的转换(存在风险,溢出)
如:Dog dog1=(Dog)animal;//向下类型转换
3.instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。如:
Dog dog=new Dog();
Animal animal=dog;
Cat cat=(Cat)animal;//编译时不会出错(按Cat类型进行编译),但运行时会报错,因为它开辟的是Dog类型的空间,而(无法将引用类型进行转换)无法将dog对象转换成Cat类型,并且此方法对程序的安全性有影响。此时应该利用instanceof和if语句结合使用,进行验证,以保证程序的安全性,如:
if(animal instanceof Cat){//判断animal类中是否包含Cat类型的元素,若包含则进行转换,instanceof返回值为布尔类型
Cat cat=(Cat)animal;}else{
System.out.println("无法进行类型转换");}


Java的多态


1、语法定义:
 抽象类使用abstract关键字修饰,则该类为抽象类。
 2、应用场景:
a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法
b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
 3、作用:
 限制规定子类必须实现某些方法,但不关注实现细节。
 4、使用规则:
a、abstract定义抽象类
b、abstract定义抽象方法,只有声明,不需要实现
c、包含抽象方法的类是抽象类
d、抽象类中可以包含普通的方法,也可以没

抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类。抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类。对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract。 在抽象类中的成员方法可以包括一般方法和抽象方法。
2、抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract。
3、抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象。 抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类。 abstract不能与private、static、final、native并列修饰同一个方法



接口的实现:

接口=全局常量+公共的抽象方法;
接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。

2.接口用interface定义,语法:
[修饰符] interface abstract 接口名 [extends 父接口1,父接口2……]
{//中括号中为可选项
零个到多个常量定义……
零个到多个抽象方法的定义
}

3.接口就是用来被继承、被实现的,修饰符一般建议用public,不能使用private和protected修饰接口。

4.接口中的属性是常量(public static final修饰),系统会自动加上

5.接口中的方法只能是抽象方法(public abstract修饰),系统会自动加上

6.使用接口:一个类可以实现一个或多和接口,实现接口使用implements关键字。java中一个类只能继承一个父类,可以通过实现多个接口作补充

7.继承父类实现接口的语法:
[修饰符] class 类名 extends 父类 implements 接口1,接口2……{
类体部分}//如果继承的是抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法
如果要继承父类,继承父类必须在实现接口之前
接口命名时首字母为I,以区分类名。可通过add继承父接口

8.实现时可以利用接口的引用指向实现了接口的对象,调用其方法,如 :
IPlay ip1=new Psp();ip1.playGame();

9.接口的使用还经常与匿名内部类配合(匿名内部类就是没有名字的内部类,多用于关注实现而不关注实现类的名称)
语法格式:
Interface i=new Interface(){
public void method(){
System.out.print("匿名内部类实现接口的方式……");}}
//即通过创建接口的对象,直接写出实现的方法,再调用此方法
还可以直接创建并调用方法,如:
new IPlay(){
public void playGame(){
System.out.println("……");}}.playGame();