java中的多态

java中的多态是指:父类的引用指向子类的对象,可以是代码更加方便简洁灵活

举个例子:

package com.qfedu.b_duotai;

public class Demo1 {
	public static void main(String[] args) {
		//父类的引用指向子类的对象
		Father father = new Son();
		father.eat();
		//当父类的引用指向子类的对象的时候
		//父类不能调用子类独有的方法
		//如果子类重写父类的方法,调用的是子类的方法
		//father.driver();
		//Daughter daughter = new Daughter();
		test(new Daughter());
		
		test(new Son());
		
		test(new Son1());
		
	}
	//如果写一个方法的参数的话,尽可能的写父类的对象
	//具有很强的扩展性
	public static void test (Father father) {
		father.eat();
	}
//	public static void test (Son son) {
//		son.eat();
//	}
//	public static void test (Daughter daughter) {
//		daughter.eat();
//	}
//	public static void test (Son1 son1) {
//		son1.eat();
//	}

}
package com.qfedu.c_duotailainxi;

public class Person {
	
//	public void feed (Dog dog) {
//		dog.eat();
//	}
//	public void feed (Cat cat) {
//		cat.eat();
//	}
	//方法的形参传的是一个父类的对象
	//调用方法的时候可以传子类的对象
	//形参 (父类)= 实参(子类)
	//父类的引用指向子类的对象
	public void feed (Pet  pet) {
		pet.eat();
	}

}

向上转型和向下转型

父与子对象之间的转换可以分为向上转型和向下转型

向上转型:通过子类对象(小范围的)去实例化父类对象(大范围)。自动转换

java多态的核心思想:【父类的引用指向子类的对象】

向下转型:通过父类的对象(大范围)转为子类的对象(小范围)。强制类型转换

例子:向上转型

package com.qfedu.d_zhuanxing;
class A {
	public void test () {
		System.out.println("test:A");
	}
}
class B extends A {
	@Override
	public void test() {
		// TODO Auto-generated method stub
		System.out.println("test:B");
	}
}

public class Demo1 {
	public static void main(String[] args) {
		//向上转型  过子类对象(小范围的)去实例化父类对象(大范围)。自动转换
		//把子类真实的值赋值给父类的引用
		//父类  子类对象 = new 子类()  无需强转 默认的一种写法
		A a = new B();
		//子类  子类对象 =  (子类)new  父类();  强转
		B b = (B) new A();
	}

}

例子:向下转型

package com.qfedu.d_zhuanxing;

class A1 {
	public void test1 () {
		System.out.println("test:A1");
	}
}
class B1 extends A1 {
	@Override
	public void test1() {
		// TODO Auto-generated method stub
		System.out.println("test:B1");
	}
}
public class Demo2 {
	public static void main(String[] args) {
		//向下转型  子类 子类对象 = new  父类(); 
		//B1 b1 = (B1)new A1();//报错了
		//解决方案
		A1 a1 = new B1();//向上转型
		func(a1);
	}
	public static void func (A1 a1) {
		if  (a1 instanceof B1) {
			B1 b1 = (B1)a1;//向下转型
			b1.test1();
		} else {
			System.out.println("xixida");
		}
	}
}

instanceof

作用:测试左边的对象是否是右边类的实例

语法格式:

对象  instnaceof 类    返回值是布尔类型数据

例子:

package com.qfedu.d_zhuanxing;

interface A2 {
	
}
class B2 implements A2 {
	
}
class C2 extends B2 {
	
}
public class Demo3 {
  public static void main(String[] args) {
	A2  a2 = new B2();//父类的引用指向子类的对象(小转 大)
	//测试左边的对象是否是右边类的实例
	boolean ret = a2 instanceof B2;
	System.out.println(ret);//true
	
	// a2这个对象的是接口A2实例对象的引用
	boolean ret1 = a2 instanceof A2;
	System.out.println(ret1);//true
	
	B2 b2 = new B2();
	//你的叔叔长得像你爷爷
	boolean ret2 = b2 instanceof A2;
	System.out.println(ret2);
	//你的叔叔长的像你  大忌
	//总结:左边的那个对象  一定是 instanceof  右边的那个类的子孙类
	//C2 c2 = (C2)new B2();
	boolean ret3 = b2 instanceof C2;//能不能将b2转为C2的实例吗?不能  爹转儿子  要强转
	System.out.println(ret3);//false
	B2 b3 = new C2();//向上转型
	boolean ret4 = b3 instanceof A2;// A2 b3 = new C2();
	System.out.println(ret4);
	boolean ret5 = b3 instanceof B2;// B2 b3 = new C2();
	System.out.println(ret5);
	
	boolean ret6 = b3 instanceof C2;//C2 c2 = new C2();
	System.out.println(ret6);
 }
}

上一篇:Linux 安装tomcat


下一篇:nginx负载均衡算法和集群配置