Java_多态
Posted HJ0101
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_多态相关的知识,希望对你有一定的参考价值。
什么是多态呢?
在Java程序中,允许不同类的对象对同一消息做出不同的响应.
编译时多态:又叫设计时多态,通过方法重载实现
运行时多态(Java中的多态):程序运行时,决定调用哪个方法
实现多态的前提条件:
必须满足继承关系;
父类引用指向子类实例对象;
向上转型:(隐式转型,自动转型)
父类应用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类特有的方法
小类转型为大类
注意:父类中的静态方法无法被子类重写,所以向上转型后,只能调用到父类原有的静态方法
Animal one = new Cat();
向下转型:(强制类型转换)
子类的引用指向父类对象,此处必须进行强转,可以调用子类特有的方法.
必须满足转型条件才能强转:instaceof运算符:返回true/false
if(one instaceof Cat)//one 是否满足 Cat类型特征 作用:合理规避一些异常的产生;
Cat temp = (Cat)one;
抽象类:
abstract 关键字:限制类的实例化 在我们Java开发中,在Java有的类是不需要实例化的,没有意义的,比如动物是一个父类,实例化一个动物类的对象时没有意义的
abstract class 不允许直接实例化,可以通过向上转型,指向子类实例
当某个父类只知道其子类应该包含怎样的方法,但无法准确知道这些子类是如何具体实现这些方法的时候,
就可以把父类设置为抽象类;
抽象方法:
abstract void eat();抽象方法没有方法体,子类需要重写父类的抽象方法,如果不想重写,
需要将子类设置为抽象类.
抽象方法不能被:static final private 修饰的
注意:包含抽象方法的类必须是抽象类
抽象类可以没有抽象方法
接口 interface:
接口访问修饰符:public 默认
接口中抽象方法可以不写abstract关键字,访问修饰符默认为public
当一个类实现接口时,需要实现接口中得所有抽象方法,否则需要将该类设为抽象类
接口中可以包含常量,默认为 public static final 接口名.常量名 调用,不能被重新赋值
接口中的默认方法和静态方法:jdk 1.8 新增 当类实现接口时可以不必重写
//默认方法
default void eat();{ 方法体 }
//静态方法 static void stop();{ 方法体 } 默认方法重写:
public void eat(){ Animal.super.eat(); }
静态方法是无法重写的.
一个类可以实现多个接口用(,)隔开,必须实现所有的抽象方法
接口的继承:
接口可以实现继承关系,可以继承多个接口,与类的单一继承不一样,可以继承多个父接口
内部类:
在Java当中,允许在一个类的内部,定义另一个类,这样的类叫内部类,可以提供更好的封装手段
分类:
成员内部类: 也称普通内部类,直接定义在类的内部
1.在外部使用时,无法直接对内部类进行实例化,需要借由外部类信息才能实现
2.成员内部类的访问修饰符可以任意,但在使用的时候访问范围会受到影响
3.内部类可以直接访问外部类的成员,如果出现同名属性,优先访问内部类中定义的
4.可以使用外部类.this.成员的方式访问外部类同名的信息
5.外部类访问内部类信息,需要通过内部类实例,无法直接访问
6.内部类编译后.class文件命名:外部类名$内部类.class
静态内部类:(static修饰)
1.静态内部类中,只能直接访问外部类静态成员,否则可以通过外部类对象实例调用外部类非静态成员
2.静态内部类对象实例实例时,可以不依赖外部类对象
3.可以通过外部类.内部类.静态成员的方式,访问内部类的静态成员
4.当内部类属性与外部类属性同名时,默认直接调用内部类的成员
如果需要访问外部类中得静态属性,则可以通过 外部类.属性 的方式;
如果需要方位外部类中的非静态属性,则可以通过 new 外部类().属性 的方式;
方法内部类(局部内部类):
1. 定义在方法内部,作用范围也在方法内
2.和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static修饰
3.类中不能包含静态成员
4类中可以包含final,abstract修饰的成员
匿名内部类:没有名字,隐藏
1.匿名内部类没有类型名称,实例对象名称
2.编译后的文件名: 外部来$数字,class
3.无法使用public,private,protected,static,abstract等修饰
4.无法编写构造方法,但可以添加构造代码块,定义成员属性
5.不能出现静态成员
6,匿名内部类可以实现接口也可以继承父类,但是不可兼得
以上是关于Java_多态的主要内容,如果未能解决你的问题,请参考以下文章