0122面向对象3 多态
1、多态
概念:子类引用变量名指向父类对象(前提,在有子父类继承关系或者接口实现的情况下)
(1)格式
父类类型 变量名=new 子类类型();
调用 变量.方法();
(1-1)普通类多态格式定义方法
父类 变量名 = new 子类();
例:
创建一个人类
public class Person {
public int a=1;
public int b=2;
public void eat(){
System.out.println("父类吃饭");
}
public void sleep(){
System.out.println("父类睡觉");
}
}
创建一个学生类
public class Student extends Person {
public int a=10;
public int c=30;
public void eat(){
System.out.println("子类吃饭");
}
public void play(){
System.out.println("子类独有方法");
}
}
多态调用
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Student();
//调用成员变量
System.out.println(p.a);//1
System.out.println(p.b);//2
//System.out.println(p.c);
//调用成员方法
p.eat();
p.sleep();
}
特点:编译期如果父类中有该变量,编译成功,没有该变量,编译失败。运行期:变量值走父类变量值
总结:当调用成员变量时 编译运行都看左边 ,当调用成员方法时,子父类都有的情况下编译看左边,运行看右边,不能调用子类特有的成员变量和成员方法
(1-2抽象类多态定义)
格式:抽象类 变量名 = new 抽象类子类();
例:创建一个抽象animals类
public abstract class Animal {
public void get() {
System.out.println("父类吃饭");
}
}
创建一个普通狗类继承这个抽象动物类
public class Dog extends Animal{
public void get(){
System.out.println("子类吃饭");
}
}
创建一个测试类,调用get方法
public static void main(String[] args) {
//抽象类与普通类之间
Animal an=new Dog();
an.get();//子类吃饭
}
总结,跟普通类多态调用特点一样,调用方法时,调用的是子类的方法
(1-3接口间多态)
创建一个smok接口
public interface Smoking {
}
创建一个worker类,实现smok接口
public class Woker implements Smoking{
}
创建一个接口多态
Smoking s=new Woker();
(2)instanceof 关键字
用于判断某个对象是否属于某个数据类型
格式 :boolean b = 对象 instanceof 数据类型;
返回值是布尔类型
(3)多态-转型
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。
格式:子类类型 变量名 = (子类类型) 父类类型的变量;
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:父类类型 变量名 = new 子类类型();
向下转型的前提是要在向上转型以后才能 转型,如果直接创建父类对象,无法向下转型
例:这里以上述创建的person类和student类为基础
创建一个测试类
public static void main(String[] args) {
Person p=new Student();
System.out.println(p instanceof Student);
System.out.println(p instanceof Person);
System.out.println(p instanceof Teacher);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Student();
//向下转型
if(p instanceof Seacher){
Student stu=(Student)p;
System.out.println(stu.a);//10
System.out.println(stu.b);//2
System.out.println(stu.c);//30
stu.eat();
stu.sleep();
stu.play();
}
}
向下转型以后,所有调用都回到正轨

浙公网安备 33010602011771号