您的位置:首页 > 编程语言 > Java开发

java学习笔记(二十六)多态性

2011-11-03 12:32 381 查看
 


多态性

1.1 方法的重载与覆写  对象的多态性

对象多态性的类型主要有两种

A:向上转型:子类对象-》父类对象

对于向上转型,程序自动完成

格式: 父类 父类对象 = 子类实例;

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 B b = new B();

 A a = b;

 a.print();

 a.fun1();

 }

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

B

B

如果子类没被覆盖,

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print1(){

 System.out.println("B");

 }

 public void say(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 B b = new B();

 A a = b;

 a.print();

 a.fun1();

 }

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

A

A

 

 

B:向下转型: 父类对象-》子类对象

对于向下转型,必须明确的指明要转型的子类类型

子类 子类对象 = (子类)父类实例;

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 A a = new B();

 B b = (B)a;

 b.print();

 b.fun1();

 b.say();

 }

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

B

B

B->say()

在类B中存在三个方法,都可以调用。

但进行对象向下转型时候要注意:

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 A a = new A();//实例化一个父类对象

 B b = (B)a;

 b.print();

 b.fun1();

 b.say();

 }

}

但是结果出现异常:

F:\java>java polDemo01

Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B

        at polDemo01.main(polDemo01.java:23)

提示A不能转到B,以上的异常是第二大出现的异常,此异常出现是在对象转型的时候经常发生的,如果两个没有关系的对象之间发生了转换关系,则肯定出现此异常。

如果要想产生对象的向下转型,则肯定必须产生一个向上转型关系。。

1.2  对象多态性的应用

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say1(){

 System.out.println("B->say()");

 }

};

class C extends A

{

 public void print(){

 System.out.println("C");

 }

 public void say2(){

 System.out.println("C->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 fun(new B());

 fun(new C());

 }

  public static void fun(A a){

  a.print();

  }

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

B

C

如果采用以上的代码实现,不管有多少子类,都可以轻松实现。。

1.3 instanceof关键字

在java中可以使用instanceof关键字判断一个对象到底是那个类的实例。

格式:对象 instanceof 类 ---->返回boolean类型

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say1(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 A a1 = new B();

 System.out.println("A a1 = new B():"+(a1 instanceof A));

 }

 

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

A a1 = new B():true

可以看出a1是A的实例,那么a1是不是B的实例呢?

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say1(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 A a1 = new B();

 System.out.println("A a1 = new B():"+(a1 instanceof A));

 System.out.println("A a1 = new B():"+(a1 instanceof B));

 }

 

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

A a1 = new B():true

A a1 = new B():true

a1也是B的实例

 

1.4 

class A

{

 public void print(){

 System.out.println("A");

 }

 public void fun1(){

 this.print();

 }

};

class B extends A

{

 public void print(){

 System.out.println("B");

 }

 public void say1(){

 System.out.println("B->say()");

 }

};

public class polDemo01

{

 public static void main(String args[]){

 A a1 = new B();

 System.out.println("A a1 = new B():"+(a1 instanceof A));

 System.out.println("A a1 = new B():"+(a1 instanceof B));

 A a2 = new A();

 System.out.println("A a2 = new A():"+(a2 instanceof A));

 System.out.println("A a2 = new A():"+(a2 instanceof B));

 }

 

}

结果:

F:\java>javac polDemo01.java

F:\java>java polDemo01

A a1 = new B():true

A a1 = new B():true

A a2 = new A():true

A a2 = new A():false

在开发中一定要注意,对于向下转型操作最好增加验证,以保证转型时不会发生ClassCastexception的错误。

在开发中一定要记住一点:

【一个类永远不要去继承一个已经实现好的类,只能继承抽象类或者实现接口。】

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: