Java day8 多态 object类 2019.7.17

  • 多态
  • 多态-转型
  • 多态-实例
  • 多态中成员的特点
  • object类-equals
  • object类-taString

多态

/*
多态:可以理解为事物存在的多种体现形态

1.多态的体现
父类的引用指向了自己子类的对象
父类的引用也可以接受子类的对象

2.多态的前提
必须是类与类之间有关系,继承或者实现
通常还有一个前提:存在覆盖

3.多态的好处
大大的提高了程序的拓展性

4.多态的应用


5.多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员
*/


abstract class Animal
{
	abstract public void eat();
}


class Cat extends Animal
{
	public void eat()
	{
		System.out.print("吃鱼");
	}
}

class Dog extends Animal
{
	public void eat()
	{
		System.out.print("吃骨头");
	}
}

class  DuoTai
{
	public static void main(String[] args) 
	{
		//Animal c=new Cat();//向上转型
		//c.eat();
		function(new Cat());
	}

	public static void function(Animal a)//如此只做不需要单独创建出一个符合对象的函数,可共用
	{
		a.eat();
	}
}

多态-转型

/*
多态:可以理解为事物存在的多种体现形态


*/


abstract class Animal
{
	abstract public void eat();
}


class Cat extends Animal
{
	public void eat()
	{
		System.out.println("吃鱼");
	}

	public void catchMouse()
	{
		System.out.println("抓老鼠");
	}
}

class Dog extends Animal
{
	public void eat()
	{
		System.out.print("吃骨头");
	}

	public void guide()
	{
		System.out.println("看家");
	}
}

class  DuoTai2
{
	public static void main(String[] args) 
	{

		/*Animal c=new Cat();//向上转型(把猫升级成父类动物)
		c.eat();
		Cat a=(Cat)c;//向下转型(把父类动物降级成子类猫)
		a.catchMouse();*/

		//千万不要出现这样的操作,就是将父类对象转成子类类型
		//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换
		//多态自始自终都是子类对象在做着变化

		//Animal b=new Animal();//其实abstract类也不可以建立对象
		//Cat d=(Cat)b;

		function(new Dog());
	}

	public static void function(Animal a)//如此只做不需要单独创建出一个符合对象的函数,可共用
	{
		if(a instanceof Cat)//但是一般不使用instancesof,因为扩展性极差。当类有限时可以使用
		{
			Cat c=(Cat)a;
			c.eat();
			c.catchMouse();
		}
		else
		{
			Dog c=(Dog)a;
			c.guide();
			c.eat();
		}
	}
 
}

多态-实例

/*
以前时指挥一个对象,多态的出现是指挥一群对象
*/

abstract class Stu
{
	public abstract void study();
	public void sleep()
	{
		System.out.println("SLEEP");
	}
}

class BaseStu extends Stu
{
	public void study()
	{
		System.out.println("base study");
	}
	public void sleep()
	{
		System.out.println("趴着睡");
	}
}

class AdvStu extends Stu
{
	public void study()
	{
		System.out.println("adv study");
	}
	public void sleep()
	{
		System.out.println("站着睡");
	}
}

class DoSome
{
	public void work(Stu a)
	{
		a.sleep();
		a.study();
	}
}

class  DuoTai3
{
	public static void main(String[] args) 
	{
		DoSome a=new DoSome();
		a.work(new BaseStu());
	}

}

多态中的成员特点

class Fu
{
	int num=5;
	public void method1()
	{
		System.out.println("fu1");
	}

	public void method2()
	{
		System.out.println("fu2");
	}

	public static void method4()
	{
		System.out.println("fu4");
	}
}

class Zi extends Fu
{
	int num=4;
	public void method1()
	{
		System.out.println("zi1");
	}

	public void method3()
	{
		System.out.println("zi3");
	}

	public static void method4()
	{
		System.out.println("zi4");
	}
}



class DuoTai4 
{
	public static void main(String[] args) 
	{
		Fu a=new Zi();//父类引用指向子类对象
		
		System.out.println(a.num);

		a.method1();
		a.method2();
		a.method4();
		//a.method3();

		/*
		在多态中成员函数(非静态)的特点:
		在编译时期:参阅引用变量所属的类中是否有调用的方法,有就编译通过
		在运行时期:参阅对象所属的类中是否有调用的方法
		
		简单说,编译时候参照FU,里面没有method3,所以编译失败
		运行时才会有

		在多态中成员变量和静态方法的特点:编译和运行都参照左边(引用型变量)
		*/
	}
}

object类-equals

/*
Object:是所有对象的直接或间接父类,传说中的上帝
该类中定义的肯定是所有对象都具备的功能


Object类中已经提供了对对象是否相同的比较方法

如果自定义类中也有比较相同的功能,没有必要重新定义
只要沿袭父类中的功能,建立自己特有的内容即可,这就是覆盖
*/


class Demo
{
	int num;
    Demo(int num)
	{
		this.num=num;
	}

	public boolean  equals(Object obj)//直接复写
	{
		Demo a=(Demo)obj;
		return this.num==a.num;
	}
}


class ObjectDemo 
{
	public static void main(String[] args) 
	{
		/*Demo p1=new Demo();
		Demo p2=new Demo();
		Demo p3=p1;
		System.out.println(p1.equals(p3));//第一种方法:object,是比较两个对象地址的
		System.out.println(p1==p2);
		System.out.println(p1==p3);*/

		Demo a=new Demo(3);
		Demo b=new Demo(4);
		System.out.println(a.equals(b));
		
	}
}

object类-toString

/*
Object:是所有对象的直接或间接父类,传说中的上帝
该类中定义的肯定是所有对象都具备的功能


Object类中已经提供了对对象是否相同的比较方法

如果自定义类中也有比较相同的功能,没有必要重新定义
只要沿袭父类中的功能,建立自己特有的内容即可,这就是覆盖
*/


class Demo
{
	int num;
    Demo(int num)
	{
		this.num=num;
	}

	public boolean  equals(Object obj)//直接复写
	{
		Demo a=(Demo)obj;
		return this.num==a.num;
	}
}


class ObjectDemo2
{
	public static void main(String[] args) 
	{
	

		Demo a=new Demo(3);

		Class c=a.getClass();//得到Class文件,注意是大写的Class
		System.out.println(c.getName());//getName()方法必须是Class文件才能调用
		System.out.println(a.toString());//Demo@2a84aee7 @后面的是十六进制的哈希值
		System.out.println(Integer.toHexString(a.hashCode()));//2a84aee7
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值