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,匿名内部类可以实现接口也可以继承父类,但是不可兼得

原文地址:https://www.cnblogs.com/conglingkaishi/p/9241745.html