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();
		}
		

	}        

  向下转型以后,所有调用都回到正轨

posted @ 2021-01-22 11:55  公雪  阅读(102)  评论(0编辑  收藏  举报