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的错误。
在开发中一定要记住一点:
【一个类永远不要去继承一个已经实现好的类,只能继承抽象类或者实现接口。】
相关文章推荐
- Java学习笔记(二十六):String.split()的使用
- JAVA学习笔记二:类的继承、多态性
- Java学习笔记---16.面向对象编程11-Java多态性,instanceof及Object类
- Java学习笔记二十六:Java多态中的引用类型转换
- 黑马程序员java学习笔记之二(java中的多态性)
- JAVA学习笔记(二十六) - 文件操作
- Java学习笔记——多态性Polymorphism
- 【Java学习笔记】29:再谈多态性
- Java学习笔记(二十六):字符串连接用+和StringBuilder的append的区别
- java 从零开始,学习笔记之基础入门<jsp>(二十六)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<jsp>(二十六)
- Java学习笔记-多态性
- 【Java学习笔记之二十四】对Java多态性的一点理解
- 【Java学习笔记之二十四】对Java多态性的一点理解
- 【学习笔记】Thinking in java (第三版)第七章 多态性(Polymorphism)
- Java 学习笔记(0x0B) 动态绑定与多态性
- [学习笔记]Java多态性
- Java基础学习笔记二十六 JDBC
- java学习笔记(二十六)java中的io流
- Java学习笔记:类在继承中的多态性