多态的定义
- java引用变量有两种类型:
1.编译时类型:由于声明该变量的时候使用的类型所决定的;
2.运行时类型:由实际赋值给该变量的对象所决定的 - 如果编译时类型和运行时类型不一样,就可能出现所谓的多态
- 多态的意义:
1.可以替换性:对已存在代码具有可替代性
2.可扩充性:添加新的子类不影响已经存在的类的多态,继承,以及其他特性的运行和操作
多态的应用
1.引用多态(引用有点类似于C语言中的指针)
* 父类的引用可以指向本类的对象:Animal obj1 = new Animal();
* 父类的引用可以指向子类的对象:Animal obj2 = new Dog();Animal obj3 = new Cat();
2.方法多态
obj1.eat(); //调用父类的
obj2.eat(); //子类重写(Dog类中的eat方法)
obj3.eat() //子类重写(Cat类中的eat方法)
引用类型转换
- 向上类型的转换(隐式自动类型转换),是小类型到大类型的转换
Dog obj1 = new Dog();
Animal obj2 = obj1;
- 向下类型转换(强制类型转换),是大类型到小类型的转换.
Dog obj3 = (Dog) obj2;
- 基本类型之间的转换只能在数值之间进行转换
引用类型之间的转换只能在具有继承关系的两个类型之间进行
使用instanceof检测是否可以强制转换
Dog dog = new Dog();
Animal animal = new Animal();
if(animal(需要转换的类型) instanceof Dog(转换的目标类型)){
Dog dog = (Dog) animal;
}
else{
System.out.println("无法类型转换");
}
抽象类和抽象方法
- 抽象方法和抽象类必须使用abstract修饰符类定义,有抽象方法的类只能被定义成抽象类,抽象类中可以没有抽象方法.
- 抽象方法和抽象类的使用方法:
1.使用abstract修饰定义抽象类,抽象方法中不能有方法体.
2.抽象类不能被实例化,不能使用new关键字创建类的实例
3.抽象类可以包含成员变量,方法(普通方法和抽象方法),构造器,内部类(接口,枚举)等几种
4.含有抽象方法的类只能被定义成抽象类.
abstract的几个不能:
1.不能和final同时使用
2.不能修饰成员变量,不能修饰静态变量(不能和static同时使用),不能修饰构造器
3.不能和private同时修饰类和方法
4.抽象方法中不能有方法体.
接口
接口是一种与类相似的结构,只包含常量和抽象方法,接口与抽象类很相似,但两者又有区别:
接口与抽象类区别
抽象类除了包含常量和抽象方法之外,还包含变量和具体方法以及构造器!
接口的特点
- 接口的关键字是
interface
- 接口的修饰符只能是
public
- 接口可以同时继承多个父接口
- 其属性只能是常量,只能用
public static final
做修饰符(参见《java语言程序设计》) - 接口不能用new操作符实例化,即不能用new来new出一个对象!
- 所有方法必须是
public abstract
的实例方法!
public interface T1{
public static final int k =1;
public asstract void p();
}
等价于:
public interface T1{
int k =1;
void p();
}
接口的继承
java中一个类只能继承一个父类,可以通过多个接口来作为补充
一个接口要继承父接口,则使用extend关键字
一个类可以实现一个或者多个接口,实现接口使用implements关键字
如果要继承父类,继承父类必须要在实现接口之前
[修饰符] class 类名 extends 父类 implements 接口 1,接口2...
{
}