Java基础知识回顾之多态性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18948359/article/details/83868934

Java基础知识回顾之封装性
Java基础知识回顾之继承性
Java基础知识回顾之多态性

简介

多态的核心就是类型的一致性。对象上的每一个引用和静态的类型检查器都要确认这样的依附(多个子类继承一个父类)。

多态性严格来讲有两种描述形式

  • 方法的多态性

    • 方法的重载:同一个方法名称,会根据传入参数的类型以及个数不同执行不同的方法体。
    • 方法的覆写:同一个方法,会根据子类的不同实现,实现不同的功能。
  • 对象的多态性:指的是发生在继承关系类之中,子类和父类之间的转换问题。

    • 向上转型(自动完成):父类 父类对象 = 子类实例;
    • 向下转型(强制转换): 子类 子类对象 = (子类)父类实例;

实例说明

向上转型

class A{
	public void print() {
		System.out.println("A、public void print()");
	}
}

class B extends A{
	@Override
	public void print() {
		System.out.println("B、public void print()");
	}
}

public class TestDemo {
	
	public static void main(String[] args) {
	    //  使用向上转型
		A a = new B();
		a.print();		// 输出结果: B、public void print()
	}
}

向下转型

public class TestDemo {
	
	public static void main(String[] args) {
		//  使用向上转型
		A a = new B();
		a.print();		// 输出结果: B、public void print()
		
		// 向下转型,强制转换
		B b = (B) a;	// 输出结果: B、public void print()
	}
}

说明

向上转型:由于所有的子类对象实例都可以自动的向上转型,所以在于参数的统一上。即:同一个方法针对于不同的子类可以有不同的实现。

class A{
	public void print() {
		System.out.println("A、public void print()");
	}
}

class B extends A{
	@Override
	public void print() {
		System.out.println("B、public void print()");
	}
}

class C extends A{
	@Override
	public void print() {
		System.out.println("C、public void print()");
	}
}

public class TestDemo {
	
	public static void main(String[] args) {
		// 只要是A类的子类都可以使用向上转型,由A类接收
		// 同一个方法针对于不同的子类可以有不同的实现
		A a1 = new B();
		A a2 = new B();
		a1.print();		// 输出结果: B、public void print()
		a2.print();		// 输出结果: C、public void print()		
	}
}

向下转型:指的是父类要调用子类自己特殊的方法;所有的父类只能调用到在父类中定义了的信息,对于子类扩充的方法,是调用不到的,对于这个情况,就需要向下转型,获取子类的特殊方法。

class A{
	public void print() {
		System.out.println("A、public void print()");
	}
}

class B extends A{
	@Override
	public void print() {
		System.out.println("B、public void print()");
	}
	
	public void funB() {
		System.out.println("B 中扩充的方法");
	}
}

public class TestDemo {
	
	public static void main(String[] args) {
		// 通过向上转型获取到 A 对象
		A a = new B();	
		
		//  a.funB(); 此时这段是会报错的,因为 a 类中没有 funB方法。
		// 如果需要调用,就需要使用向下转型
		B b = (B) a;
		b.funB();	// 此时就可以调用 funB方法
	}
}

猜你喜欢

转载自blog.csdn.net/qq_18948359/article/details/83868934
今日推荐