java 的多态性

前面的文章提到  重写时子类中方法的修饰符的权限不能大于父类的权限

这里重要写多态

public class DuotaiChild extends DuotaiParent{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		new DuotaiChild().dI();
		DuotaiParent dp=new DuotaiParent();
		dp.dI();
	}
	public void dI()
	{
		System.out.println("child");
	}
	public void dI2()
	{
		System.out.println("child--di2");
	}

}

public class DuotaiParent {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		DuotaiParent dp=new DuotaiChild();
		dp.dI();
	}
	public void dI()
	{
		System.out.println("parent");
		
		
		dI2();
	}
	 void dI2()
	{
		System.out.println("di2--parent");
	}

}

虽然是在Parent类中
DuotaiParent dp=new DuotaiChild();
太还是调用了子类的函数DI()
字节码中是这样写的
DuotaiChild duotaichild = new DuotaiChild();
这就是动态绑定.....
如果这是把Parent中的dI方法改为private的!那么会怎么执行呢??
parent
di2--parent

会执行本身类中的方法
这里也就有这样的定论
当执行的同名函数 自身的函数时private时,执行自身的这个函数!因为权限大!即使是private而子类中不会执行这个方法除非是通过执行父类中其他方法但在其中调用这个方法时才是执行父类的方法!
import newToday.DuotaiParent;

public class DuotaiChild extends DuotaiParent{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//new DuotaiChild().dI();
		DuotaiParent dp=new DuotaiChild();
		//dp.dI();
	}
	public void dI()
	{
		System.out.println("child");
		//dI2();
	}
	public void dI2()
	{
		System.out.println("child--di2");
	}

}

public class DuotaiParent {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

			}
	
	 private void dI2()
	{
		System.out.println("di2--parent");
	}
	 public DuotaiParent()
	 {
          System.out.println("child--public");
          dI2();
	 }

}


运行child类
打印
public--parent
di2--parent
child--ublic


把Parent中的dI2给为public试试  有什么区别
打印
public--parent
child--di2
child--ublic

看出区别了吗??

public class DuotaiChild extends DuotaiParent
{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		new DuotaiChild().dI();
		DuotaiParent dp=new DuotaiChild();
		
		//dp.dI();这里报错 得出是调用的是parent中的dI私有方法---这时看前面的引用类型!
		//如果有私有方法会调用私有方法!!前提条件是可见的条件下!!
		//且要记住 父类的权限一定会大于子类的!不会出现 子类是private 而父类是public的!
	}
	public void dI()
	{
		//super.dI();
		System.out.println("child");
	}
	public void dI2()
	{
		System.out.println("child--di2");
	}
	public DuotaiChild()
	{//System.out.println("child--public");
		
	}

}

public class DuotaiParent {

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub

	DuotaiParent dp=new DuotaiChild();
	dp.dI();//这里调用的就是 前面引用的 方法 因为是私有的!!但调用的di2和构造函数中调用的dI2()确实调用的子类的
	//这里就符合了动态绑定----类似的实现还有 super
	}
	private void dI()
	{
		System.out.println("parent");
		
		dI2();
		//DuotaiChild.di3();
	}
	 public void dI2()
	{
		System.out.println("di2--parent");
	}
	 public DuotaiParent()
	 {
		 //System.out.println("public--parent");
		 dI2();
	 }
	 static
	 {
		 //System.out.println("static--parent");
	 }

}

你可能感兴趣的:(java)