Java是属于面向对象编程的语言,面向对象的三大特征,封装,继承,多态。其中,多态性是建立在继承关系上的。

多态用一句话概括就是:父类引用指向子类对象

实现多态的几种方式:

现在有两个类,Animal类和Cat类,其中Cat继承Animal。

1、直接用父类型变量接收子类对象

Animal ac = new Cat();

2、参数多态

方法参数类型是父类型,但传入子类对象,构成多态

Cat c1 = new Cat();
	m1(c1);

	public static void m1(Animal a){}

3、返回值多态

用父类型变量接收返回的子类对象,形成多态。

Animal a2 = m2();
	
	public static Animal m2(){
		return new Cat();//返回猫类型
	}

多态之属性调用 :

我们先创建两个类,Fu和Zi,其中Zi继承Fu。

父类有两个成员变量和一个成员方法。

public class Fu {
	int fu = 1;
	int a = 5;
	void m(){
		System.out.println("父类方法");
	}
}

子类中创建两个变量和两个方法
注意:a 变量和 m()方法父类也有

public class Zi extends Fu{
	int zi = 9;
	int a = 7;
	void m(){
		System.out.println("子类方法");
	}
	void unique(){
		System.out.println("子类特有");
	}
}

用父类型变量接收子类对象,进行测试:

public class Test {
	public static void main(String[] args) {
		Fu fu = new Zi();
		System.out.println(fu.a);
		fu.m();
		//fu.unique();
	}
}

结果:

java多态实现方式 java中实现多态的方式_子类


发现,m()是子类和父类都有的,子类重写了父类的方法。父类引用调用了子类的这个方法,因为unique()方法是子类特有方法,父类没有,不能调用。a 变量调用的也是父类中的。

给出总结:

  • 1 如果调用的是父类没有的,直接报错,都访问不了
  • 2 如果调用的是子类没有的,都访问父类的
  • 3 如果调用的是父类和子类都有的,除了成员方法调用子类,其他的都调用父类,因为成员方法可以覆写