Java中的多态概念

Java中存在多态的前提条件

  • 要有继承关系
  • 要有方法重写
  • 要有父类引用指向子类对象

多态中的成员访问特点

  1. 成员变量:编译看左边(父类),运行看左边(父类)
  2. 成员方法:编译看左边(父类) ,运行看右边(子类)
  3. 静态方法:编译看左边(父类) ,运行看左边(父类)

总结:只有非静态的成员方法,编译看左边,运行看右边

成员变量:

public class Tset01 {
	
	public static void main(String[] args) {
		/*
		 * 多态中的成员变量
		 * 编译看左边,运行也看左边,与子类无关
		 */
		Father f1 = new Son();
		System.out.println(f1.num);
		
		Son f2 = new Son();
		System.out.println(f2.num);
		
	}
}

class Father{
	int num = 10;
}

class Son extends Father{
	int num = 20;
}

========================================
输出:
10
20

成员方法:

public class Tset01 {
	
	public static void main(String[] args) {
		/*
		 * 多态中的成员方法特点:
		 * 编译看左边,运行也看右边,与子类无关
		 * 此方法调用时,父类中一定要有say()方法,不然编译找不到
		 */
		Father f1 = new Son();
		f1.say();
		
	}
}

class Father{
	int num = 10;
	public void say() {
		System.out.println("fffffff");
	}
}

class Son extends Father{
	int num = 20;
	public void say() {
		System.out.println("sssssss");
	}
}

========================================
输出:
sssssss

静态方法

public class Tset01 {
	
	public static void main(String[] args) {
		/*
		 * 多态中的静态方法特点:
		 * 编译看左边,运行也看左边,与子类无关
		 * 虽然是通过对象来调用方法,其实内部还是通过类名来调用方法 Father.class()
		 */
		Father f1 = new Son();
		f1.say();
		
	}
}

class Father{
	int num = 10;
	public static void say() {
		System.out.println("fffffff");
	}
}

class Son extends Father{
	int num = 20;
	public static void say() {
		System.out.println("sssssss");
	}
}

========================================
输出:
fffffff

多态中向上转型和向下转型

  • 向上转型:父类指向子类对象 Father f = new Son();

  • 向下转型:子类指向父类对象 Son s = (Son)f;

  • 向下转型,也就是子类指向父类时要注意:
    父类的真实指向的对象必须是子类对象,否则会有问题

//向下转型
Father f = new Son();//父类真实指向的是子类对象
Son s = (Son)f;

//错误的向下转型
Father f1 = new Father();//父类指向父类对象,向下转会有问题
Son s = (Son)f;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值