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(); } }
向下转型以后,所有调用都回到正轨