黑马程序员————面向对象4(day8)

----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!

 

 

面向对象4

l  多态

l  多态 - 扩展性

l  多态转型

l  多态中成员的特点

l  Object – equals()

l  Object – to String()

 

 

多态

什么是多态性?还记得重载的概念吗?重载的最终效果就是调用同一个方法名称,却可以根据传入参数的不同而得到不同的结果,这就是多态性的一种体现。

多态:可以理解为事物存在的多种体现形态。例:人:男人,女人。动物:猫,狗。

比如:动物 x = new();

 

1.      多态的体现:

父类的引用指向了自己的子类对象。

父类的引用也可以接受自己的子类对象。

2.      多态的前提:

必须是类与类之间有关系,要么继承,要么实现。

通常还有一个前提:存在覆盖。

3.      多态的好处:

多态的出现大大的提高程序的扩展性。

4.      多态的弊端:

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5.      多态的应用:

6.      多态的出现代码中的特点(多态使用的注意事项)

 

 

多态 -扩展性

例:

abstract class Animal{
	abstract void eat();
}

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

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

class Pig extends Animal{
	public void eat(){
		System.out.println("吃饲料");
	}
}

class AnimalDemo{
	public static void main(String[] args){
		function(new Cat());
		function(new Dog());
		function(new Pig());
	}
	
	//Animal a = new Cat();
	public static void function(Animal a){
		a.eat();
	}
}


 

多态转型

abstract class Animal{
	abstract 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.println("吃骨头");
	}
}

class Pig extends Animal{
	public void eat(){
		System.out.println("吃饲料");
	}
}

class AnimalDemo{
	public static void main(String[] args){
		//类型提升:向上转型
		Animal a = new Cat();
		a.eat();
		
		//如果想要调用猫的特有方法时,如何操作?
		//墙纸将父类的引用,转成子类类型:向下转型
		Cat c = (Cat)a;
		c.catchMouse();
	}
	
	//Animal a = new Cat();
	public static void function(Animal a){
		a.eat();
	}
}


 

注意:不能将父类对象转成子类类型:Animal a = new Animal();

Cat c = (Cat)a;

我们能转换的是父类引用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变化。

父类引用a    子类对象

Animal a = new Cat();

 

 

多态中成员的特点

class Fu{
	void method1(){
		System.out.println("fu 1");
	}
	
	void method2(){
		System.out.println("fu 2");
	}
}

class Zi extends Fu{
	void method1(){
		System.out.println("zi 1");
	}
	
	void method3(){
		System.out.println("zi 3");
	}
}

class DuoTaiDemo{
	public static void main(String[] args){
		Fu f = new Zi();
		f.method1();
		f.method2();
		//f.method3();
	}
}


 

在多态中成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,反之编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边(引用型变量所属的类),运行看右边(子类)。

在多态中,静态成员函数的特点:

无论编译和运行,都参考左边(引用型变量所属的类)

 

 

 

 

在多态中,成员变量的特点:

无论编译和运行,都参考左边(引用型变量所属的类)。

 

 

Object – equals()

Java中有一个比较特殊的类,就是Object类,它是所有类的父类。如果一个类没有使用extends关键字明确表示继承另一个类,那么这个类就默认继承Object类。因此Object类是Java类层中的最高层类,是所有类的超类。换句话说,Java中任何一个类都是它的子类。由于所有的类都是由Object类衍生出来的,所以Object类中的方法适用于所有类。

 

class Demo{
	private int num;
	Demo(int num){
		this.num = num;
	}
	
	//覆写了Object类中的equals()方法。
	public boolean equals(Object obj){//Object obj = new Demo();
		//判断obj对象是否是Demo类的实例,如果不是
		if(!(obj instanceof Demo))
			return false;
		Demo d = (Demo)obj;
		
		return this.num == d.num;
	}
}

class Person{
	
}

class ObjectDemo{
	public static void main(String[] args){
		Demo d1 = new Demo(1);
		Demo d2 = new Demo(2);
		Person p = new Person();
		System.out.println(d1.equals(d2));
	}


 

运行结果为:false

对象的比较:

有两种方式可以用于对象间的比较,即“==”运算符和equals()方法。“==”运算符用于比较两个对象的内存地址值是否相等,equals()方法用于比较两个对象的内容是否一致。

 

 

Object – to String()

public StringtoString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

返回:该对象的字符串表示形式。

 

 

 

 

----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!

详情请查看:http://edu.csdn.net

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值