1.多态性
1.1多态的概念
多态——面向对象的三大特征之一;在java中引用变量有两个类型,一个是编译时类型,另一个是运行时类型。编译时类型由声明该变量时使用的类型所决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,那就会出现多态。
建议:大家看完概念后,再去看看代码,然后再回来读一遍概念,会有更深层的体会的。
1.2多态的代码讲解
请大家结合注释认真看代码、写代码,代码如下:
//父类
class Father{
public int age = 40;
public void remember(){
System.out.println("父类Father的remember方法");
}
public void work() {
System.out.println("父类Father独有的work方法");
}
}
//子类
public class Son extends Father {
public String age = "20";
//重写父类的remember方法
public void remember() {
System.out.println("子类Son重写的remember方法");
}
//子类独有的方法
public void study() {
System.out.println("子类Son独有的study方法");
}
public static void main(String[] args) {
//编译类型与运行类型一致
Father father = new Father();
//访问父类的变量age并输出
System.out.println(father.age);
//调用父类的方法remember
father.remember();
//运行父类的独有work方法
father.work();
//编译类型与运行类型一致
Son son = new Son();
//访问子类的age变量
System.out.println(son.age);
//运行子类重写后的remember方法
son.remember();
//运行子类独有的study方法
son.study();
//多态产生,编译类型是Father类,但是实际的运行类型却是Son类
Father polymorphism = new Son();
//实例变量并没有多态性,输出父类的age的值
System.out.println(polymorphism.age);
//方法具有多态性,执行运行类型Son的重写后的remember方法
polymorphism.remember();
//运行编译类型Father独有的work方法,但子类独有的study方法却无法调用,因为编译类型中没有该方法
polymorphism.work();
}
}
执行结果如下:
40
父类Father的remember方法
父类Father独有的work方法
20
子类Son重写的remember方法
子类Son独有的study方法
40
子类Son重写的remember方法
父类Father独有的work方法
1.3对代码的图解
2.instanceof运算符
2.1instanceof运算符的使用格式
一个引用类型变量 instanceof 一个类(或接口)
2.2instanceof运算符的作用
Instanceof运算符用于判断前面的对象是否是后面的类、子类、实例,如果是,则会返回true,如果不是则会返回false。
在进行强制类型转换时,可以先用instanceof运算符判断一下是否可以进行类型转换。
具体代码使用看下一部分的代码。
3.引用变量的强制类型转换
3.1强制类型转换概念
因为引用变量只能调用他编译时类型的方法,而不能调用其运行时类型的方法;所以,如果需要让这个引用变量调用他运行时类型的方法时,必须进行类型转换。
在使用instanceof运算符确定可以进行类型转换后,使用这种格式:(转换后的类型)变量;就可以进行类型转换。
3.2代码示例
代码如下:
public class Son{
public static void main(String[] args) {
//double类型的变量num
double num = 2.23;
//数值之间的强制类型转换,转换为int
int change = (int)num;
//输出2.23
System.out.println("double类型的变量:" + num);
//输出2
System.out.println("进行类型转换后的int类型:" + change);
Object object = "Object类型变量";
//object类型是所有类型的父类,可以进行String类型的转换,输出true
System.out.println(object instanceof String);
String str = (String)object;
System.out.println(str);
}
}
运行结果如下:
double类型的变量:2.23
进行类型转换后的int类型:2
true
Object类型变量