----------------------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