您的位置:首页 > 职场人生

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

2013-08-31 10:18 99 查看
----------------------ASP.Net+Android+IOS开发----------------------期待与您交流!
 
 
面向对象4

多态


多态 - 扩展性


多态 – 转型


多态中成员的特点


Object类 – equals()


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
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员