黑马程序员 笔记(八)——面向对象(多态、Object)

------- android培训java培训、期待与您交流! ----------

多态

      多态字面上的意思就是多种形态。在面向对象语言中,我们可以将函数的形参定义为一个父类类型,而在真正调用该函数时这个父类类型的所有子类对象都可以传入,根据传入的子类对象不同函数可以运行处多种形态。

  1. 定义:某一类中事物的多种形态。
    • 例:动物中的狗。狗这个对象对应的是类型是狗类型。 猫 a = new 猫();同时猫也属于动物类,所以说 动物 b = new 毛();也是正确的。
  2. 多态的体现:
    • 父类的引用指向了自己的子类对象。(父类的引用也可以接收自己的子类对象)
  3. 多态的前提
    • 必须是类与类之间有关系,要么继承,要么实现。
    • 存在覆盖,子类覆盖父类的功能。
  4. 多态的好处
    • 多态的出现大大的提高了程序的扩展性。
  5. 多态的弊端:
    • 虽然提高了扩展性,但是只能使用父类的应用访问父类中定义好的方法。
  6. 多态的类型转换:判断所属类型的关键字instanceof
    1. 类型提升(向上转型):如 Animal a = new Cat(); 把猫的类型提升成了动物。此时a能调用的方法只能是在Animal中定义或声明的方法。如果a想调用猫的特有方法,就必须先把猫向下转型。
    2. 向下转型:强制将父类的引用转化成原本的子类类型。以Animal a = new Cat()为例,将a转换成猫类型,Cat b=(Cat)a.。现在则就可以用b去调用Cat的 特有功能。
  7. 多态使用的注意事项:
  8. 多态中成员特点:
    • 函数的特点:
      1. 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
      2. 在运行时期:参阅对象所属的类中是否有调用的方法。
      3. 简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
    • 成员变量的特点;
      1. 无论编译和运行,都参考左边(引用型变量所属的类)
    • 静态成员函数的特点:
      1. 无论编译和运行,都参考做左边。
  9. 多态的应用:(电脑PCI接口)
    • 需求:电脑运行实例,电脑运行基于主板。
    • 代码:
      interface PCI	//定义PCI接口
      {
      	public void open();
      	public void close();
      }
      
      class MainBoard	//定义主板,主板中有使用PCI的方法
      {
      	public void run()
      	{
      		System.out.println("mainboard run ");
      	}
      	public void usePCI(PCI p)//使用PCI的方法
      	{
      		if(p!=null)
      		{
      			p.open();
      			p.close();
      			
      		}
      	}
      }
      
      
      class NetCard implements PCI	//定义网卡实现PCI接口,以便被主板调用
      {
      	public void open()
      	{
      		System.out.println("netcard open");
      	}
      	public void close()
      	{
      		System.out.println("netcard close");
      	}
      	
      }
      class SoundCard implements PCI	//定义声卡实现PCI接口,以便被主板调用
      {
      	public void open()
      	{
      		System.out.println("SoundCard open");
      	}
      	public void close()
      	{
      		System.out.println("SoundCard close");
      	}
      }
      
      class DuoTaiDemo5 //主函数
      {
      	public static void main(String[] args) 
      	{
      		MainBoard mb = new MainBoard();	//电脑运行过程。
      		mb.run();
      		mb.usePCI(null);
      		mb.usePCI(new NetCard());
      		mb.usePCI(new SoundCard());
      		
      	}
      }
      

Object类

            Object:超类,是所有类的父类。在该类中定义的功能是所有类所具备的基本功能。所有的类(除了Object类),都是该类的子类,即使不书写继承,系统也会自动继承该类,所以Object是整个Java语言继承树的唯一一个根

  1. equals方法:
    • JAVA中认为所有的对象都具有比较性,都能判断是否是同一个对象。
    • 其实比较的是内存地址值。(堆内的地址)
    • 方法使用:boolean equals(Object b),说明可以接收任何类型的对象。
    • Object类中已经提供了对对象是否相同的方法,如果自定义类中也有比较的功能,没有必要重新定义,只需要复写equals方法就好了。
  2. equals的使用:
    •  使用Object中定义的方法不进行复写。
      • class Person	//定义Person类
        {
        	private String name;
        	Person(String name)
        	{
        		this.name = name;
        	}
        }
        class EqualsDemo1
        {
        	public static void main(String[] args) 
        	{
        		Person p = new Person("Li,Si");
        		Person q = new Person("Zhang,San");
        		Person d = p;
        		System.out.println(p.equals(d));//将上面的三个对象进行比较,看是否是同一个对象
        		System.out.println(p.equals(q));
        	}
        }


    • 将原有方法复写,建立自己比较方式。在Object类中方法的实现比较简单,如果真正需要在项目中进行比较时,这个equals方法的作用是无法达到实际的要求的。所以如果在项目中涉及的类需要比较该类型的对象时,则必须覆盖equals方法。
      • class Demo
        {
        	private int num;
        	Demo(int num)
        	{
        		this.num = num;
        	}
        	public boolean equals(Object b)	//复写原来的比较方式,
        	{
        		if (b instanceof Demo)	//判断是否属于该类,增加程序的健壮性
        		{
        			Demo d = (Demo) b;
        			return this.num == d.num;
        		}
        		return false;
        	}
        }
        class EqualsDemo 
        {
        	public static void main(String[] args) 
        	{
        		Demo a = new Demo(5);
        		Demo b = new Demo(5);
        
        		System.out.println(a.equals(b));
        	}
        }


  3. toString方法:
    • 在JAVA中所有的对象都可以被打印输出。toString方法是显示对象内容时会被系统自动调用的方法,当输出一个对象的内容时,系统会自动调用该类的toString方法。
    • toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值