黑马程序员————面向对象4(day8)
2013-08-31 10:18
99 查看
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!
面向对象4
l
多态
l
多态 - 扩展性
l
多态 – 转型
l
多态中成员的特点
l
Object类 – equals()
l
Object类 – to String()
多态
什么是多态性?还记得重载的概念吗?重载的最终效果就是调用同一个方法名称,却可以根据传入参数的不同而得到不同的结果,这就是多态性的一种体现。
多态:可以理解为事物存在的多种体现形态。例:人:男人,女人。动物:猫,狗。
比如:动物 x = new猫();
1. 多态的体现:
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。
2. 多态的前提:
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提:存在覆盖。
3. 多态的好处:
多态的出现大大的提高程序的扩展性。
4. 多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5. 多态的应用:
6. 多态的出现代码中的特点(多态使用的注意事项)
多态 -扩展性
例:
多态 –转型
注意:不能将父类对象转成子类类型:Animal a = new Animal();
Cat c = (Cat)a;
我们能转换的是父类引用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变化。
父类引用a 子类对象
Animal a = new Cat();
多态中成员的特点
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,反之编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边(引用型变量所属的类),运行看右边(子类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
Object类 – equals()
Java中有一个比较特殊的类,就是Object类,它是所有类的父类。如果一个类没有使用extends关键字明确表示继承另一个类,那么这个类就默认继承Object类。因此Object类是Java类层中的最高层类,是所有类的超类。换句话说,Java中任何一个类都是它的子类。由于所有的类都是由Object类衍生出来的,所以Object类中的方法适用于所有类。
运行结果为: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
面向对象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
相关文章推荐
- 黑马程序员————面向对象(day8)
- 黑马程序员————学习日记【7】 【Java面向对象3】
- 黑马程序员——Java面向对象-整理笔记
- 黑马程序员 06 Java基础教学 - 06 - 面向对象(2) 之 关于静态static的那些事
- 黑马程序员——Java基础—面向对象(一)
- 黑马程序员——Java基础—面向对象(四)
- 黑马程序员-java基础之面向对象,封装
- 黑马程序员-------面向对象
- 黑马程序员_Java学习日记第二天--面向对象
- 黑马程序员--Java面向对象——集合框架(Collection)
- 黑马程序员——面向对象、多态
- 黑马程序员--Java面向对象——IO流(字节流读取流)
- 黑马程序员——面向对象<四> 笔记第六篇
- 黑马程序员——面向对象(二)
- 黑马程序员------面向对象的学习(三)
- [黑马程序员](第6-9天)面向对象(上)
- 黑马程序员———面向对象
- 黑马程序员——05Java面向对象1
- 黑马程序员-面向对象三大原则——封装、继承、多态
- 黑马程序员-- .Net学习日记——c#面向对象-方法